package com.bizofficer.admin.users;



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.PgprepAdminRoles;
import com.bizofficer.hibernate.entity.PgprepAdministrator;
import com.bizofficer.hibernate.repository.OrganisationTemplateAssociationRepository;
import com.bizofficer.hibernate.repository.PgprepAdminRolesRepository;
import com.bizofficer.hibernate.repository.PgprepAdministratorRepository;
import com.bizofficer.hibernate.repository.PgprepSubjectsRepository;
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 UsrUpdateAdmService{
	
	private static final Logger logger = Logger.getLogger(UsrUpdateAdmService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	@Autowired
	PgprepSubjectsRepository stRepo;
	
	@Autowired
	OrganisationTemplateAssociationRepository otaRepo;
	
	@Autowired
	PgprepAdminRolesRepository roleRepo;
	
	public Object execute(Object obj) throws NotFoundException{
		AdminUsrBean objBean = (AdminUsrBean) obj;
		AdminUsrResponseBean responseObj = new AdminUsrResponseBean();
		
		try {
			
			responseObj.setResponseTxt("failed");
			
			logger.info("LoginEmailId >> " + objBean.getLoginEmailId() );
			logger.info("Token >> " + objBean.getToken() );
			
			logger.info("Id >> " + objBean.getId() );
			logger.info("EmailId >> " + objBean.getEmailId() );
			logger.info("FullName >> " + objBean.getFullName() );
			logger.info("Status >> " + objBean.getStatus() );
			logger.info("UserType >> " + objBean.getUserType() );
			logger.info("RoleId >> " + objBean.getRoleId() );
			logger.info("RoleName >> " + objBean.getRoleName() );
			
			if(objBean.getLoginEmailId()==null || objBean.getToken()==null || objBean.getEmailId()==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.getUsers() );
				logger.info(prvgbnObj.toString());
				if(prvgbnObj==null || (prvgbnObj!=null && (prvgbnObj.getUpdate()==null || prvgbnObj.getUpdate()==0))) {
					logger.info("NoAuthorization");
					responseObj.setResponseTxt("NoAuthorization");
					return responseObj;
				}
			}

			MakeDate mkdate = new MakeDate();
			General gen = new General();
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();

			TypedQuery<PgprepAdministrator> query = (TypedQuery<PgprepAdministrator>) entityManager.createQuery("from "+PgprepAdministrator.class.getName()+" WHERE id!=:id AND emailId=:emailId ", PgprepAdministrator.class);
			query.setParameter("id", objBean.getId());
			query.setParameter("emailId", objBean.getEmailId());
			query.setFirstResult(0);
			query.setMaxResults(1);
			List<?> resultListCat = query.getResultList();
			Iterator<?> iteratorCat=resultListCat.iterator();	
			if(iteratorCat.hasNext()){
				logger.info("AlreadyExistsError");
				responseObj.setResponseTxt("AlreadyExistsError");
				return responseObj;
			}			

			logger.info("Update Data: "+objBean.getId());
			
			PgprepAdministrator saveObj = (PgprepAdministrator)entityManager.find(PgprepAdministrator.class ,objBean.getId());
			saveObj.setEmailId(objBean.getEmailId() );
			saveObj.setFullName(objBean.getFullName() );
			saveObj.setStatus(objBean.getStatus() );
			saveObj.setUserType(objBean.getUserType() );
			saveObj.setRoleId(objBean.getRoleId() );
			saveObj.setRoleName(objBean.getRoleName() );
			
			if(objBean.getRoleId()!=null && objBean.getRoleId()>0 && objBean.getRoleId()!=objBean.getCurrentRoleId() ) {
				PgprepAdminRoles myRole = roleRepo.findByRoleId(objBean.getRoleId());
				saveObj.setPrivileges(myRole.getPrivileges());
			}
			
			if(objBean.getPassword()!=null && objBean.getPassword().length()>0) {
				saveObj.setPassword(gen.getMD5Hashing(objBean.getPassword()));
			}
			
			saveObj.setLastModifiedBy(adminObj.getEmailId());
			saveObj.setLastModifiedDateTime(mkdate.getCurrentTimeStamp());

			responseObj.setResponseTxt("success");
				
			
			entityManager.getTransaction().commit();
			entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
