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.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 CoursesCreationAdminService{
	
	private static final Logger logger = Logger.getLogger(CoursesCreationAdminService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepAdministratorRepository adminRepo;
	
	@Autowired
	SubscriptionCoursesRepository stRepo;
	
	public Object execute(AdminSubscriptionBean objBean){		
		SubscriptionResponseBean responseObj = new SubscriptionResponseBean();
		
		try {
			
			responseObj.setResponseTxt("failed");
			
			logger.info("LoginEmailId >> " + objBean.getLoginEmailId() );
			logger.info("Token >> " + objBean.getToken() );
			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("Validity Date >> " + objBean.getValidityDate() );
			
			if(objBean.getLoginEmailId()==null || objBean.getToken()==null || objBean.getCategoryName()==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.getCreate()==null || prvgbnObj.getCreate()==0))) {
					logger.info("NoAuthorization");
					responseObj.setResponseTxt("NoAuthorization");
					return responseObj;
				}
			}
			
			SubscriptionCourses webObj = stRepo.findIdByCourseTitleAndWebsiteIdAndCategoryId(objBean.getCourseTitle(), objBean.getWebsiteId(), objBean.getCategoryId() );
			logger.info("Existing >> " + webObj );
			if(webObj!=null && webObj.getCategoryId()>0) {
				responseObj.setResponseTxt("AlreadyExistsError");
				return responseObj;
			}
			
			logger.info("CoursesCreationAdminService: NO EXIST AVAILABLE");
			
			MakeDate mkdateObj = new MakeDate();
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();


			SubscriptionCourses saveObj = new SubscriptionCourses();
			saveObj.setWebsiteId(objBean.getWebsiteId());
			saveObj.setWebUrl(objBean.getWebUrl());
			saveObj.setFreeOrganisationId(objBean.getFreeOrganisationId());
			saveObj.setFreeOrganisationName(objBean.getFreeOrganisationName());
			saveObj.setPaidOrganisationId(objBean.getPaidOrganisationId());
			saveObj.setPaidOrganisationName(objBean.getPaidOrganisationName());
			saveObj.setCategoryId(objBean.getCategoryId());
			saveObj.setCategoryName(objBean.getCategoryName());
			
			saveObj.setCourseTitle(objBean.getCourseTitle());
			saveObj.setCourseSubTitle(objBean.getCourseSubTitle());
			saveObj.setHeadingDescription(objBean.getHeadingDescription());

			if(objBean.getCourseTitle()!=null && objBean.getCourseTitle().length()>0 ) {
				saveObj.setCourseUrl(objBean.getCourseTitle().replaceAll(" ", "-"));
			}
			
			saveObj.setCourseDetailMobile(objBean.getCourseDetailMobile());
			saveObj.setRetailPrice(objBean.getRetailPrice());
			saveObj.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("CoursesCreationAdminService: discount: "+discount);
				
				MathContext mc = new MathContext(5);
				BigDecimal divide = discount.divide(objBean.getRetailPrice(),mc);
				logger.info("CoursesCreationAdminService: divide: "+divide);
				
				BigDecimal percent = divide.multiply(new BigDecimal(100));
				logger.info("CoursesCreationAdminService: percent: "+percent);
				
				logger.info("CoursesCreationAdminService: DISCOUNT ROUND: "+percent.intValue());
				
				saveObj.setDiscount(percent.intValue());
			}else {
				saveObj.setDiscount(0);
			}
			
			logger.info("CoursesCreationAdminService: DISCOUNT CALCULATED");
			
			saveObj.setValidityNumber(objBean.getValidityNumber());
			saveObj.setValidityUnit("days");
			
			if(objBean.getValidityDate()!=null && objBean.getValidityDate().length()>2 ) {
				saveObj.setValidityDate(mkdateObj.getStringToDate(objBean.getValidityDate(), "yyyy-MM-dd"));
			}

			saveObj.setStatus(objBean.getStatus());
			saveObj.setDisplayHome(0);
			
			stRepo.save(saveObj);
			
			logger.info("CoursesCreationAdminService: SAVED");

			responseObj.setResponseTxt("success");
			
			entityManager.getTransaction().commit();
			entityManager.close();
		        
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return responseObj;
	}
	

	
	

	
	
}
