package com.bizofficer.subscription.registration;



import java.io.FileReader;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.TypedQuery;

import org.apache.log4j.Logger;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException;
import org.springframework.stereotype.Service;

import com.bizofficer.hibernate.entity.PgprepStudentDetails;
import com.bizofficer.hibernate.entity.SubscriptionOtp;
import com.bizofficer.hibernate.repository.PgprepStudentDetailsRepository;
import com.bizofficer.hibernate.repository.SubscriptionOtpRepository;
import com.bizofficer.util.system.General;
import com.bizofficer.util.system.MakeDate;
import com.bizofficer.util.system.SendGridMail;


@Service
public class CheckExistsEmailAddressService{
	
	private static final Logger logger = Logger.getLogger(CheckExistsEmailAddressService.class);
	
    @Autowired
	EntityManagerFactory entityManagerFactory;
    
    @Autowired
	PgprepStudentDetailsRepository stRepoObj;
    
    @Autowired
    SubscriptionOtpRepository subsRepo;
    
	public Object execute(Object obj) throws NotFoundException{
		AaRegBean objBean = (AaRegBean) obj; 	
		RegistrationResponseBean responseBeanObj = new RegistrationResponseBean();
		
		try {
			responseBeanObj.setResponseTxt("failed");
			
			if(objBean.getEmail()==null) {
				return responseBeanObj;
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();

			logger.info("Email: "+objBean.getEmail() );
			
	           TypedQuery<PgprepStudentDetails> query = (TypedQuery<PgprepStudentDetails>) entityManager.createQuery("from "+PgprepStudentDetails.class.getName()+" where emailId=:email ", PgprepStudentDetails.class);
	           query.setParameter("email", objBean.getEmail() );
	           query.setFirstResult(0);
	           query.setMaxResults(1);
	           List<?> resultListCat = query.getResultList();
	           Iterator<?> iteratorCat=resultListCat.iterator();
	           if(iteratorCat.hasNext()){            			

	        	   responseBeanObj.setResponseTxt("EmailExists");
	           
	           }else {

	        	   General gen = new General();
	   			   MakeDate dateObj = new MakeDate();
	        	   
        		   String token = UUID.randomUUID().toString()+UUID.randomUUID().toString();
       		   	   Integer otpNumber =  gen.getRandomNumber(101914, 998765);
                   
                   SubscriptionOtp saveObj = new SubscriptionOtp();
   				   saveObj.setOtpKey(token);
   				   saveObj.setOtpVal(otpNumber);
   				   saveObj.setCreatedDate(dateObj.getCurrentTimeStamp());
   				   subsRepo.save(saveObj);
   				   
                    SendGridMail mailObj = new SendGridMail();				
                    String[] emailsToArr = {objBean.getEmail()};
                   
					URL url = this.getClass().getResource("/verify-email.json");
					String absoluteDiskPath = url.getPath();
					JSONParser jsonParser = new JSONParser();
					FileReader reader = new FileReader(absoluteDiskPath);
					Object objJson = jsonParser.parse(reader);	
					JSONObject json = (JSONObject) objJson;
					String subject = (String) json.get("subject");
					subject = subject.replace("[OTP]", otpNumber.toString() );
					String messageBody = (String) json.get("message");
					messageBody = messageBody.replace("[OTP]", otpNumber.toString() );
					
					logger.info("otpNumber: "+otpNumber);
					
					logger.info("Mail Status: " + mailObj.send(emailsToArr, null, subject, messageBody));
   				   
	        	   
	   			   responseBeanObj.setToken(token);
	        	   responseBeanObj.setResponseTxt("OK");
	           }

            entityManager.getTransaction().commit();
			entityManager.close();
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return responseBeanObj;
	}
	
	
	
	
}
