package com.nisum.mytime.service;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Time;
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 + "'"
                    + MyTimeUtils.ABESENT_STATUS_QUERY1 + "'" + toDate + "'"
                    + MyTimeUtils.ABESENT_STATUS_QUERY3;
        else
            querys = MyTimeUtils.ABESENT_STATUS_QUERY + "'" + fromDate + "'"
                    + MyTimeUtils.ABESENT_STATUS_QUERY1 + "'" + toDate + "'"
                    + 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;
    }
}