package com.bizofficer.website.signup;



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.SubscriptionCourses;
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 NewStudentsRegistrationWebService{
	
	private static final Logger logger = Logger.getLogger(NewStudentsRegistrationWebService.class);
	
    @Autowired
	EntityManagerFactory entityManagerFactory;
    
    @Autowired
	PgprepStudentDetailsRepository stRepoObj;
    
    @Autowired
    PgprepStudentCoursesRepository pscRepo;
    
	public Object execute(Object obj) throws NotFoundException{
		BeanWeb objBean = (BeanWeb) obj; 	
		RegistrationResponseBean responseBeanObj = new RegistrationResponseBean();
		
		try {
			responseBeanObj.setResponseTxt("failed");

			logger.info("Name: "+objBean.getStudentName() );
			logger.info("Email: "+objBean.getEmail() );
			logger.info("Phone: "+objBean.getMobile() );
			logger.info("SubscriptionType: "+objBean.getSubscriptionType() );
			logger.info("CourseId: "+objBean.getCourseId());
			logger.info("WebsiteId: "+objBean.getWebsiteId());
			
			if(objBean.getMobile()==null || objBean.getEmail()==null) {
				return responseBeanObj;
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();

			MakeDate makeDateObj = new MakeDate();
			General gen = new General();
			
		   TypedQuery<PgprepStudentDetails> query = (TypedQuery<PgprepStudentDetails>) entityManager.createQuery("from "+PgprepStudentDetails.class.getName()+" where emailId=:email OR phoneNo=:phoneNo ", PgprepStudentDetails.class);
           query.setParameter("email", objBean.getEmail() );
           query.setParameter("phoneNo", objBean.getMobile() );
           query.setFirstResult(0);
           query.setMaxResults(1);
           List<?> resultListCat = query.getResultList();
           Iterator<?> iteratorCat=resultListCat.iterator();	       
           if(iteratorCat.hasNext()){
				
        	   responseBeanObj.setResponseTxt("EmailOrMobileExists");
        	   
           }else {	   
        	   
				TypedQuery<SubscriptionCourses> queryCors = (TypedQuery<SubscriptionCourses>) entityManager.createQuery("from "+SubscriptionCourses.class.getName()+" WHERE courseId=:courseId AND websiteId=:websiteId ", SubscriptionCourses.class);
				queryCors.setParameter("courseId", objBean.getCourseId());	
				queryCors.setParameter("websiteId",objBean.getWebsiteId());
				queryCors.setFirstResult(0);
				queryCors.setMaxResults(1);
				List<?> resultCors = queryCors.getResultList();
				Iterator<?> iteratorCors=resultCors.iterator();
				if(iteratorCors.hasNext()){
					SubscriptionCourses myCors = (SubscriptionCourses)iteratorCors.next();
        	   
					logger.info("Cors courseId: "+myCors.getCourseId());
					
					PgprepStudentDetails saveObj = new PgprepStudentDetails();

					saveObj.setStudentId(UUID.randomUUID().toString().replaceAll("-", ""));
					
//					if(objBean.getEmail()!=null && objBean.getEmail().length()>0) {
//						saveObj.setStudentId(objBean.getEmail());
//					}else if(objBean.getMobile()!=null && objBean.getMobile().length()>0) {
//						saveObj.setStudentId(objBean.getMobile());
//					}else {
//						saveObj.setStudentId(UUID.randomUUID().toString().replaceAll("-", ""));
//					}
					
					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(2, "yyyy-MM-dd"));
					saveObj.setAccountStatus(1);
					saveObj.setAccountType("-");
					saveObj.setOrganisationId(0);
					saveObj.setLoginKey("-");
					saveObj.setToken("-");
					PgprepStudentDetails stuObj = stRepoObj.save(saveObj);
					
					logger.info("SId: "+stuObj.getId());
					
		        	PgprepStudentCourses saveSCObj = new PgprepStudentCourses();
		        	saveSCObj.setSid(stuObj.getId());
		        	saveSCObj.setCourseId(objBean.getCourseId());
		        	saveSCObj.setCourseTitle(myCors.getCourseTitle());
		        	saveSCObj.setStudentId(saveObj.getStudentId());
		        	saveSCObj.setSubscriptionType(objBean.getSubscriptionType());

		        	if(objBean.getSubscriptionType()!=null && objBean.getSubscriptionType().equals("PAID")) {
			        	saveSCObj.setOrganisationId(myCors.getPaidOrganisationId());
			        	if(myCors.getValidityDate()!=null) {
			        		saveSCObj.setValidTillDate(makeDateObj.getStringToDate(myCors.getValidityDate().toString(), "yyyy-MM-dd"));
			        	}else {
			        		saveSCObj.setValidTillDate(makeDateObj.getAfterDaysDate(90, "yyyy-MM-dd"));
			        	}
		        	}else {
			        	saveSCObj.setOrganisationId(myCors.getFreeOrganisationId());
			        	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.setResponseTxt("success");
					
				}else {
					
					responseBeanObj.setResponseTxt("CourseInvalid");
					
				}
					
					
	        }
	           
                        

            entityManager.getTransaction().commit();
			entityManager.close();
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return responseBeanObj;
	}
	
	
	
	
}
