package com.bizofficer.website.courses;



import java.util.ArrayList;
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.SubscriptionCourses;
import com.bizofficer.hibernate.entity.SubscriptionPromocode;
import com.bizofficer.hibernate.repository.SubscriptionCoursesTabsRepository;
import com.bizofficer.pojo.response.ResponsePojo;
import com.bizofficer.subscription.courses.CoursePromoBean;
import com.bizofficer.util.system.MakeDate;
import com.bizofficer.website.rating.RatingListService;
import com.bizofficer.website.rating.RatingReqBean;
import com.bizofficer.website.rating.RatingResponseBean;


@Service
public class WebCourseDetailsService{
	
	private static final Logger logger = Logger.getLogger(WebCourseDetailsService.class);
	
    @Autowired
	EntityManagerFactory entityManagerFactory;
	
    @Autowired
    private SubscriptionCoursesTabsRepository objSubscriptionCoursesTabsRepository;
    
    @Autowired
    private RatingListService objRatingListService;
    
	public Object execute(Object obj){
		AWebCoursesBean objBean = (AWebCoursesBean) obj; 	
		ResponsePojo responseObj = new ResponsePojo();
		
		try {

			responseObj.setResponseTxt("failed");
			
			logger.info("CourseId: "+objBean.getCourseId());
			
			if(objBean.getCourseId()==null) {
				return responseObj;
			}			

			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			MakeDate dateObj = new MakeDate();
			CoursePromoBean coursePromoBeanObj = null; 
			
				TypedQuery<SubscriptionCourses> query = (TypedQuery<SubscriptionCourses>) entityManager.createQuery("from "+SubscriptionCourses.class.getName()+" WHERE status=1 AND courseId=:courseId ", SubscriptionCourses.class);
				query.setParameter("courseId", objBean.getCourseId() );
				query.setFirstResult(0);
				query.setMaxResults(1);
				List<?> resultList = query.getResultList();
				Iterator<?> iterator=resultList.iterator();
				if(iterator.hasNext()){
					SubscriptionCourses myCrsObj = (SubscriptionCourses)iterator.next();
					
					WebCoursesDetailsBean corsResObj = new WebCoursesDetailsBean();
					corsResObj.setCourseId(myCrsObj.getCourseId());
					corsResObj.setCourseTitle(myCrsObj.getCourseTitle());
					
					if(myCrsObj.getCourseUrl()!=null && myCrsObj.getCourseUrl().length()>0) {
						corsResObj.setCourseUrl(myCrsObj.getCourseUrl().trim().replaceAll(" ", "-").toLowerCase());
					}
					
					corsResObj.setCourseSubTitle(myCrsObj.getCourseSubTitle());
					corsResObj.setHeadingDescription(myCrsObj.getHeadingDescription());

					corsResObj.setStudyRoom(myCrsObj.getStudyRoom());
					corsResObj.setExamPrep(myCrsObj.getExamPrep());
					
					//corsResObj.setValidityNumber(myCrsObj.getValidityNumber());
					//corsResObj.setValidityUnit(myCrsObj.getValidityUnit());

					corsResObj.setCourseDetailMobile(myCrsObj.getCourseDetailMobile());
					
					corsResObj.setRetailPrice(myCrsObj.getRetailPrice());
					corsResObj.setSalePrice(myCrsObj.getSalePrice());
					corsResObj.setDiscount(myCrsObj.getDiscount());
					
					corsResObj.setMetaTitle(myCrsObj.getMetaTitle());
					corsResObj.setMetaDescription(myCrsObj.getMetaDescription());
					corsResObj.setMetaKeywords(myCrsObj.getMetaKeywords());
					
					if(myCrsObj.getValidityDate()!=null) {
						corsResObj.setValidityDate(dateObj.dateToString(myCrsObj.getValidityDate(), "dd-MM-yyyy"));
					}
					
					
					List<CoursePromoBean> promoList = new ArrayList<CoursePromoBean>();
					
					TypedQuery<SubscriptionPromocode> queryPC = (TypedQuery<SubscriptionPromocode>) entityManager.createQuery("from "+SubscriptionPromocode.class.getName()+" WHERE CURDATE()>=startDate AND CURDATE()<=endDate AND status=1 AND displayPublic=1 AND websiteId=:websiteId AND (courseId=:courseId OR courseId is null OR courseId<1) order by id  ", SubscriptionPromocode.class);
					queryPC.setParameter("websiteId", myCrsObj.getWebsiteId() );
					queryPC.setParameter("courseId", myCrsObj.getCourseId());
					queryPC.setFirstResult(0);
					queryPC.setMaxResults(3);
					List<?> resultPCList = queryPC.getResultList();
					Iterator<?> iteratorPC = resultPCList.iterator();
					while(iteratorPC.hasNext()){
						SubscriptionPromocode myPCObj = (SubscriptionPromocode)iteratorPC.next();		
						
						coursePromoBeanObj = new CoursePromoBean();
						coursePromoBeanObj.setDescription(myPCObj.getDescription());	
						
						promoList.add(coursePromoBeanObj);
						
					}
					
					corsResObj.setPromoList(promoList);

					
					
					List<?> coursesTabs = objSubscriptionCoursesTabsRepository.findByCourseIdAndStatus(myCrsObj.getCourseId(), 1);
					if(coursesTabs!=null) {
						corsResObj.setTabs(coursesTabs);
					}
					
					List<WebCoursesDetailsBean> relatedCoursesList = new ArrayList<WebCoursesDetailsBean>();
					TypedQuery<SubscriptionCourses> queryCors = (TypedQuery<SubscriptionCourses>) entityManager.createQuery("from "+SubscriptionCourses.class.getName()+" WHERE status=1 AND categoryId=:categoryId ORDER BY rand() ", SubscriptionCourses.class);
					queryCors.setParameter("categoryId", myCrsObj.getCategoryId() );
					queryCors.setFirstResult(0);
					queryCors.setMaxResults(4);
					List<?> resultListCors = queryCors.getResultList();
					Iterator<?> iteratorCors=resultListCors.iterator();
					while(iteratorCors.hasNext()){
						SubscriptionCourses myRCors = (SubscriptionCourses)iteratorCors.next();
						
						WebCoursesDetailsBean wbCorsObj = new WebCoursesDetailsBean();
						wbCorsObj.setCategoryName(myRCors.getCategoryName());
						wbCorsObj.setCourseId(myRCors.getCourseId());
						wbCorsObj.setCourseTitle(myRCors.getCourseTitle());
						
						if(myRCors.getCourseUrl()!=null && myRCors.getCourseUrl().length()>0) {
							wbCorsObj.setCourseUrl(myRCors.getCourseUrl().trim().replaceAll(" ", "-").toLowerCase());
						}
						
						relatedCoursesList.add(wbCorsObj);
					}	
					
					corsResObj.setRelatedCourses(relatedCoursesList);

					
					RatingReqBean ratingReq = new RatingReqBean();
					ratingReq.setCourseId(objBean.getCourseId());
					RatingResponseBean ratingResponseObj = (RatingResponseBean) objRatingListService.execute(ratingReq);
					corsResObj.setRatingReviewsObj(ratingResponseObj);

					
					responseObj.setObj(corsResObj);
					
					
				}	
                        
            entityManager.getTransaction().commit();
			entityManager.close();
			
			
			responseObj.setResponseTxt("success");
			
		}catch(Exception e) {
			e.getStackTrace();			
		}
		
		
		return responseObj;
	}
	
	
	
	
}
