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.PgprepSchools;
import com.bizofficer.hibernate.entity.PgprepStudentCourses;
import com.bizofficer.hibernate.entity.PgprepStudentDetails;
import com.bizofficer.hibernate.entity.SubscriptionCourses;
import com.bizofficer.hibernate.repository.PgprepSchoolsRepository;
import com.bizofficer.hibernate.repository.PgprepStudentCoursesRepository;
import com.bizofficer.hibernate.repository.PgprepStudentDetailsRepository;
import com.bizofficer.util.system.General;
import com.bizofficer.util.system.MakeDate;


@Service
public class NewStudentsMobileRegistrationService{
	
	private static final Logger logger = Logger.getLogger(NewStudentsMobileRegistrationService.class);
	
    @Autowired
	EntityManagerFactory entityManagerFactory;
    
    @Autowired
	PgprepStudentDetailsRepository stRepoObj;
    
    @Autowired
    PgprepStudentCoursesRepository pscRepo;
    
    @Autowired
    PgprepSchoolsRepository schoolRepo;
    
	public Object execute(Object obj) throws NotFoundException{
		AaRegBean objBean = (AaRegBean) obj; 	
		RegistrationResponseBean responseBeanObj = new RegistrationResponseBean();
		
		try {
			responseBeanObj.setResponseTxt("failed");
			
			if(objBean.getMobile()==null || objBean.getCourseId()==null) {
				return responseBeanObj;
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();

			logger.info("Name: "+objBean.getStudentName());
			logger.info("Email: "+objBean.getEmail());
			logger.info("Phone: "+objBean.getMobile());
			logger.info("NewPassword: "+objBean.getNewPassword());
			logger.info("CourseId: "+objBean.getCourseId());
			
			if(objBean.getEmail()==null) {
				objBean.setEmail("");
			}
			
			MakeDate makeDateObj = new MakeDate();
			General gen = new General();
			
			if(objBean.getMobile()!=null && objBean.getMobile().length()>0) {

				TypedQuery<PgprepStudentDetails> querySD = (TypedQuery<PgprepStudentDetails>) entityManager.createQuery("from "+PgprepStudentDetails.class.getName()+" WHERE phoneNo=:phoneNo ", PgprepStudentDetails.class);
				querySD.setParameter("phoneNo", objBean.getMobile() );			
				querySD.setFirstResult(0);
				querySD.setMaxResults(1);
				List<?> resultSD = querySD.getResultList();
				Iterator<?> iteratorSD=resultSD.iterator();
				if(!iteratorSD.hasNext()){

					SubscriptionCourses myCors = null;
					TypedQuery<SubscriptionCourses> queryCors = (TypedQuery<SubscriptionCourses>) entityManager.createQuery("from "+SubscriptionCourses.class.getName()+" WHERE courseId=:courseId ", SubscriptionCourses.class);
					queryCors.setParameter("courseId", objBean.getCourseId() );			
					queryCors.setFirstResult(0);
					queryCors.setMaxResults(1);
					List<?> resultCors = queryCors.getResultList();
					Iterator<?> iteratorCors=resultCors.iterator();
					if(iteratorCors.hasNext()){
						myCors = (SubscriptionCourses)iteratorCors.next();

					}
					
	        	   	String token = UUID.randomUUID().toString().replaceAll("-", "");
	        	   	
	        	   	String studentId = UUID.randomUUID().toString().replaceAll("-", "");
	        	   	responseBeanObj.setStudentId(studentId); ///USING IN WEBSITE
	        	   	
					PgprepStudentDetails saveObj = new PgprepStudentDetails();
					saveObj.setStudentId(studentId);					
					saveObj.setEmailId(objBean.getEmail());
					saveObj.setSname(objBean.getStudentName());
					saveObj.setPhoneNo(objBean.getMobile());
					saveObj.setPassword(gen.getMD5Hashing(objBean.getNewPassword()));
					saveObj.setRegistrationDate(makeDateObj.getCurrentTimeStamp());
					saveObj.setRegistrationValidTill(makeDateObj.getAfterDaysDate(30, "yyyy-MM-dd"));
					saveObj.setAccountStatus(1);
					saveObj.setAccountType("-");
					saveObj.setOrganisationId(0);
					saveObj.setLoginKey(token);
					saveObj.setToken(token);
					
					logger.info("WebsiteId: "+myCors.getWebsiteId());
					
					if(myCors.getWebsiteId()!=null) {
						List<PgprepSchools> mySchool = schoolRepo.findByWebsiteId(myCors.getWebsiteId());
						logger.info("mySchool: "+mySchool);
						if(mySchool!=null) {
							saveObj.setSchoolId(mySchool.get(0).getSchoolId());
							saveObj.setSchoolName(mySchool.get(0).getSchoolName());
						}
					}
					
					PgprepStudentDetails stObj = stRepoObj.save(saveObj);
					
					if(myCors!=null){					
				        	PgprepStudentCourses saveSCObj = new PgprepStudentCourses();
				        	saveSCObj.setSid(stObj.getId());		        	
				        	saveSCObj.setCourseId(myCors.getCourseId());
				        	saveSCObj.setCourseTitle(myCors.getCourseTitle());
				        	saveSCObj.setOrganisationId(myCors.getFreeOrganisationId());
				        	saveSCObj.setStudentId(stObj.getStudentId());
				        	saveSCObj.setSubscriptionType("FREE");				        	
				        	if(myCors.getValidityNumber()!=null && myCors.getValidityNumber()>0) {
				        		saveSCObj.setValidTillDate(makeDateObj.getAfterDaysDate(myCors.getValidityNumber(), "yyyy-MM-dd"));
							}else {
								saveSCObj.setValidTillDate(makeDateObj.getAfterDaysDate(2, "yyyy-MM-dd"));
							}				        	
							pscRepo.save(saveSCObj);							
					}		
						
					responseBeanObj.setToken(token);
					responseBeanObj.setResponseTxt("OK");
					
				}	
	           }
	           
                        

            entityManager.getTransaction().commit();
			entityManager.close();
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return responseBeanObj;
	}
	
	
	
	
}
