package com.bizofficer.admin.students;



import java.util.List;

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.PgprepStudentCourses;
import com.bizofficer.hibernate.entity.PgprepStudentDetails;
import com.bizofficer.hibernate.repository.PgprepAdministratorRepository;
import com.bizofficer.hibernate.repository.PgprepStudentCoursesRepository;
import com.bizofficer.hibernate.repository.PgprepStudentDetailsRepository;
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 StudentCreationAdminService{
	
	private static final Logger logger = Logger.getLogger(StudentCreationAdminService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	@Autowired
	PgprepStudentDetailsRepository stRepo;
	
	@Autowired
	PgprepStudentCoursesRepository corsRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		StudentAdminBean objBean = (StudentAdminBean) obj;
		StudentAdmResponsePojo responseObj = new StudentAdmResponsePojo();
		
		try {
			
			logger.info("LoginEmailId >> " + objBean.getLoginEmailId() );
			logger.info("Token >> " + objBean.getToken() );
			logger.info("OrganisationId >> " + objBean.getOrganisationId() );
			logger.info("StudentId >> " + objBean.getStudentId() );
			logger.info("StudentName >> " + objBean.getStudentName() );
			logger.info("Phone >> " + objBean.getPhone() );
			logger.info("EmailId >> " + objBean.getEmailId() );
			logger.info("ValidityDate >> " + objBean.getValidityDate() );
			
			if(objBean.getLoginEmailId()==null || objBean.getToken()==null || objBean.getStudentId()==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.getStudents() );
				logger.info(prvgbnObj.toString());
				if(prvgbnObj==null || (prvgbnObj!=null && (prvgbnObj.getCreate()==null || prvgbnObj.getCreate()==0))) {
					logger.info("NoAuthorization");
					responseObj.setResponseTxt("NoAuthorization");
					return responseObj;
				}
			}
			
			List<Integer> stuAutoIdList = stRepo.getIdByStudentId(objBean.getStudentId());
			logger.info("Existing stuAutoId List >> " + stuAutoIdList );
			if(stuAutoIdList!=null && stuAutoIdList.size()>0 && stuAutoIdList.get(0)>0) {
				responseObj.setResponseTxt("AlreadyExistsError");
				return responseObj;
			}
			
			MakeDate mkdateObj = new MakeDate();
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			General gen = new General();
			
			PgprepStudentDetails saveObj = new PgprepStudentDetails();
			
			saveObj.setStudentId(objBean.getStudentId());
			saveObj.setSname(objBean.getStudentName());
			saveObj.setPhoneNo(objBean.getPhone());
			saveObj.setEmailId(objBean.getEmailId());
			if(objBean.getNewPassword()!=null && objBean.getNewPassword().length()>2 ) {
				saveObj.setPassword(gen.getMD5Hashing(objBean.getNewPassword()));
			}
			
			saveObj.setRegistrationDate(mkdateObj.getCurrentTimeStamp());
			saveObj.setAccountStatus(1);	
			saveObj.setAccountType("FREE");
			////saveObj.setLoginKey(UUID.randomUUID().toString()+UUID.randomUUID().toString());
			saveObj.setOrganisationId(0);
			
			if(objBean.getSchoolId()!=null && objBean.getSchoolId()>0 && objBean.getSchoolName()!=null && objBean.getSchoolName().length()>0 ) {
				saveObj.setSchoolId(objBean.getSchoolId());
				saveObj.setSchoolName(objBean.getSchoolName());
			}else {
				saveObj.setSchoolId(null);
				saveObj.setSchoolName(null);
			}
			
			if(objBean.getClassName()!=null && objBean.getClassName().length()>0 && objBean.getClassCourseId()!=null && objBean.getClassCourseId()>0) {
				saveObj.setClassName(objBean.getClassName());		
				saveObj.setClassCourseId(objBean.getClassCourseId());
			}else {
				saveObj.setClassName(null);		
				saveObj.setClassCourseId(null);
			}
						
			PgprepStudentDetails myST = stRepo.save(saveObj);
			
			
			///FREE FOREVER COURSE *********************************************
			if(objBean.getOrganisationId()!=null && objBean.getOrganisationId()!=4) {
				PgprepStudentCourses corsObjF = new PgprepStudentCourses();
				corsObjF.setSid(myST.getId());
				corsObjF.setCourseId(77);
				corsObjF.setCourseTitle("FREE FOREVER");
				corsObjF.setOrganisationId(4);
				corsObjF.setStudentId(objBean.getStudentId());
				corsObjF.setValidTillDate(mkdateObj.getAfterDaysDate(1000, "yyyy-MM-dd"));
				corsObjF.setSubscriptionType("FREE");			
				corsRepo.save(corsObjF);
			}
			//******************************************************************
			
			PgprepStudentCourses corsObj = new PgprepStudentCourses();
			corsObj.setSid(myST.getId());
			corsObj.setCourseId(objBean.getCourseId());
			corsObj.setCourseTitle(objBean.getCourseTitle());
			corsObj.setOrganisationId(objBean.getOrganisationId());
			corsObj.setStudentId(objBean.getStudentId());
			if(objBean.getValidityDate()!=null && objBean.getValidityDate().length()>2 ) {
				corsObj.setValidTillDate(mkdateObj.getStringToDate(objBean.getValidityDate(), "yyyy-MM-dd"));
			}
			corsObj.setSubscriptionType(objBean.getSubscriptionType());			
			corsRepo.save(corsObj);
			
			responseObj.setResponseTxt("OK");

			
			
			entityManager.getTransaction().commit();
			entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
