package com.bizofficer.admin.school;



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.PgprepSchoolClasses;
import com.bizofficer.hibernate.entity.PgprepSchools;
import com.bizofficer.hibernate.repository.PgprepAdministratorRepository;
import com.bizofficer.util.module.PrivilegesBeans;
import com.bizofficer.util.module.PrivilegesUtil;
import com.bizofficer.util.module.RoleModules;


@Service
public class SchoolClassesAdminService{
	
	private static final Logger logger = Logger.getLogger(SchoolClassesAdminService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		AdminSchoolBean objBean = (AdminSchoolBean) obj;
		SchoolAdminResponseBean responseObj = new SchoolAdminResponseBean();
		
		try {
			
			responseObj.setResponseTxt("failed");
			logger.info("LoginEmailId >> " + objBean.getLoginEmailId() );
			logger.info("Token >> " + objBean.getToken() );
			logger.info("Keyword >> " + objBean.getKeyword() );
			
			if(objBean.getLoginEmailId()==null || objBean.getToken()==null) {
				return responseObj;
			}
			
			PgprepAdministrator adminObj = (PgprepAdministrator) adminRepo.findByEmailIdAndLoginToken(objBean.getLoginEmailId(), 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.getAcademy() );
				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);
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			List<SchoolsBean> mylist = new ArrayList<SchoolsBean>();
			SchoolsBean clsObj;
			SchoolClassesBean objCls;
			
			TypedQuery<PgprepSchools> query = (TypedQuery<PgprepSchools>) entityManager.createQuery("from "+PgprepSchools.class.getName()+" order by schoolName ", PgprepSchools.class);
			List<?> resultListCat = query.getResultList();
			Iterator<?> iteratorCat=resultListCat.iterator();
			int i=1;
			while(iteratorCat.hasNext()){
				PgprepSchools myObj = (PgprepSchools)iteratorCat.next();		
				
				clsObj = new SchoolsBean();
				
				clsObj.setId(i);
				clsObj.setAutoId(myObj.getSchoolId());				
				clsObj.setSchoolName(myObj.getSchoolName());
				
				List<SchoolClassesBean> myClasses = new ArrayList<SchoolClassesBean>();

				TypedQuery<PgprepSchoolClasses> queryCls = (TypedQuery<PgprepSchoolClasses>) entityManager.createQuery("from "+PgprepSchoolClasses.class.getName()+" where schoolId=:schoolId order by className ", PgprepSchoolClasses.class);
				queryCls.setParameter("schoolId", myObj.getSchoolId());
				List<?> resultListCls = queryCls.getResultList();
				Iterator<?> iteratorCls = resultListCls.iterator();	
				int j=1;
				while(iteratorCls.hasNext()){
					PgprepSchoolClasses myObjSLCls = (PgprepSchoolClasses)iteratorCls.next();		
			
					objCls = new SchoolClassesBean();
					objCls.setId(j);
					objCls.setCourseId(myObjSLCls.getCourseId());
					objCls.setOrganisationId(myObjSLCls.getOrganisationId());
					objCls.setClassName(myObjSLCls.getClassName());
					objCls.setCourseTitle(myObjSLCls.getCourseTitle());
					
					myClasses.add(objCls);
					
					j++;
				}
				
				clsObj.setList(myClasses);
				
				mylist.add(clsObj);
				i++;
			}

			responseObj.setList(mylist);
			
			if(mylist!=null) {
				logger.info("Total Schools::: " + mylist.size() );
			}
			
			responseObj.setResponseTxt("success");
			entityManager.getTransaction().commit();
			entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
