package com.bizofficer.teacher.scheduleliveclass;

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.api.zoom.AZoomMeetingUtils;
import com.bizofficer.api.zoom.ZoomBean;
import com.bizofficer.api.zoom.ZoomMeetingObjectDTO;
import com.bizofficer.hibernate.entity.PgprepLiveClasses;
import com.bizofficer.hibernate.entity.PgprepTeachers;
import com.bizofficer.hibernate.repository.PgprepLiveClassesRepository;
import com.bizofficer.hibernate.repository.PgprepTeachersRepository;
import com.bizofficer.util.system.MakeDate;


@Service
public class SaveLiveClassTeachService{
	
	private static final Logger logger = Logger.getLogger(SaveLiveClassTeachService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepTeachersRepository teachRepo;
	
	@Autowired
	PgprepLiveClassesRepository plcRepo;
	
	@Autowired
	private AZoomMeetingUtils azmuObj;
	
	public Object doExecute(Object obj) throws NotFoundException{
		BeanLiveClassTeach objBean = (BeanLiveClassTeach) obj; 	
		LiveClassTeachResponseBean responseObj = new LiveClassTeachResponseBean();
		
		try {
		
			responseObj.setResponseTxt("failed");

			logger.info("Id: "+objBean.getId());
			logger.info("Token: "+objBean.getToken());
			logger.info("SchoolId: "+objBean.getSchoolId());
			logger.info("Teacher Login Id: "+objBean.getLoginId());
			logger.info("Duration: "+objBean.getDuration());
			logger.info("Status: "+objBean.getStatus());
			logger.info("Class Name: "+objBean.getClassName());
			logger.info("Subject: "+objBean.getSubject());
			logger.info("Start Time: "+objBean.getStartTime());
			logger.info("Note: "+objBean.getNote());
			
			if(objBean.getSchoolId()==null || objBean.getLoginId()==null || objBean.getToken()==null) {
				return responseObj;
			}
			
			PgprepTeachers teachObj = (PgprepTeachers) teachRepo.getIdBySchoolIdAndLoginIdAndLoginToken(objBean.getSchoolId(), objBean.getLoginId(), objBean.getToken());
			if(teachObj==null) {
				return responseObj;
			}

			logger.info("Verified ID: " + teachObj.getId() );
			logger.info("School ID: " + teachObj.getSchoolId() );
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			MakeDate mkdate = new MakeDate();
			
			String whereSql="";
			if(objBean.getId()!=null && objBean.getId()>0) {
				whereSql=" AND id!=:id ";
			}
			
			///CHECK MULTIPLE LIVE CLASS CAN BE SET AT SAME DATE AND TIME
			TypedQuery<PgprepLiveClasses> querySCT = (TypedQuery<PgprepLiveClasses>) entityManager.createQuery("from "+PgprepLiveClasses.class.getName()+" where schoolId=:schoolId AND teacherId=:teacherId AND className=:className AND subject=:subject AND startTime=:startTime "+whereSql, PgprepLiveClasses.class);
			querySCT.setParameter("schoolId", teachObj.getSchoolId());
			querySCT.setParameter("teacherId", teachObj.getId());
			querySCT.setParameter("className", objBean.getClassName());
			querySCT.setParameter("subject", objBean.getSubject());
			querySCT.setParameter("startTime", mkdate.getStringToDate(objBean.getStartTime(), "yyyy-MM-dd HH:mm:ss"));
			if(objBean.getId()!=null && objBean.getId()>0) {
				querySCT.setParameter("id", objBean.getId());
			}
			querySCT.setFirstResult(0);
			querySCT.setMaxResults(1);
			List<?> resultListSCT = querySCT.getResultList();
			Iterator<?> iteratorSCT=resultListSCT.iterator();
			if(iteratorSCT.hasNext()) {
				
				responseObj.setResponseTxt("AlreadyExistsError");
				logger.info("**************************************************************");
				logger.info("AlreadyExistsError");
				logger.info("Teacher Id: "+objBean.getLoginId());
				logger.info("**************************************************************");

			}else{
			
				Integer autoTestId = 0; 
				PgprepLiveClasses saveObj = null;
				if(objBean.getId()!=null && objBean.getId()>0) {
					saveObj = (PgprepLiveClasses)entityManager.find(PgprepLiveClasses.class ,objBean.getId());
					saveObj.setModifiedDateTime(mkdate.getCurrentTimeStamp());
					saveObj.setModifiedBy(objBean.getLoginId());
				}else {
					saveObj = new PgprepLiveClasses();
					saveObj.setSchoolId(objBean.getSchoolId());
					saveObj.setCreatedDateTime(mkdate.getCurrentTimeStamp());
					saveObj.setCreatedBy(objBean.getLoginId());
					saveObj.setModifiedDateTime(mkdate.getCurrentTimeStamp());
					saveObj.setModifiedBy(objBean.getLoginId());
				}

				
				//CREATE ZOOM MEETING	
				if(objBean.getStartTime()!=null && objBean.getStartTime().length()>5) {
					ZoomBean zmBean = new ZoomBean();
					zmBean.setAgenda(objBean.getSubject()+" "+objBean.getClassName());
					zmBean.setStartTime(mkdate.getStringToDate(objBean.getStartTime(), "yyyy-MM-dd HH:mm:ss"));
					zmBean.setDuration(objBean.getDuration());
					ZoomMeetingObjectDTO dtoObj = (ZoomMeetingObjectDTO) (Object) azmuObj.createMeeting(zmBean);
					saveObj.setMeetingNumber(String.valueOf(dtoObj.getId()));					
					saveObj.setMeetingPassword(dtoObj.getPassword());
				}
				
				
				saveObj.setClassName(objBean.getClassName());
				saveObj.setSubject(objBean.getSubject());					
				saveObj.setTeacherId(teachObj.getId());

				saveObj.setDuration(objBean.getDuration());
				saveObj.setNote(objBean.getNote());
				saveObj.setStatus(objBean.getStatus());
				
				if(objBean.getStartTime()!=null && objBean.getStartTime().length()>5) {
					saveObj.setStartTime(mkdate.getStringToDate(objBean.getStartTime(), "yyyy-MM-dd HH:mm:ss"));
				}
				
				if(objBean.getId()!=null && objBean.getId()>0) {
					entityManager.getTransaction().commit();
					autoTestId = objBean.getId();
				}else {
					PgprepLiveClasses resultObj = plcRepo.save(saveObj);
					autoTestId = resultObj.getId();
				}
			
				if(autoTestId!=null && autoTestId>0 && saveObj.getMeetingNumber()!=null && saveObj.getMeetingNumber().length()>2 ){
					responseObj.setResponseTxt("success");
					logger.info("**************************************************************");
					logger.info("Successfully Teacher Login Id: "+objBean.getLoginId());
					logger.info("**************************************************************");
				}
				
			}	
			
			entityManager.getTransaction().commit();
			entityManager.close();
			
			
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		///logger.info( "dataList >>> " +  dataList );
			
		return responseObj;
	}
	
	

	
}
