package com.bizofficer.admin.teachers;



import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

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.PgprepSchools;
import com.bizofficer.hibernate.entity.PgprepTeachers;
import com.bizofficer.hibernate.repository.PgprepAdministratorRepository;
import com.bizofficer.hibernate.repository.PgprepSchoolsRepository;
import com.bizofficer.hibernate.repository.PgprepTeachersRepository;
import com.bizofficer.util.module.PrivilegesBeans;
import com.bizofficer.util.module.PrivilegesUtil;
import com.bizofficer.util.module.RoleModules;
import com.bizofficer.util.system.General;
import com.bizofficer.util.system.MakeDate;


@Service
public class TeachersCreationAdmService{
	
	private static final Logger logger = Logger.getLogger(TeachersCreationAdmService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	@Autowired
	PgprepTeachersRepository stRepo;
	
	@Autowired
	PgprepSchoolsRepository schoolRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		TeachersAdmRequest objBean = (TeachersAdmRequest) obj;
		TeachersAdmResponse responseObj = new TeachersAdmResponse();
		
		try {
			
			logger.info("LoginEmailId >> " + objBean.getLoginEmailId() );
			logger.info("Token >> " + objBean.getToken() );
			logger.info("TeacherName >> " + objBean.getTeacherName() );
			logger.info("EmailId >> " + objBean.getEmailId() );
			logger.info("LoginId >> " + objBean.getLoginId() );
			logger.info("SchoolName >> " + objBean.getSchoolName() );
			logger.info("SchoolId >> " + objBean.getSchoolId() );
			logger.info("AccountStatus >> " + objBean.getAccountStatus() );
			
			if(objBean.getLoginEmailId()==null || objBean.getToken()==null || objBean.getTeacherName()==null || objBean.getLoginId()==null) {
				return responseObj;
			}
			
			PgprepAdministrator adminObj = (PgprepAdministrator) adminRepo.findByEmailIdAndLoginToken(objBean.getLoginEmailId(), objBean.getToken());
			if(adminObj==null) {
				logger.info("InvalidToken");
				responseObj.setResponseTxt("InvalidToken");
				return responseObj;
			}
			
			if(adminObj.getUserType()==0 && adminObj.getRoleId()!=null && adminObj.getPrivileges()!=null){				
				PrivilegesUtil	myPgUtil = new PrivilegesUtil();
				PrivilegesBeans prvgbnObj = myPgUtil.authPrivileges(adminObj.getPrivileges(), RoleModules.getTeachers() );
				logger.info(prvgbnObj.toString());
				if(prvgbnObj==null || (prvgbnObj!=null && (prvgbnObj.getCreate()==null || prvgbnObj.getCreate()==0))) {
					logger.info("NoAuthorization");
					responseObj.setResponseTxt("NoAuthorization");
					return responseObj;
				}
			}

			PgprepTeachers techObj = stRepo.getIdByLoginId(objBean.getLoginId());
			logger.info("Existing techObj >> " + techObj );
			if(techObj!=null) {
				responseObj.setResponseTxt("AlreadyExistsErrorLoginId");
				return responseObj;
			}
			
			PgprepTeachers techObj2 = stRepo.findByEmailId(objBean.getEmailId());
			logger.info("Existing techObj >> " + techObj2 );
			if(techObj2!=null) {
				responseObj.setResponseTxt("AlreadyExistsErrorEmailId");
				return responseObj;
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			General gen = new General();
			MakeDate dateObj = new MakeDate();
			
			PgprepTeachers saveObj = new PgprepTeachers();
			saveObj.setRole("TEACHER");
			saveObj.setTeacherName(objBean.getTeacherName());
			saveObj.setEmailId(objBean.getEmailId());
			saveObj.setLoginId(objBean.getLoginId());
			saveObj.setAccountStatus(objBean.getAccountStatus());

			if(objBean.getNewPassword()!=null && objBean.getNewPassword().length()>2 ) {
				saveObj.setPassword(gen.getMD5Hashing(objBean.getNewPassword()));
			}
			
			if(objBean.getSchoolId()!=null && objBean.getSchoolId()>0 && objBean.getSchoolName()!=null && objBean.getSchoolName().length()>0 ) {
				saveObj.setSchoolId(objBean.getSchoolId());
				saveObj.setSchoolName(objBean.getSchoolName());
			}else if(objBean.getEmailId().length()>0) {
				PgprepSchools saveeObj = new PgprepSchools();
				saveeObj.setSchoolName(objBean.getEmailId().trim().split("@")[0]+gen.getRandomNumber(11, 99));
				saveeObj.setStatus(1);
				saveeObj.setCreatedDate(dateObj.getCurrentTimeStamp());
				PgprepSchools mySchoolObj = schoolRepo.save(saveeObj);

				saveObj.setSchoolId(mySchoolObj.getSchoolId());
				saveObj.setSchoolName(mySchoolObj.getSchoolName());
			}
			
			stRepo.save(saveObj);
			
			responseObj.setResponseTxt("OK");
			
			entityManager.getTransaction().commit();
			entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
