package com.bizofficer.admin.navigation;



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.OrganisationInfo;
import com.bizofficer.hibernate.entity.PgprepAdministrator;
import com.bizofficer.hibernate.entity.PgprepOrganisationMenu;
import com.bizofficer.hibernate.repository.OrganisationInfoRepository;
import com.bizofficer.hibernate.repository.PgprepAdministratorRepository;
import com.bizofficer.hibernate.repository.PgprepOrganisationMenuRepository;
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 NavigationSaveAdminService{
	
	private static final Logger logger = Logger.getLogger(NavigationSaveAdminService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	@Autowired
	PgprepOrganisationMenuRepository orgMenuRepo;
	
	@Autowired
	OrganisationInfoRepository orgInfoRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		NavigationAdminBean objBean = (NavigationAdminBean) obj;
		NavigationAdmResponseBean responseObj = new NavigationAdmResponseBean();
		
		try {
			
			responseObj.setResponseTxt("failed");
			
			logger.info("LoginEmailId >> " + objBean.getLoginEmailId() );
			logger.info("Token >> " + objBean.getToken() );
			logger.info("OrganisationId >> " + objBean.getOrganisationId() );
			
			logger.info("Dashboard >> " + objBean.getDashboard() );
			logger.info("Report >> " + objBean.getReport() );
			logger.info("SmartLearning >> " + objBean.getSmartLearning() );
			logger.info("SelfTest >> " + objBean.getSelfTest() );
			logger.info("TopicTest >> " + objBean.getTopicTest() );
			logger.info("MockTest >> " + objBean.getMockTest() );
			logger.info("ClassTest >> " + objBean.getClassTest() );
			
			
			if(objBean.getLoginEmailId()==null || objBean.getToken()==null || objBean.getOrganisationId()==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.getNavigationOptions() );
				logger.info(prvgbnObj.toString());
				if(prvgbnObj==null || (prvgbnObj!=null && (prvgbnObj.getCreate()==null || prvgbnObj.getCreate()==0))) {
					logger.info("NoAuthorization");
					responseObj.setResponseTxt("NoAuthorization");
					return responseObj;
				}
			}

			MakeDate makeDateObj = new MakeDate();
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			TypedQuery<PgprepOrganisationMenu> querySCT = (TypedQuery<PgprepOrganisationMenu>) entityManager.createQuery("from "+PgprepOrganisationMenu.class.getName()+" where organisationId=:organisationId ", PgprepOrganisationMenu.class);
			querySCT.setParameter("organisationId", objBean.getOrganisationId());
			querySCT.setFirstResult(0);
			querySCT.setMaxResults(1);
			List<?> resultListSCT = querySCT.getResultList();
			Iterator<?> iteratorSCT=resultListSCT.iterator();
			if(iteratorSCT.hasNext()) {
				PgprepOrganisationMenu myObj = (PgprepOrganisationMenu)iteratorSCT.next();
				PgprepOrganisationMenu findObj = (PgprepOrganisationMenu)entityManager.find(PgprepOrganisationMenu.class ,myObj.getId());
				
				if(objBean.getDashboard()!=null && Boolean.TRUE.equals(objBean.getDashboard())) {
					findObj.setDashboard(1);
				}else {
					findObj.setDashboard(0);
				}
				if(objBean.getReport()!=null && Boolean.TRUE.equals(objBean.getReport())) {
					findObj.setReport(1);
				}else {
					findObj.setReport(0);
				}
				if(objBean.getSmartLearning()!=null && Boolean.TRUE.equals(objBean.getSmartLearning())) {
					findObj.setSmartLearning(1);
				}else {
					findObj.setSmartLearning(0);
				}
				if(objBean.getSelfTest()!=null && Boolean.TRUE.equals(objBean.getSelfTest())) {
					findObj.setSelfTest(1);
				}else {
					findObj.setSelfTest(0);
				}
				if(objBean.getTopicTest()!=null && Boolean.TRUE.equals(objBean.getTopicTest())) {
					findObj.setTopicTest(1);
				}else {
					findObj.setTopicTest(0);
				}
				if(objBean.getMockTest()!=null && Boolean.TRUE.equals(objBean.getMockTest())) {
					findObj.setMockTest(1);
				}else {
					findObj.setMockTest(0);
				}
				if(objBean.getClassTest()!=null && Boolean.TRUE.equals(objBean.getClassTest())) {
					findObj.setClassTest(1);
				}else {
					findObj.setClassTest(0);
				}
				if(objBean.getTeacherHelp()!=null && Boolean.TRUE.equals(objBean.getTeacherHelp())) {
					findObj.setTeacherHelp(1);
				}else {
					findObj.setTeacherHelp(0);
				}
				
				findObj.setUpdatedDateTime(makeDateObj.getCurrentTimeStamp());
				findObj.setUpdatedBy(adminObj.getFullName());
				
				responseObj.setResponseTxt("success");
				
			}else {
				PgprepOrganisationMenu saveObj = new PgprepOrganisationMenu();
				
				
				saveObj.setOrganisationId(objBean.getOrganisationId());
				
				OrganisationInfo orgInfoObj = orgInfoRepo.findOrganisationNameByOrganisationId(objBean.getOrganisationId());
				saveObj.setOrganisationName(orgInfoObj.getOrganisationName());

				saveObj.setUpdatedDateTime(makeDateObj.getCurrentTimeStamp());
				saveObj.setUpdatedBy(adminObj.getFullName());
				
				if(objBean.getDashboard()!=null && Boolean.TRUE.equals(objBean.getDashboard())) {
					saveObj.setDashboard(1);
				}else {
					saveObj.setDashboard(0);
				}
				if(objBean.getReport()!=null && Boolean.TRUE.equals(objBean.getReport())) {
					saveObj.setReport(1);
				}else {
					saveObj.setReport(0);
				}
				if(objBean.getSmartLearning()!=null && Boolean.TRUE.equals(objBean.getSmartLearning())) {
					saveObj.setSmartLearning(1);
				}else {
					saveObj.setSmartLearning(0);
				}
				if(objBean.getSelfTest()!=null && Boolean.TRUE.equals(objBean.getSelfTest())) {
					saveObj.setSelfTest(1);
				}else {
					saveObj.setSelfTest(0);
				}
				if(objBean.getTopicTest()!=null && Boolean.TRUE.equals(objBean.getTopicTest())) {
					saveObj.setTopicTest(1);
				}else {
					saveObj.setTopicTest(0);
				}
				if(objBean.getMockTest()!=null && Boolean.TRUE.equals(objBean.getMockTest())) {
					saveObj.setMockTest(1);
				}else {
					saveObj.setMockTest(0);
				}
				if(objBean.getClassTest()!=null && Boolean.TRUE.equals(objBean.getClassTest())) {
					saveObj.setClassTest(1);
				}else {
					saveObj.setClassTest(0);
				}
				if(objBean.getTeacherHelp()!=null && Boolean.TRUE.equals(objBean.getTeacherHelp())) {
					saveObj.setTeacherHelp(1);
				}else {
					saveObj.setTeacherHelp(0);
				}
				
				orgMenuRepo.save(saveObj);
				
				responseObj.setResponseTxt("success");
				
			}
			
			
			entityManager.getTransaction().commit();
			entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
