package com.bizofficer.admin.subscription;



import java.math.BigDecimal;
import java.math.MathContext;

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.SubscriptionCourses;
import com.bizofficer.hibernate.repository.PgprepAdministratorRepository;
import com.bizofficer.hibernate.repository.SubscriptionCoursesRepository;
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 CoursesUpdateAdminService{
	
	private static final Logger logger = Logger.getLogger(CoursesUpdateAdminService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	@Autowired
	SubscriptionCoursesRepository stRepo;
	
	public Object execute(AdminSubscriptionBean objBean) throws NotFoundException{
		SubscriptionResponseBean responseObj = new SubscriptionResponseBean();
		
		try {
			
			logger.info("LoginEmailId >> " + objBean.getLoginEmailId() );
			logger.info("Token >> " + objBean.getToken() );

			logger.info("courseId >> " + objBean.getId() );
			logger.info("WebsiteId >> " + objBean.getWebsiteId() );
			logger.info("WebUrl >> " + objBean.getWebUrl() );
			logger.info("FreeOrganisationId >> " + objBean.getFreeOrganisationId() );
			logger.info("FreeOrganisationName >> " + objBean.getFreeOrganisationName() );
			logger.info("PaidOrganisationId >> " + objBean.getPaidOrganisationId() );
			logger.info("PaidOrganisationName >> " + objBean.getPaidOrganisationName() );
			logger.info("CategoryId >> " + objBean.getCategoryId() );
			logger.info("CategoryName >> " + objBean.getCategoryName() );
			logger.info("CourseTitle >> " + objBean.getCourseTitle() );
			logger.info("RetailPrice >> " + objBean.getRetailPrice() );
			logger.info("SalePrice >> " + objBean.getSalePrice() );
			logger.info("ValidityNumber >> " + objBean.getValidityNumber() );
			logger.info("Status >> " + objBean.getStatus() );
			
			if(objBean.getLoginEmailId()==null || objBean.getToken()==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.getCourses() );
				logger.info(prvgbnObj.toString());
				if(prvgbnObj==null || (prvgbnObj!=null && (prvgbnObj.getUpdate()==null || prvgbnObj.getUpdate()==0))) {
					logger.info("NoAuthorization");
					responseObj.setResponseTxt("NoAuthorization");
					return responseObj;
				}
			}
			
			SubscriptionCourses webObj = stRepo.findIdByCourseTitleAndWebsiteIdAndCategoryIdAndCourseIdNot(objBean.getCourseTitle(), objBean.getWebsiteId(), objBean.getCategoryId(), objBean.getId() );
			logger.info("Existing >> " + webObj );
			if(webObj!=null && webObj.getCategoryId()>0) {
				responseObj.setResponseTxt("AlreadyExistsError");
				return responseObj;
			}			
			
			MakeDate mkdateObj = new MakeDate();
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			SubscriptionCourses findObj = (SubscriptionCourses)entityManager.find(SubscriptionCourses.class ,objBean.getId());
			findObj.setWebsiteId(objBean.getWebsiteId());
			findObj.setWebUrl(objBean.getWebUrl());
			findObj.setFreeOrganisationId(objBean.getFreeOrganisationId());
			findObj.setFreeOrganisationName(objBean.getFreeOrganisationName());
			findObj.setPaidOrganisationId(objBean.getPaidOrganisationId());
			findObj.setPaidOrganisationName(objBean.getPaidOrganisationName());
			findObj.setCategoryId(objBean.getCategoryId());
			findObj.setCategoryName(objBean.getCategoryName());
			
			findObj.setCourseTitle(objBean.getCourseTitle());
			findObj.setCourseSubTitle(objBean.getCourseSubTitle());
			findObj.setHeadingDescription(objBean.getHeadingDescription());

			findObj.setStatus(objBean.getStatus());
			
			if(objBean.getCourseTitle()!=null && objBean.getCourseTitle().length()>0 ) {
				findObj.setCourseUrl(objBean.getCourseTitle().replaceAll(" ", "-"));
			}
			
			findObj.setCourseDetailMobile(objBean.getCourseDetailMobile());
			findObj.setRetailPrice(objBean.getRetailPrice());
			findObj.setSalePrice(objBean.getSalePrice());				
			
			if(objBean.getRetailPrice()!=null && objBean.getSalePrice()!=null && objBean.getRetailPrice().compareTo(objBean.getSalePrice())==1){
				BigDecimal discount = objBean.getRetailPrice().subtract(objBean.getSalePrice());
				logger.info("CoursesUpdateAdminService: discount: "+discount);
				
				MathContext mc = new MathContext(5);
				BigDecimal divide = discount.divide(objBean.getRetailPrice(),mc);
				logger.info("CoursesUpdateAdminService: divide: "+divide);
				
				BigDecimal percent = divide.multiply(new BigDecimal(100));
				logger.info("CoursesUpdateAdminService: percent: "+percent);
				
				logger.info("CoursesUpdateAdminService: DISCOUNT ROUND: "+percent.intValue());
				
				findObj.setDiscount(percent.intValue());
				
			}else {
				findObj.setDiscount(0);
			}
			
			findObj.setValidityNumber(objBean.getValidityNumber());
			findObj.setValidityUnit("days");
			
			if(objBean.getValidityDate()!=null && objBean.getValidityDate().length()>2 ) {
				findObj.setValidityDate(mkdateObj.getStringToDate(objBean.getValidityDate(), "yyyy-MM-dd"));
			}
			
			entityManager.getTransaction().commit();
			entityManager.close();

			
			responseObj.setResponseTxt("success");
				
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
