package com.bizofficer.school.students;



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.PgprepSchoolClasses;
import com.bizofficer.hibernate.entity.PgprepStudentCourses;
import com.bizofficer.hibernate.entity.PgprepStudentDetails;
import com.bizofficer.hibernate.entity.SubscriptionCourses;
import com.bizofficer.hibernate.repository.PgprepSchoolClassesRepository;
import com.bizofficer.hibernate.repository.PgprepSchoolUsersRepository;
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 EditSchoolStudentService{
	
	private static final Logger logger = Logger.getLogger(EditSchoolStudentService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepSchoolUsersRepository adminRepo;
	
	@Autowired
	PgprepStudentDetailsRepository techRepo;
	
	@Autowired
	PgprepStudentCoursesRepository corsRepo;
	
	@Autowired
	PgprepSchoolClassesRepository clasRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		BeanStudents objBean = (BeanStudents) obj;
		SchoolStudentsResponseBean responseObj = new SchoolStudentsResponseBean();
		
		try {

			logger.info("studentId >> " + objBean.getStudentId() );
			logger.info("studentName >> " + objBean.getStudentName() );
			logger.info("emailId >> " + objBean.getEmailId() );
			logger.info("phone >> " + objBean.getPhone() );
			
			if(objBean.getStudentId()==null || objBean.getClassName()==null) {
				return responseObj;
			}
			
			
//			PgprepStudentDetails studentObj = techRepo.findIdByIdNotAndStudentId(objBean.getAutoId(), objBean.getStudentId());			
//			if(studentObj!=null && studentObj.getId()>0) {
//				logger.info("Existing Student Login Id >> " + objBean.getStudentId() );
//				responseObj.setResponseTxt("AlreadyExistsError");
//				return responseObj;
//			}

				logger.info("LoginId >> " + objBean.getStudentId() );
				logger.info("AutoId >> " + objBean.getAutoId() );
			
				EntityManager entityManager = entityManagerFactory.createEntityManager();
				entityManager.getTransaction().begin();
				General gen = new General();
				
				
				PgprepStudentDetails myStudentObj = techRepo.findIdByStudentId(objBean.getStudentId());
				logger.info("FOUND STUDENT DETAILS >> " + myStudentObj );
				if(myStudentObj==null) {
					responseObj.setResponseTxt("Invalid Student ID");
					return responseObj;
				}
				
				
				PgprepStudentDetails saveObj = (PgprepStudentDetails)entityManager.find(PgprepStudentDetails.class ,objBean.getAutoId());

				if(objBean.getNewPassword()!=null && objBean.getNewPassword().length()>2 ) {
					saveObj.setPassword(gen.getMD5Hashing(objBean.getNewPassword()));
				}

				saveObj.setSname(objBean.getStudentName());
				saveObj.setEmailId(objBean.getEmailId());				
				saveObj.setPhoneNo(objBean.getPhone());
				
				saveObj.setClassName(objBean.getClassName());
				saveObj.setAdmissionNumber(objBean.getAdmissionNumber());

				
				if(myStudentObj.getClassName()!=null && !myStudentObj.getClassName().equals(objBean.getClassName())) {
					
					PgprepSchoolClasses myClasObj = clasRepo.findBySchoolIdAndClassName(objBean.getSchoolId(), myStudentObj.getClassName());
					if(myClasObj==null) {
						responseObj.setResponseTxt("Invalid Class Name");
						return responseObj;
					}
										
					logger.info("FOUND OLD COURSE ID: "+myClasObj.getCourseId());
					
					PgprepStudentCourses checkExistingObj = corsRepo.findIdBySidAndCourseId(myStudentObj.getId(), myClasObj.getCourseId());
					if(checkExistingObj==null) {
						responseObj.setResponseTxt("OLD Course Not Found");
						return responseObj;
					}
					
					PgprepStudentCourses saveCorsObj = (PgprepStudentCourses)entityManager.find(PgprepStudentCourses.class ,checkExistingObj.getId());
					saveCorsObj.setCourseId(objBean.getCourseId());
					saveCorsObj.setCourseTitle(objBean.getCourseTitle());
					saveCorsObj.setOrganisationId(objBean.getOrganisationId());
					saveCorsObj.setStudentId(objBean.getStudentId());
					
					logger.info("My Course Id: " + objBean.getCourseId() );
					
					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 mySCors = (SubscriptionCourses)iteratorCors.next();
						
						logger.info("Validity Date: " + mySCors.getValidityDate() );
						
						if(mySCors.getValidityDate()!=null) {
							MakeDate dateObj = new MakeDate();
							saveCorsObj.setValidTillDate(dateObj.getStringToDate(mySCors.getValidityDate().toString(), "yyyy-MM-dd"));
						}
					}	
				}
				
				responseObj.setResponseTxt("success");
				
				entityManager.getTransaction().commit();
				entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
