package com.bizofficer.subscription.registration;



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.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException;
import org.springframework.stereotype.Service;

import com.bizofficer.hibernate.entity.PgprepStudentCourses;
import com.bizofficer.hibernate.entity.PgprepStudentDetails;
import com.bizofficer.hibernate.entity.SubscriptionDefaultCourse;
import com.bizofficer.hibernate.entity.SubscriptionOtp;
import com.bizofficer.hibernate.repository.PgprepStudentCoursesRepository;
import com.bizofficer.hibernate.repository.PgprepStudentDetailsRepository;
import com.bizofficer.hibernate.repository.SubscriptionOtpRepository;
import com.bizofficer.util.system.General;
import com.bizofficer.util.system.MakeDate;


@Service
public class StudentRegNewService{
	
	private static final Logger logger = Logger.getLogger(StudentRegNewService.class);
	
    @Autowired
	EntityManagerFactory entityManagerFactory;
    
    @Autowired
	PgprepStudentDetailsRepository stRepoObj;
    
    @Autowired
    PgprepStudentCoursesRepository pscRepo;
    
	@Autowired
	private SubscriptionOtpRepository subsRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		AaRegBean objBean = (AaRegBean) obj; 	
		RegistrationResponseBean responseBeanObj = new RegistrationResponseBean();
		
		try {
			responseBeanObj.setResponseTxt("failed");
			
			if(objBean.getStudentName()==null) {
				return responseBeanObj;
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();

			logger.info("Otp Key: "+objBean.getToken() );
			logger.info("Otp Number: "+objBean.getOtpNumber() );
			logger.info("Name: "+objBean.getStudentName() );
			logger.info("Email: "+objBean.getEmail() );
			logger.info("Phone: "+objBean.getMobile() );
			
			MakeDate makeDateObj = new MakeDate();
			General gen = new General();
			
			SubscriptionOtp subsOtpObj = subsRepo.findByOtpKeyAndOtpVal(objBean.getToken(),objBean.getOtpNumber());

			if(subsOtpObj.getId()!=null && subsOtpObj.getId()>0) {
				
	           TypedQuery<PgprepStudentDetails> query = (TypedQuery<PgprepStudentDetails>) entityManager.createQuery("from "+PgprepStudentDetails.class.getName()+" where studentId=:emailId OR emailId=:emailId OR phoneNo=:phoneNo ", PgprepStudentDetails.class);
	           query.setParameter("emailId", objBean.getEmail() );
	           query.setParameter("phoneNo", objBean.getMobile() );
	           query.setFirstResult(0);
	           query.setMaxResults(1);
	           List<?> resultListCat = query.getResultList();
	           Iterator<?> iteratorCat=resultListCat.iterator();
	           if(iteratorCat.hasNext()){            			
	        	   PgprepStudentDetails myObj = (PgprepStudentDetails)iteratorCat.next();
	        	   responseBeanObj.setToken(myObj.getLoginKey());

	        	   if(myObj.getLoginKey()==null || myObj.getLoginKey().length()<1) {
	        		   String loginKey = UUID.randomUUID().toString()+UUID.randomUUID().toString();	        		   
	        		   PgprepStudentDetails saveObj = (PgprepStudentDetails)entityManager.find(PgprepStudentDetails.class ,myObj.getId());
 	   				   saveObj.setLoginKey(loginKey);
		   			   entityManager.getTransaction().commit();		   			   
		        	   responseBeanObj.setToken(loginKey);
	        	   }

	        	   responseBeanObj.setResponseTxt("OK");
	           
	           }else {   
	        	   
	        	   	String loginKey = UUID.randomUUID().toString()+UUID.randomUUID().toString();
	        	   
					PgprepStudentDetails saveObj = new PgprepStudentDetails();
					saveObj.setStudentId(objBean.getEmail());
					saveObj.setEmailId(objBean.getEmail());
					saveObj.setSname(objBean.getStudentName());
					saveObj.setPhoneNo(objBean.getMobile());
					saveObj.setRegistrationDate(makeDateObj.getCurrentTimeStamp());
					saveObj.setPassword(gen.getMD5Hashing(objBean.getEmail()));
					saveObj.setAccountStatus(1);
					saveObj.setAccountType("FREE");
					saveObj.setOrganisationId(0);
					saveObj.setLoginKey(loginKey);
					
					PgprepStudentDetails resultObj = stRepoObj.save(saveObj);
					Integer stdId = resultObj.getId();
					
			        TypedQuery<SubscriptionDefaultCourse> querySDC = (TypedQuery<SubscriptionDefaultCourse>) entityManager.createQuery("from "+SubscriptionDefaultCourse.class.getName(), SubscriptionDefaultCourse.class);
			        querySDC.setFirstResult(0);
			        querySDC.setMaxResults(1);
			        List<?> resultListSDC = querySDC.getResultList();
			        Iterator<?> iteratorSDC=resultListSDC.iterator();
			        if(iteratorSDC.hasNext()){            			
			        	SubscriptionDefaultCourse myObj = (SubscriptionDefaultCourse)iteratorSDC.next();
			        	
			        	MakeDate dateObj = new MakeDate();
			        	PgprepStudentCourses saveSCObj = new PgprepStudentCourses();
			        	saveSCObj.setOrganisationId(myObj.getOrganisationId());
			        	saveSCObj.setStudentId(objBean.getEmail());
			        	saveSCObj.setValidTillDate(dateObj.getDateAfterYears(10));
						pscRepo.save(saveSCObj);
						
			        }
			           
					if(stdId!=null && stdId>0) {
						responseBeanObj.setStudentId(objBean.getEmail());
						responseBeanObj.setToken(loginKey);
						responseBeanObj.setResponseTxt("OK");
					}
	           }
	           
			}
                        

            entityManager.getTransaction().commit();
			entityManager.close();
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return responseBeanObj;
	}
	
	
	
	
}
