package com.nisum.mytime.service;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Time;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.nisum.mytime.configuration.DbConnection;
import com.nisum.mytime.exception.handler.MyTimeException;
import com.nisum.mytime.model.EmpLoginData;
import com.nisum.mytime.utils.MyTimeLogger;
import com.nisum.mytime.utils.MyTimeUtils;

@Component
@Transactional
public class EmployeeDataService {

    @Autowired
    DbConnection dbConnection;

    	public List<EmpLoginData> fetchEmployeeLoginsBasedOnDates(long employeeId, String fromDate, String toDate) throws MyTimeException {
            long start_ms = System.currentTimeMillis();
            String querys = null;
            if (employeeId == 0) {
                querys = MyTimeUtils.ABESENT_STATUS_QUERY + "'" + fromDate.replace("-", "/") + "'"
                        + MyTimeUtils.ABESENT_STATUS_QUERY1 + "'" + toDate.replace("-", "/") + "'"
                        + MyTimeUtils.ABESENT_STATUS_QUERY3;
            } else {
                querys = MyTimeUtils.ABESENT_STATUS_QUERY + "'" + fromDate.replace("-", "/") + "'"
                        + MyTimeUtils.ABESENT_STATUS_QUERY1 + "'" + toDate.replace("-", "/") + "'"
                        + MyTimeUtils.ABESENT_STATUS_QUERY2 + employeeId
                        + MyTimeUtils.ABESENT_STATUS_QUERY3;
            }
            int countHours = 0;
            List<EmpLoginData> listOfEmpLoginData = new ArrayList<>();

            try (Connection connection = dbConnection.getDBConnection();
                    Statement statement = connection.createStatement();
                    ResultSet resultSet = statement.executeQuery(querys.toString())) {
                while (resultSet.next()) {
                    EmpLoginData empLoginData = new EmpLoginData();
                    empLoginData.setEmployeeId(resultSet.getString("EmployeeCode"));
                    empLoginData.setEmployeeName(resultSet.getString("FirstName"));
                    empLoginData.setDateOfLogin(resultSet.getDate("FirstLogin").toString());
                    empLoginData.setFirstLogin(resultSet.getTime("FirstLogin").toString());
                    empLoginData.setLastLogout(resultSet.getTime("LastLogin").toString());
                    Time from = resultSet.getTime("FirstLogin");
                    Time to = resultSet.getTime("LastLogin");
                    long milliseconds = to.getTime() - from.getTime();
                    int seconds = (int) milliseconds / 1000;
                    int hours = seconds / 3600;
                    int minutes = (seconds % 3600) / 60;
                    seconds = (seconds % 3600) % 60;

                    empLoginData.setTotalLoginTime(hours + ":" + minutes + ":" + seconds);
                    empLoginData.setTotalLoginTime(hours + ":" + minutes + ":" + seconds);
                    Date d = MyTimeUtils.tdf.parse(empLoginData.getTotalLoginTime());
                    countHours += d.getTime();
                    listOfEmpLoginData.add(empLoginData);
                }
                if (!listOfEmpLoginData.isEmpty()) {
                    listOfEmpLoginData.get(0).setTotalAvgTime(MyTimeUtils.tdf.format(countHours / listOfEmpLoginData.size()));
                }
                MyTimeLogger.getInstance().info(" Time Taken fecth Employee data based on Dates ::: " + (System.currentTimeMillis() - start_ms));
            } catch (Exception e) {
                e.printStackTrace();
                MyTimeLogger.getInstance().error(e.getMessage());
                throw new MyTimeException(e.getMessage());
            }
            return listOfEmpLoginData;
      }
        
        public List<EmpLoginData> fetchEmployeeLoginsBasedOnDatesTime(long employeeId, String fromDate, String nextDate,String toDate,String fromTime,String toTime) throws MyTimeException {
        	DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        	LocalDate formatedFromDate=LocalDate.parse(fromDate,formatter);
        	LocalDate formatedNextDate=LocalDate.parse(nextDate,formatter);
        	LocalDate formatedToDate=LocalDate.parse(toDate,formatter);
        	int differentBetweenDays=Period.between(formatedFromDate, formatedToDate).getDays();    
        	long start_ms = System.currentTimeMillis();
            String querys = null;                           
            List<EmpLoginData> listOfEmpLoginData = new ArrayList<>();                
            for(int i=0;i<=differentBetweenDays;i++) {  
            	String date1=fromDate+" "+fromTime;
            	String date2=nextDate+" "+toTime;
            	if(i>0) {
                    fromDate= formatedFromDate.plusDays(1).toString();        
                    formatedFromDate=LocalDate.parse(fromDate); 
                    nextDate= formatedNextDate.plusDays(1).toString(); 	
                    formatedNextDate=LocalDate.parse(nextDate); 
                   date1= fromDate+" "+fromTime;
                   date2=nextDate+" "+toTime;             
            	}
                querys =MyTimeUtils.LOGIN_REPORT_BY_TIME + "'" +date1+ "'"+MyTimeUtils.LOGIN_REPORT_BY_TIME2+"'"+date2+"'"
                		+MyTimeUtils.LOGIN_REPORT_BY_TIME3+employeeId+ MyTimeUtils.LOGIN_REPORT_BY_TIME4;
                
            int countHours = 0;
            try (Connection connection = dbConnection.getDBConnection();
                    Statement statement = connection.createStatement();
                    ResultSet resultSet = statement.executeQuery(querys.toString())) {
                	while (resultSet.next()) {
                    EmpLoginData empLoginData = new EmpLoginData();
                    empLoginData.setEmployeeId(resultSet.getString("EmployeeCode"));
                    empLoginData.setEmployeeName(resultSet.getString("FirstName"));
                    empLoginData.setDateOfLogin(resultSet.getDate("FirstLogin").toString());
                    empLoginData.setFirstLogin(resultSet.getTime("FirstLogin").toString());
                    empLoginData.setLastLogout(resultSet.getTime("LastLogin").toString());
                    
                    LocalDateTime loginTime= resultSet.getTimestamp("FirstLogin").toLocalDateTime();
                    LocalDateTime logoutTime= resultSet.getTimestamp("LastLogin").toLocalDateTime();
                     
            	    long totalseconds = java.time.Duration.between(loginTime, logoutTime).getSeconds();
                    int hours = (int) (totalseconds / 3600);
                    int minutes = (int) ((totalseconds % 3600) / 60);
                    int seconds = (int) ((totalseconds % 3600) % 60);  
                
                    empLoginData.setTotalLoginTime(hours + ":" + minutes + ":" + seconds);
                    Date d = MyTimeUtils.tdf.parse(empLoginData.getTotalLoginTime());
                    countHours += d.getTime();

                    listOfEmpLoginData.add(empLoginData);
                                 
                }
                if (!listOfEmpLoginData.isEmpty()) {
                    listOfEmpLoginData.get(0).setTotalAvgTime(MyTimeUtils.tdf.format(countHours / listOfEmpLoginData.size()));
                }
                MyTimeLogger.getInstance().info(" Time Taken fecth Employee data based on Dates ::: " + (System.currentTimeMillis() - start_ms));            
            } catch (Exception e) {
                e.printStackTrace();
                MyTimeLogger.getInstance().error(e.getMessage());
                throw new MyTimeException(e.getMessage());
            }
       } 
            return listOfEmpLoginData;
        }
}