package com.bizofficer.admin.promocode;



import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bizofficer.hibernate.entity.PgprepAdministrator;
import com.bizofficer.hibernate.entity.SubscriptionPromocode;
import com.bizofficer.hibernate.repository.PgprepAdministratorRepository;
import com.bizofficer.hibernate.repository.SubscriptionPromocodeRepository;
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 PromoCreationAdminService{
	
	private static final Logger logger = Logger.getLogger(PromoCreationAdminService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	@Autowired
	SubscriptionPromocodeRepository stRepo;
	
	public Object execute(PromoAdminBean objBean){		
		PromoAdminResponseBean responseObj = new PromoAdminResponseBean();
		
		try {
			
			responseObj.setResponseTxt("failed");
			
			logger.info("LoginEmailId >> " + objBean.getLoginEmailId() );
			logger.info("Token >> " + objBean.getToken() );
			logger.info("Website Id >> " + objBean.getWebsiteId() );
			logger.info("Web Url >> " + objBean.getWebUrl() );
			logger.info("Discount >> " + objBean.getDiscount() );
			logger.info("Course Id >> " + objBean.getCourseId());
			logger.info("Course Title >> " + objBean.getCourseTitle());			
			logger.info("Code >> " + objBean.getCode() );
			logger.info("Discount Type >> " + objBean.getDiscountType() );
			logger.info("Start Date >> " + objBean.getStartDate() );
			logger.info("End Date >> " + objBean.getEndDate() );
			logger.info("Status >> " + objBean.getStatus() );
			logger.info("Display Public >> " + objBean.getDisplayPublic() );
			logger.info("Description >> " + objBean.getDescription() );
			
			if(objBean.getLoginEmailId()==null || objBean.getToken()==null || objBean.getCode()==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.getPromoCodes() );
				logger.info(prvgbnObj.toString());
				if(prvgbnObj==null || (prvgbnObj!=null && (prvgbnObj.getCreate()==null || prvgbnObj.getCreate()==0))) {
					logger.info("NoAuthorization");
					responseObj.setResponseTxt("NoAuthorization");
					return responseObj;
				}
			}
			
			SubscriptionPromocode webObj = stRepo.findIdByCode(objBean.getCode());
			logger.info("Existing >> " + webObj );
			if(webObj!=null && webObj.getId()>0) {
				responseObj.setResponseTxt("AlreadyExistsError");
				return responseObj;
			}
			
			logger.info("PromoCreationAdminService: NO EXIST AVAILABLE");
			
			MakeDate mkdateObj = new MakeDate();
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();


			SubscriptionPromocode saveObj = new SubscriptionPromocode();
			saveObj.setWebsiteId(objBean.getWebsiteId());
			saveObj.setWebUrl(objBean.getWebUrl());
			saveObj.setCourseId(objBean.getCourseId());
			saveObj.setCourseTitle(objBean.getCourseTitle());
			
			saveObj.setCode(objBean.getCode());
			saveObj.setDiscountType(objBean.getDiscountType());
			saveObj.setDiscount(objBean.getDiscount());
			saveObj.setDescription(objBean.getDescription());
			
			saveObj.setStatus(objBean.getStatus());
			saveObj.setDisplayPublic(objBean.getDisplayPublic());
			
			if(objBean.getStartDate()!=null && objBean.getStartDate().length()>2 ) {
				saveObj.setStartDate(mkdateObj.getStringToDate(objBean.getStartDate(), "yyyy-MM-dd"));
			}
			if(objBean.getEndDate()!=null && objBean.getEndDate().length()>2 ) {
				saveObj.setEndDate(mkdateObj.getStringToDate(objBean.getEndDate(), "yyyy-MM-dd"));
			}

			stRepo.save(saveObj);
			
			logger.info("PromoCreationAdminService: SAVED");

			responseObj.setResponseTxt("success");
			
			entityManager.getTransaction().commit();
			entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
