package com.bizofficer.subscription.registration;



import java.io.FileReader;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
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.SendGridMail;


@Service
public class ResendOtpEmailService{
	
	private static final Logger logger = Logger.getLogger(ResendOtpEmailService.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() );
			logger.info("Token: "+objBean.getToken() );
			
	           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 {

	 	           TypedQuery<SubscriptionOtp> queryOtp = (TypedQuery<SubscriptionOtp>) entityManager.createQuery("from "+SubscriptionOtp.class.getName()+" where otpKey=:token ", SubscriptionOtp.class);
	 	           queryOtp.setParameter("token", objBean.getToken() );
	 	           queryOtp.setFirstResult(0);
	 	           queryOtp.setMaxResults(1);
		           List<?> resultListOtp = queryOtp.getResultList();
		           Iterator<?> iteratorOtp=resultListOtp.iterator();
		           if(iteratorOtp.hasNext()){            			
		        	   SubscriptionOtp myOtp = (SubscriptionOtp)iteratorOtp.next();
		        	   
		        	   logger.info("OTP: "+myOtp.getOtpVal() );
		        	   
	                    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]", String.valueOf(myOtp.getOtpVal()) );
						String messageBody = (String) json.get("message");
						messageBody = messageBody.replace("[OTP]", String.valueOf(myOtp.getOtpVal()) );
						
						logger.info("ResendOtpEmailService: "+String.valueOf(myOtp.getOtpVal()));
						
						logger.info("Mail Status: " + mailObj.send(emailsToArr, null, subject, messageBody));

		        	   
		           }

	        	   responseBeanObj.setResponseTxt("OK");
	           }

            entityManager.getTransaction().commit();
			entityManager.close();
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return responseBeanObj;
	}
	
	
	
	
}
