package com.bizofficer.admin.students;



import java.util.ArrayList;
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.PgprepAdministrator;
import com.bizofficer.hibernate.entity.PgprepStudentCourses;
import com.bizofficer.hibernate.entity.PgprepStudentDetails;
import com.bizofficer.hibernate.repository.PgprepAdministratorRepository;
import com.bizofficer.util.module.PrivilegesBeans;
import com.bizofficer.util.module.PrivilegesUtil;
import com.bizofficer.util.module.RoleModules;
import com.bizofficer.util.system.MakeDate;


@Service
public class StudentAdminService{
	
	private static final Logger logger = Logger.getLogger(StudentAdminService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		StudentAdminBean objBean = (StudentAdminBean) obj;
		StudentAdmResponsePojo responseObj = new StudentAdmResponsePojo();
		
		try {
			
			responseObj.setResponseTxt("failed");
			
			logger.info("EmailId >> " + objBean.getEmailId() );
			logger.info("Token >> " + objBean.getToken() );
			logger.info("Keyword >> " + objBean.getKeyword() );
			logger.info("FromDate >> " + objBean.getFromDate() );
			logger.info("ToDate >> " + objBean.getToDate() );
			
			if(objBean.getEmailId()==null || objBean.getToken()==null) {
				return responseObj;
			}
			
			PgprepAdministrator adminObj = (PgprepAdministrator) adminRepo.findByEmailIdAndLoginToken(objBean.getEmailId(), objBean.getToken());
			if(adminObj==null) {
				logger.info("InvalidToken");
				responseObj.setResponseTxt("InvalidToken");
				return responseObj;
			}			

			logger.info("Verify >> " + adminObj.getId() );
			
			if(adminObj.getUserType()==0 && adminObj.getRoleId()!=null && adminObj.getPrivileges()!=null){				
				PrivilegesUtil	myPgUtil = new PrivilegesUtil();
				PrivilegesBeans prvgbnObj = myPgUtil.authPrivileges(adminObj.getPrivileges(), RoleModules.getStudents() );
				logger.info(prvgbnObj.toString());
				if(prvgbnObj!=null && prvgbnObj.getView()!=null && prvgbnObj.getView()==1) {					
					responseObj.setPrivileges(prvgbnObj);
				}else {
					logger.info("NoAuthorization");
					responseObj.setResponseTxt("NoAuthorization");
					return responseObj;
				}
			}else {
				PrivilegesUtil	myPgUtil = new PrivilegesUtil();
				PrivilegesBeans prvgbnObj = myPgUtil.fullPrivileges();
				responseObj.setPrivileges(prvgbnObj);
			}
			
			List<StudentAdminResponseBean> listObj = new ArrayList<StudentAdminResponseBean>();
			List<StudentCoursesAdminRespoBean> coursesList = null;
			StudentCoursesAdminRespoBean stCorsObj = null;
			
			MakeDate mkdateObj = new MakeDate();
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			String whereQry =" WHERE 1=1 ";			
			if(objBean.getKeyword()!=null && objBean.getKeyword().length()>0 ) {
				whereQry +=" AND (studentId LIKE :keyword OR emailId LIKE :keyword OR phoneNo LIKE :keyword OR sname LIKE :keyword OR accountType LIKE :keyword OR schoolName LIKE :keyword OR className LIKE :keyword ) "; 
			}
			if(objBean.getFromDate()!=null && objBean.getFromDate().length()>0) {
				whereQry+=" AND date(registrationDate)>=:fromDate ";
			}
			if(objBean.getToDate()!=null && objBean.getToDate().length()>0) {
				whereQry+=" AND date(registrationDate)<=:toDate ";
			}
			
			TypedQuery<PgprepStudentDetails> query = (TypedQuery<PgprepStudentDetails>) entityManager.createQuery("from "+PgprepStudentDetails.class.getName()+whereQry+" order by id desc ", PgprepStudentDetails.class);
			if(objBean.getKeyword()!=null && objBean.getKeyword().length()>0 ) {
				query.setParameter("keyword", "%"+objBean.getKeyword()+"%");
			}
			if(objBean.getFromDate()!=null && objBean.getFromDate().length()>0) {
				query.setParameter("fromDate", mkdateObj.getStringToDate(objBean.getFromDate(), "yyyy-MM-dd") );
			}
			if(objBean.getToDate()!=null && objBean.getToDate().length()>0) {
				query.setParameter("toDate", mkdateObj.getStringToDate(objBean.getToDate(), "yyyy-MM-dd") );
			}
			query.setFirstResult(0);
			query.setMaxResults(500);
			List<?> resultListCat = query.getResultList();
			Iterator<?> iteratorCat=resultListCat.iterator();	
			StudentAdminResponseBean studentAdminResponseBeanObj;
			int i=1;
			while(iteratorCat.hasNext()){
				PgprepStudentDetails myObj = (PgprepStudentDetails)iteratorCat.next();		
				
				studentAdminResponseBeanObj = new StudentAdminResponseBean();
				
				studentAdminResponseBeanObj.setId(i);
				studentAdminResponseBeanObj.setAutoId(myObj.getId());
				studentAdminResponseBeanObj.setAccountStatus(myObj.getAccountStatus());
				studentAdminResponseBeanObj.setStudentId(myObj.getStudentId());
				studentAdminResponseBeanObj.setEmailId(myObj.getEmailId());
				studentAdminResponseBeanObj.setSname(myObj.getSname());
				studentAdminResponseBeanObj.setPhoneNo(myObj.getPhoneNo());
				studentAdminResponseBeanObj.setPhoto(myObj.getPhoto());
				studentAdminResponseBeanObj.setRegistrationDate(mkdateObj.changeDateTimeFormat(myObj.getRegistrationDate(), "dd-MM-yyyy"));
				studentAdminResponseBeanObj.setAccountType(myObj.getAccountType());
				
				studentAdminResponseBeanObj.setSchoolId(myObj.getSchoolId());
				studentAdminResponseBeanObj.setSchoolName(myObj.getSchoolName());
				studentAdminResponseBeanObj.setClassName(myObj.getClassName());
				studentAdminResponseBeanObj.setClassCourseId(myObj.getClassCourseId());
				
				coursesList = new ArrayList<StudentCoursesAdminRespoBean>();
				
				TypedQuery<PgprepStudentCourses> querySC = (TypedQuery<PgprepStudentCourses>) entityManager.createQuery("from "+PgprepStudentCourses.class.getName()+" where studentId=:studentId AND validTillDate is not null order by id ", PgprepStudentCourses.class);
				querySC.setParameter("studentId", myObj.getStudentId());
				List<?> resultSC = querySC.getResultList();
				Iterator<?> iteratorSC=resultSC.iterator();	
				while(iteratorSC.hasNext()){
					PgprepStudentCourses myObjSC = (PgprepStudentCourses)iteratorSC.next();
				
					if(myObjSC.getValidTillDate()!=null) {
						stCorsObj = new StudentCoursesAdminRespoBean();
						stCorsObj.setId(myObjSC.getId());
						stCorsObj.setCourseId(myObjSC.getCourseId());
						stCorsObj.setCourseTitle(myObjSC.getCourseTitle());
						stCorsObj.setOrganisationId(myObjSC.getOrganisationId());
						stCorsObj.setSubscriptionType(myObjSC.getSubscriptionType());					
						stCorsObj.setValidTillDate(mkdateObj.dateToString(myObjSC.getValidTillDate(), "dd-MM-yyyy") );				
						coursesList.add(stCorsObj);
					}
					
				}
				
				studentAdminResponseBeanObj.setCourses(coursesList);
				
				listObj.add(studentAdminResponseBeanObj);
				i++;
			}
			
			responseObj.setList(listObj);

			responseObj.setResponseTxt("success");
				
			entityManager.getTransaction().commit();
			entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
