package com.bizofficer.subscription.promocode;



import java.math.BigDecimal;
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.stereotype.Service;

import com.bizofficer.hibernate.entity.PgprepStudentDetails;
import com.bizofficer.hibernate.entity.SubscriptionCourses;
import com.bizofficer.hibernate.entity.SubscriptionPromocode;
import com.bizofficer.hibernate.repository.PgprepStudentDetailsRepository;
import com.bizofficer.hibernate.repository.SubscriptionCoursesRepository;



@Service
public class PromoCodeVerifyingService{
	
	private static final Logger logger = Logger.getLogger(PromoCodeVerifyingService.class);
	
    @Autowired
	EntityManagerFactory entityManagerFactory;
    
    @Autowired
	PgprepStudentDetailsRepository stuRepo;
    
    @Autowired
    SubscriptionCoursesRepository corsRepo;
	
	public Object execute(PromoCodeBean objBean){
		PromoCodeVerifyingResponseBean respObj = new PromoCodeVerifyingResponseBean();		
		
		try {
			
			logger.info("START ************************* PromoCodeVerifyingService *******************************");
			
			logger.info("PromoCodeVerifyingService StudentId >> " + objBean.getStudentId() );
			logger.info("PromoCodeVerifyingService WebUrl >> " + objBean.getWebUrl() );
			logger.info("PromoCodeVerifyingService Promo Code >> " + objBean.getPromoCode() );			
			logger.info("PromoCodeVerifyingService CourseId >> " + objBean.getCourseId() );

			respObj.setResponseTxt("failed");
			
			if(objBean.getCourseId()==null && objBean.getWebUrl()==null || objBean.getPromoCode()==null || objBean.getStudentId()==null) {
				return respObj;
			}
			
			PgprepStudentDetails stuObj = (PgprepStudentDetails) stuRepo.findIdByStudentId(objBean.getStudentId());
			if(stuObj==null) {
				return respObj;
			}
			
			logger.info("Verified Student >> " + stuObj.getId() );
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			TypedQuery<SubscriptionPromocode> query = (TypedQuery<SubscriptionPromocode>) entityManager.createQuery("from "+SubscriptionPromocode.class.getName()+" WHERE discount>0 AND CURDATE()>=startDate AND CURDATE()<=endDate AND status=1 AND webUrl=:webUrl AND code=:code  ", SubscriptionPromocode.class);
			query.setParameter("webUrl", objBean.getWebUrl());
			query.setParameter("code", objBean.getPromoCode());
			query.setFirstResult(0);
			query.setMaxResults(1);
			List<?> resultList = query.getResultList();
			Iterator<?> iterator=resultList.iterator();
			if(iterator.hasNext()){
				SubscriptionPromocode myObj = (SubscriptionPromocode)iterator.next();		
				
				logger.info("Valid Code: " + objBean.getPromoCode() );
				
				SubscriptionCourses myCourse = corsRepo.findByCourseId(objBean.getCourseId());
				logger.info("Sale Price: " + myCourse.getSalePrice() );
				
				BigDecimal amount = new BigDecimal(0);
				if("Percent".equals(myObj.getDiscountType()) && myObj.getDiscount()>0 && myCourse.getSalePrice().compareTo(new BigDecimal(0))==1) {
					BigDecimal discountedAmount = new BigDecimal(myObj.getDiscount()).divide(new BigDecimal(100)).multiply(myCourse.getSalePrice());
					logger.info("DiscountedAmount: " + discountedAmount );
					amount = myCourse.getSalePrice().subtract(discountedAmount);
					logger.info("Amount: " + amount );
				}else if(myObj.getDiscount()>0 && myCourse.getSalePrice().compareTo(new BigDecimal(0))==1){ // Fixed
					if(myObj.getDiscount()!=null && myCourse.getSalePrice().compareTo(new BigDecimal(myObj.getDiscount()))==1 ) {
						amount = myCourse.getSalePrice().subtract(new BigDecimal(myObj.getDiscount()));
						logger.info("Fixed Amount: " + amount );
					}
				}
				
				logger.info("Calculated: " + amount );
				
				if(myObj.getCourseId()!=null && myObj.getCourseId()>0) {
					if(myObj.getCourseId()==objBean.getCourseId()) {						
						respObj.setAmount(amount.intValue());
						respObj.setResponseTxt("success");
					}else {
						logger.info("Bound with course Id, Invalid Code: " + objBean.getPromoCode() );
						respObj.setResponseTxt("invalid");
					}
				}else{
					respObj.setAmount(amount.intValue());
					respObj.setResponseTxt("success");
				}
				
			}else {
				logger.info("Invalid Code: " + objBean.getPromoCode() );
				respObj.setResponseTxt("invalid");
			}
           
			
            entityManager.getTransaction().commit();
			entityManager.close();
			
			
			logger.info("END ************************* PromoCodeVerifyingService *******************************");
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return respObj;
	}
	
	
	
	
}
