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;
    }

}