package com.bizofficer.subscription.registration;



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.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.MakeDate;


@Service
public class AddCourseToMyAccountRegistrationService{
	
	private static final Logger logger = Logger.getLogger(AddCourseToMyAccountRegistrationService.class);
	
    @Autowired
	EntityManagerFactory entityManagerFactory;
    
    @Autowired
	PgprepStudentDetailsRepository stRepoObj;
    
    @Autowired
    PgprepStudentCoursesRepository pscRepo;
    
    @Autowired
    PgprepStudentCoursesRepository stcorsRepo;
    
	public Object execute(Object obj) throws NotFoundException{
		AaRegBean objBean = (AaRegBean) obj; 	
		RegistrationResponseBean responseBeanObj = new RegistrationResponseBean();
		
		try {
			responseBeanObj.setResponseTxt("failed");
			
			if(objBean.getToken()==null || objBean.getCourseId()==null) {
				return responseBeanObj;
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();

			logger.info("Token: "+objBean.getToken() );
			logger.info("CourseId: "+objBean.getCourseId() );
			
			MakeDate makeDateObj = new MakeDate();
			
			if(objBean.getToken()!=null && objBean.getToken().length()>0) {

				TypedQuery<PgprepStudentDetails> querySD = (TypedQuery<PgprepStudentDetails>) entityManager.createQuery("from "+PgprepStudentDetails.class.getName()+" WHERE loginKey=:token ", PgprepStudentDetails.class);
				querySD.setParameter("token", objBean.getToken() );			
				querySD.setFirstResult(0);
				querySD.setMaxResults(1);
				List<?> resultSD = querySD.getResultList();
				Iterator<?> iteratorSD=resultSD.iterator();
				if(iteratorSD.hasNext()){
					PgprepStudentDetails stObj = (PgprepStudentDetails)iteratorSD.next();

					/// IF THIS COURSE IS NOT EXISTS WITH THIS STUDENT
					PgprepStudentCourses stuCorse = stcorsRepo.findIdBySidAndCourseId(stObj.getId(), objBean.getCourseId());
					if(stuCorse==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()){
							SubscriptionCourses myCors = (SubscriptionCourses)iteratorCors.next();
					        	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(objBean.getToken());
					responseBeanObj.setResponseTxt("OK");
					
					logger.info("Pass Token: "+responseBeanObj.getToken() );
					
				}	
				
           }
	           
                        

            entityManager.getTransaction().commit();
			entityManager.close();
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return responseBeanObj;
	}
	
	
	
	
}
