package com.bizofficer.subscription.payments;



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.PgprepStudentCourses;
import com.bizofficer.hibernate.entity.SubscriptionCourses;
import com.bizofficer.hibernate.entity.SubscriptionPaymentPayload;
import com.bizofficer.hibernate.entity.SubscriptionPaymentTransaction;
import com.bizofficer.hibernate.repository.PgprepStudentCoursesRepository;
import com.bizofficer.hibernate.repository.PgprepTestSummaryRepository;
import com.bizofficer.hibernate.repository.SubscriptionPaymentPayloadRepository;
import com.bizofficer.hibernate.repository.SubscriptionPaymentTransactionRepository;
import com.bizofficer.subscription.courses.PayloadBean;
import com.bizofficer.util.system.MakeDate;
import com.fasterxml.jackson.databind.ObjectMapper;


@Service
public class PaymentGatewayResponseService{
	
	private static final Logger logger = Logger.getLogger(PaymentGatewayResponseService.class);
	
    @Autowired
	EntityManagerFactory entityManagerFactory;
    
    @Autowired
    SubscriptionPaymentPayloadRepository sppRepo;
    
    @Autowired
    PgprepStudentCoursesRepository pscRepo;
    
    @Autowired
    SubscriptionPaymentTransactionRepository sptRepo;
    
    @Autowired
    PgprepTestSummaryRepository testSumRepo;
    
	public Object execute(Object obj) throws NotFoundException{
		PaymentGatewayBean objBean = (PaymentGatewayBean) obj; 	
		PaymentTokenResponseBean responseBeanObj = new PaymentTokenResponseBean();
		
		try {
			
			logger.info("mihpayid: "+objBean.getMihpayid() );
			logger.info("mode: "+objBean.getMode() );
			logger.info("status: "+objBean .getStatus() );
			logger.info("txnid: "+objBean.getTxnid() );
			logger.info("addedon: "+objBean.getAddedon() );
			logger.info("productinfo: "+objBean.getProductinfo() );
			logger.info("firstname: "+objBean.getFirstname() );
			logger.info("email: "+objBean.getEmail() );
			logger.info("phone: "+objBean.getPhone() );
			logger.info("hash: "+objBean.getHash() );
			logger.info("Amount: "+objBean.getAmount() );
		
			if(objBean.getMihpayid()==null && !objBean.getStatus().equals("success")) {
				return responseBeanObj;
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			MakeDate dateObj = new MakeDate();
			SubscriptionPaymentTransaction sptSave = new SubscriptionPaymentTransaction();
			
			if(objBean.getTxnid()!=null && objBean.getTxnid().length()>0 ) {
				TypedQuery<SubscriptionPaymentPayload> query = (TypedQuery<SubscriptionPaymentPayload>) entityManager.createQuery("from "+SubscriptionPaymentPayload.class.getName()+" WHERE token=:token ", SubscriptionPaymentPayload.class);
				query.setParameter("token", objBean.getTxnid() );			
				query.setFirstResult(0);
				query.setMaxResults(1);
				List<?> resultList = query.getResultList();
				Iterator<?> iterator=resultList.iterator();
				if(iterator.hasNext()){
					SubscriptionPaymentPayload mySPP = (SubscriptionPaymentPayload)iterator.next();
					
					logger.info("FOUND TOKEN PAYLOAD");
					
					ObjectMapper objectMapper = new ObjectMapper();
					PayloadBean myPayLoad = objectMapper.readValue(mySPP.getPayload(), PayloadBean.class);
				    
					logger.info("StudentId: "+myPayLoad.getStudentId());
					logger.info("CourseId: "+myPayLoad.getCourseId());
					
					responseBeanObj.setStudentId(myPayLoad.getStudentId());
					responseBeanObj.setCourseId(myPayLoad.getCourseId());
					
					TypedQuery<PgprepStudentCourses> querySC = (TypedQuery<PgprepStudentCourses>) entityManager.createQuery("from "+PgprepStudentCourses.class.getName()+" WHERE studentId=:studentId AND courseId=:courseId ", PgprepStudentCourses.class);
					querySC.setParameter("studentId", myPayLoad.getStudentId() );
					querySC.setParameter("courseId", myPayLoad.getCourseId() );			
					querySC.setFirstResult(0);
					querySC.setMaxResults(1);
					List<?> resultListSC = querySC.getResultList();
					Iterator<?> iteratorSC=resultListSC.iterator();
					if(iteratorSC.hasNext()){
						PgprepStudentCourses myPGSC = (PgprepStudentCourses)iteratorSC.next();
						
						logger.info("CONVERT FREE COURSE TO PAID ");
						
						TypedQuery<SubscriptionCourses> queryCors = (TypedQuery<SubscriptionCourses>) entityManager.createQuery("from "+SubscriptionCourses.class.getName()+" WHERE courseId=:courseId ", SubscriptionCourses.class);
						queryCors.setParameter("courseId", myPayLoad.getCourseId() );			
						queryCors.setFirstResult(0);
						queryCors.setMaxResults(1);
						List<?> resultCors = queryCors.getResultList();
						Iterator<?> iteratorCors=resultCors.iterator();
						if(iteratorCors.hasNext()){
							SubscriptionCourses myCors = (SubscriptionCourses)iteratorCors.next();
							
							logger.info("REPLACE ORGANIZATION ID IN TEST SUMMARY");
							testSumRepo.replaceOrgId(myPGSC.getOrganisationId(), myPayLoad.getStudentId(), myCors.getPaidOrganisationId());
							
							sptSave.setWebsiteId(myCors.getWebsiteId());
							sptSave.setDomainName(myCors.getWebUrl());					
							sptSave.setCourseId(myCors.getCourseId());
							sptSave.setCourseName(myCors.getCourseTitle());
							sptSave.setCreatedDateTime(dateObj.getCurrentTimeStamp());
							
							logger.info("UPDATE PAID COURSE TO STUDENT ");
							PgprepStudentCourses editObj = (PgprepStudentCourses)entityManager.find(PgprepStudentCourses.class ,myPGSC.getId());
							editObj.setCourseTitle(myCors.getCourseTitle());					
							editObj.setSubscriptionType("PAID");
							editObj.setOrganisationId(myCors.getPaidOrganisationId());
							
							if(myCors.getValidityDate()!=null) {
								editObj.setValidTillDate(dateObj.getStringToDate(myCors.getValidityDate().toString(), "yyyy-MM-dd"));
							}
							
							
							
						}
						
					}else {
						
						logger.info("ADD NEW PAID COURSE TO STUDENT ");
						
						/// IF COURSE IS NOT SELECTED *******************************************
						TypedQuery<SubscriptionCourses> queryCors = (TypedQuery<SubscriptionCourses>) entityManager.createQuery("from "+SubscriptionCourses.class.getName()+" WHERE courseId=:courseId ", SubscriptionCourses.class);
						queryCors.setParameter("courseId", myPayLoad.getCourseId() );			
						queryCors.setFirstResult(0);
						queryCors.setMaxResults(1);
						List<?> resultCors = queryCors.getResultList();
						Iterator<?> iteratorCors=resultCors.iterator();
						if(iteratorCors.hasNext()){
							SubscriptionCourses myCors = (SubscriptionCourses)iteratorCors.next();
		
							sptSave.setWebsiteId(myCors.getWebsiteId());
							sptSave.setDomainName(myCors.getWebUrl());					
							sptSave.setCourseId(myCors.getCourseId());
							sptSave.setCourseName(myCors.getCourseTitle());
							sptSave.setCreatedDateTime(dateObj.getCurrentTimeStamp());
							
							PgprepStudentCourses saveObj = new PgprepStudentCourses();
							saveObj.setSid(myPayLoad.getSid());
							saveObj.setCourseId(myPayLoad.getCourseId());
							saveObj.setCourseTitle(myCors.getCourseTitle());					
							saveObj.setStudentId(myPayLoad.getStudentId());
							saveObj.setSubscriptionType("PAID");
							saveObj.setOrganisationId(myCors.getPaidOrganisationId());
							
							if(myCors.getValidityDate()!=null) {
								saveObj.setValidTillDate(dateObj.getStringToDate(myCors.getValidityDate().toString(), "yyyy-MM-dd"));
							}
							
							pscRepo.save(saveObj);
							
						}
						
						
					}
				
					///SAVE PAYMENT TRANSACTION
					sptSave.setAmount(myPayLoad.getAmount());
					sptSave.setReferenceNumber(objBean.getMihpayid());
					sptSave.setTxnid(objBean.getTxnid());
					sptSave.setStudentId(myPayLoad.getStudentId());
					sptSave.setStudentName(myPayLoad.getStudentName());
					sptSave.setPromoCode(myPayLoad.getPromoCode());
					sptRepo.save(sptSave);
			
					///DELETE SUCCESS PAYMENT TOKEN PAYLOAD
					sppRepo.deleteById(mySPP.getId());
					
				}	
			}
			
            entityManager.getTransaction().commit();
			entityManager.close();
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return responseBeanObj;
	}
	
	
	
	
}
