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.PgprepStudentCourses;
import com.bizofficer.hibernate.entity.PgprepStudentDetails;
import com.bizofficer.hibernate.entity.SubscriptionCourses;
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 NewSchoolStudentService{
	
	private static final Logger logger = Logger.getLogger(NewSchoolStudentService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepSchoolUsersRepository adminRepo;
	
	@Autowired
	PgprepStudentDetailsRepository techRepo;
	
	@Autowired
	PgprepStudentCoursesRepository corsRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		BeanStudents objBean = (BeanStudents) obj;
		SchoolStudentsResponseBean responseObj = new SchoolStudentsResponseBean();
		
		try {
			
			responseObj.setResponseTxt("failed");
			
			logger.info("studentId >> " + objBean.getStudentId() );
			logger.info("studentName >> " + objBean.getStudentName() );
			logger.info("emailId >> " + objBean.getEmailId() );
			logger.info("phone >> " + objBean.getPhone() );
			logger.info("ClassName >> " + objBean.getClassName() );
			
			if(objBean.getStudentId()==null || objBean.getClassName()==null) {
				return responseObj;
			}
			
			PgprepStudentDetails studentObj = techRepo.findIdByStudentId(objBean.getStudentId());			
			if(studentObj!=null && studentObj.getId()>0) {
				logger.info("Existing Student Login Id >> " + objBean.getStudentId() );
				responseObj.setResponseTxt("AlreadyExistsError");
				return responseObj;
			}

				logger.info("New Student LoginId >> " + objBean.getStudentId() );
			
				EntityManager entityManager = entityManagerFactory.createEntityManager();
				entityManager.getTransaction().begin();
				General gen = new General();
				MakeDate dateObj = new MakeDate();
				
				PgprepStudentDetails saveObj = new PgprepStudentDetails();
				
				saveObj.setSchoolId(objBean.getSchoolId());
				saveObj.setSchoolName(objBean.getSchoolName());
				
				saveObj.setStudentId(objBean.getStudentId());
				
				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.setOrganisationId(0);
				saveObj.setAccountType("");
				saveObj.setAccountStatus(1);
				saveObj.setRegistrationDate(dateObj.getCurrentTimeStamp());
				saveObj.setRegistrationValidTill(dateObj.getDateAfterYears(2));
				
				saveObj.setClassName(objBean.getClassName());
				saveObj.setAdmissionNumber(objBean.getAdmissionNumber());
				
				PgprepStudentDetails mySTD = techRepo.save(saveObj);
				
				PgprepStudentCourses corsObj = new PgprepStudentCourses();
				corsObj.setSid(mySTD.getId());
				corsObj.setCourseId(objBean.getCourseId());
				corsObj.setCourseTitle(objBean.getCourseTitle());
				corsObj.setOrganisationId(objBean.getOrganisationId());
				corsObj.setStudentId(objBean.getStudentId());
				
				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();
					if(myCors.getValidityDate()!=null) {
						corsObj.setValidTillDate(dateObj.getStringToDate(myCors.getValidityDate().toString(), "yyyy-MM-dd"));
					}
				}	
				
				corsObj.setSubscriptionType("PAID");
				corsRepo.save(corsObj);
	
				responseObj.setResponseTxt("success");
				
				entityManager.getTransaction().commit();
				entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
