<?php

class QueryProdutividade
{
    private $connection;
    private $connectionmysql;

    public function __construct($connection, $connectionmysql)
    {
        $this->connection = $connection;
        $this->connectionmysql = $connectionmysql;
    }

    public function getQueryGeral($cliente = null, $data_inicio = null, $data_fim = null, $etapa = null)
    {
        $query = "SELECT
        CAST(SUM(CASE 
            WHEN AG.AG1_OP = 1 AND PM.TIPO_MOV = 1 THEN (
                SELECT CAST(SUM(CAST(A2.MULTIPLO AS INTEGER)) AS INTEGER)
                FROM ATENDIMENTO_A2 A2
                WHERE PM.CODIGO_MOV = A2.CODIGO_ATEND_A1 
                AND PM.NUMEROFORMULA_MOV = A2.NUMEROFORMULA 
                AND A2.CONCLUIDOFORMULA = -1
            )
                WHEN AG.AG1_OP = 0 AND PM.TIPO_MOV = 1 THEN 1
                ELSE 0 
                END) AS INTEGER) as QTD_TOTAL,
            CAST(FU.NOMEFUNCIONARIO AS VARCHAR(100)) as MANIPULADOR,
            CAST(FU.CODIGO AS VARCHAR(20)) as CDFUN
                FROM PROCESSO_MANIPULACAO PM
                INNER JOIN FUNCIONARIO FU on PM.CODIGO_FUNCIONARIO = FU.CODIGO
                INNER JOIN FORMAFARMACEUTICA_PROCESSO_TIPO FFP on PM.CODIGO_PROCESSO_TIPO = FFP.CODIGO
                LEFT JOIN UTIL_REL_AG1 (1) AG ON AG.AG1_OP >= 0 
                WHERE 1=1";

        if (!empty($cliente)) {
            $query .= " AND UPPER(CAST(FU.NOMEFUNCIONARIO AS VARCHAR(100))) LIKE UPPER('%" . $cliente . "%')";
        }

        if (!empty($data_inicio) && !empty($data_fim)) {
            $query .= " AND PM.DATA_PROCESSO BETWEEN '" . $data_inicio . "' AND '" . $data_fim . "'";
        }

        if (!empty($etapa) && $etapa <> 'Todos') {
            if (is_array($etapa)) {
                $etapa = array_map('addslashes', $etapa);
                $query .= " AND PM.CODIGO_PROCESSO_TIPO IN ('" . implode("','", $etapa) . "')";
            } else {
                $query .= " AND PM.CODIGO_PROCESSO_TIPO = '" . addslashes($etapa) . "'";
            }
        }

        $query .= " GROUP BY FU.NOMEFUNCIONARIO, FU.CODIGO
            ORDER BY FU.NOMEFUNCIONARIO";

        return $query;
    }

    public function getQueryGeralNova($data_inicio, $data_fim, $etapa = null)
    {
        // Construir filtro de etapa
        $etapa_filter = "";
        if (!empty($etapa)) {
            if (is_array($etapa)) {
                $etapa_values = implode("','", array_map('addslashes', $etapa));
                $etapa_filter = " AND PM.CODIGO_PROCESSO_TIPO IN ('$etapa_values')";
            } else {
                $etapa_filter = " AND PM.CODIGO_PROCESSO_TIPO = '" . addslashes($etapa) . "'";
            }
        }

        $sql = "
        SELECT 
            PM.CODIGO_PROCESSO_TIPO || ' - ' || FFP.NOMETIPO AS PROCESSO,
            CAST(SUM(
                CASE
                    WHEN AG.AG1_OP = 1 AND PM.TIPO_MOV = 1 THEN (
                        SELECT COUNT(*)
                        FROM ATENDIMENTO_A2 A2
                        WHERE PM.CODIGO_MOV = A2.CODIGO_ATEND_A1 
                          AND PM.NUMEROFORMULA_MOV = A2.NUMEROFORMULA
                          AND A2.CONCLUIDOFORMULA = -1
                    )
                    WHEN AG.AG1_OP = 0 AND PM.TIPO_MOV = 1 THEN 1
                    ELSE 0
                END
            ) AS INTEGER) AS TOTAL_FORMULAS_PROCESSO_FINAL
        FROM PROCESSO_MANIPULACAO PM
        INNER JOIN ATENDIMENTO_A1 A1 ON PM.CODIGO_MOV = A1.CODIGO AND PM.TIPO_MOV = 1
        LEFT JOIN UTIL_REL_AG1(1) AG ON AG.AG1_OP >= 0
        INNER JOIN FORMAFARMACEUTICA_PROCESSO_TIPO FFP ON PM.CODIGO_PROCESSO_TIPO = FFP.CODIGO
        WHERE PM.CODIGO_FUNCIONARIO IS NOT NULL
          AND A1.STATUS_MOV <> 0
          AND PM.DATA_PROCESSO BETWEEN '$data_inicio' AND '$data_fim'$etapa_filter
        GROUP BY PM.CODIGO_PROCESSO_TIPO || ' - ' || FFP.NOMETIPO
        ORDER BY PROCESSO
        ";

        return $sql;
    }

    public function getQueryEtapa($cliente = null, $data_inicio = null, $data_fim = null, $etapa = null)
    {
        $query = "SELECT
            CAST(PM.CODIGO_PROCESSO_TIPO AS VARCHAR(10)) ||' - '|| CAST(FFP.NOMETIPO AS VARCHAR(100)) as PROCESSO,
            CAST(SUM(CASE 
                WHEN AG.AG1_OP = 1 AND PM.TIPO_MOV = 1 THEN (
                    SELECT COUNT(*)
                    FROM ATENDIMENTO_A2 A2
                    WHERE PM.CODIGO_MOV = A2.CODIGO_ATEND_A1 
                    AND PM.NUMEROFORMULA_MOV = A2.NUMEROFORMULA 
                    AND A2.CONCLUIDOFORMULA = -1
                )
                WHEN AG.AG1_OP = 0 AND PM.TIPO_MOV = 1 THEN 1
                ELSE 0 
            END) AS INTEGER) as QTD_TOTAL,
            CAST(FU.NOMEFUNCIONARIO AS VARCHAR(100)) as MANIPULADOR,
            CAST(FU.CODIGO AS VARCHAR(20)) as CDFUN
        FROM PROCESSO_MANIPULACAO PM
        INNER JOIN FUNCIONARIO FU on PM.CODIGO_FUNCIONARIO = FU.CODIGO
        INNER JOIN FORMAFARMACEUTICA_PROCESSO_TIPO FFP on PM.CODIGO_PROCESSO_TIPO = FFP.CODIGO
        INNER JOIN ATENDIMENTO_A1 A1 ON PM.CODIGO_MOV = A1.CODIGO AND PM.TIPO_MOV = 1
        LEFT JOIN UTIL_REL_AG1 (1) AG ON AG.AG1_OP >= 0 
        WHERE 1=1 AND A1.STATUS_MOV <> 0 ";

        if (!empty($cliente)) {
            $query .= " AND UPPER(CAST(FU.NOMEFUNCIONARIO AS VARCHAR(100))) LIKE UPPER('%" . $cliente . "%')";
        }

        if (!empty($data_inicio) && !empty($data_fim)) {
            $query .= " AND PM.DATA_PROCESSO BETWEEN '" . $data_inicio . "' AND '" . $data_fim . "'";
        }

        if (!empty($etapa) && $etapa <> 'Todos') {
            if (is_array($etapa)) {
                $etapa = array_map('addslashes', $etapa);
                $query .= " AND PM.CODIGO_PROCESSO_TIPO IN ('" . implode("','", $etapa) . "')";
            } else {
                $query .= " AND PM.CODIGO_PROCESSO_TIPO = '" . addslashes($etapa) . "'";
            }
        }

        $query .= " GROUP BY PM.CODIGO_PROCESSO_TIPO, FFP.NOMETIPO, FU.NOMEFUNCIONARIO, FU.CODIGO
                    ORDER BY FFP.NOMETIPO, FU.NOMEFUNCIONARIO";

        return $query;
    }

    public function ProcessoFinal($data_inicio = null, $data_fim = null)
    {
        $consulta_processo_final = "
        SELECT 
            PM.CODIGO_PROCESSO_TIPO || ' - ' || FFP.NOMETIPO AS processo,
            COUNT(DISTINCT A1.AVIADA_LJ || '-' || A1.CODIGO || '/' || A2.NUMEROFORMULA) AS total_formulas_processo_final
        FROM PROCESSO_MANIPULACAO PM
        INNER JOIN ATENDIMENTO_A1 A1 ON PM.CODIGO_MOV = A1.CODIGO AND PM.TIPO_MOV = 1
        INNER JOIN ATENDIMENTO_A2 A2 ON PM.CODIGO_MOV = A2.CODIGO_ATEND_A1 AND PM.NUMEROFORMULA_MOV = A2.NUMEROFORMULA
        INNER JOIN CLIENTE CL ON A1.CODIGO_CLIENTE = CL.CODIGO
        INNER JOIN FUNCIONARIO FU ON PM.CODIGO_FUNCIONARIO = FU.CODIGO
        INNER JOIN FORMAFARMACEUTICA_PROCESSO_TIPO FFP ON PM.CODIGO_PROCESSO_TIPO = FFP.CODIGO
        LEFT JOIN ATENDIMENTO_ED ED ON A1.CODIGO_ATEND_E = ED.CODIGO
        LEFT JOIN ENTREGADOMICILIO_PERIODO EP ON ED.CODIGO_ENTREGADOMICILIO_PERIODO = EP.CODIGO
        INNER JOIN FORMAFARMACEUTICA FF ON A2.CODIGO_FORMAFARMACEUTICA = FF.CODIGO
        WHERE PM.CODIGO_FUNCIONARIO IS NOT NULL
         AND A1.STATUS_MOV <> 0";

        // Filtro de data
        if (!empty($_GET['ano']) && !empty($_GET['mes'])) {
            $data_inicio = date($_GET['ano'] . '-' . $_GET['mes'] . '-01');
            $data_fim = date($_GET['ano'] . '-' . $_GET['mes'] . '-d');
            $consulta_processo_final .= " AND PM.DATA_PROCESSO BETWEEN '" . $data_inicio . "' AND '" . $data_fim . "'";
        }


        $consulta_processo_final .= " AND PM.CODIGO_PROCESSO_TIPO = 59
        GROUP BY
            PM.CODIGO_PROCESSO_TIPO || ' - ' || FFP.NOMETIPO
        ORDER BY
        processo;
            ";

        return $consulta_processo_final;
    }

    public function getTempoTrabalhado($codigo_funcionario = null, $data_inicio = null, $data_fim = null, $etapa = null)
    {
        $query = "
        SELECT
            CAST(FPM.CODIGO_FUNCIONARIO AS VARCHAR(20)) as CODIGO_FUNCIONARIO,
            CAST(F.NOMEFUNCIONARIO AS VARCHAR(100)) as NOMEFUNCIONARIO,
            CAST(SUM(
                DATEDIFF(MINUTE FROM FPM.HORA_ENT_REG TO FPM.HORA_ENT_ALM_REG) +
                DATEDIFF(MINUTE FROM FPM.HORA_SAI_ALM_REG TO FPM.HORA_SAI_REG) -
                COALESCE(
                    (SELECT FIRST 1 DATEDIFF(MINUTE FROM FFP.HORARIO_PAUSA_INICIO TO FFP.HORARIO_PAUSA_FIM)
                     FROM FUNCIONARIO_FOLHAPONTO_PAUSA FFP
                     WHERE FFP.CODIGO_FUNC_FOLHAPONTO_MOV = FPM.CODIGO
                     ORDER BY FFP.HORARIO_PAUSA),
                    0
                ) -
                COALESCE(
                    (SELECT FIRST 1 SKIP 1 DATEDIFF(MINUTE FROM FFP.HORARIO_PAUSA_INICIO TO FFP.HORARIO_PAUSA_FIM)
                     FROM FUNCIONARIO_FOLHAPONTO_PAUSA FFP
                     WHERE FFP.CODIGO_FUNC_FOLHAPONTO_MOV = FPM.CODIGO
                     ORDER BY FFP.HORARIO_PAUSA),
                    0
                )
            ) AS INTEGER) AS TEMPO_TRABALHADO_MINUTOS
        FROM FUNCIONARIO_FOLHAPONTO_MOV FPM
        LEFT JOIN FUNCIONARIO_FOLHAPONTO_JUST FJ ON FJ.CODIGO = FPM.CODIGO_JUSTIFICATIVA
        INNER JOIN FUNCIONARIO F ON F.CODIGO = FPM.CODIGO_FUNCIONARIO";

        // Se etapa foi especificada, fazer JOIN com PROCESSO_MANIPULACAO para filtrar apenas funcionários que trabalharam nessa etapa
        if (!empty($etapa) && $etapa != 'Todos') {
            $query .= "
        INNER JOIN (
            SELECT DISTINCT PM.CODIGO_FUNCIONARIO
            FROM PROCESSO_MANIPULACAO PM
            WHERE 1=1";
            
            if (!empty($data_inicio) && !empty($data_fim)) {
                $query .= " AND PM.DATA_PROCESSO BETWEEN '" . $data_inicio . "' AND '" . $data_fim . "'";
            }
            
            if (is_array($etapa)) {
                $etapa = array_map('addslashes', $etapa);
                $query .= " AND PM.CODIGO_PROCESSO_TIPO IN ('" . implode("','", $etapa) . "')";
            } else {
                $query .= " AND PM.CODIGO_PROCESSO_TIPO = '" . addslashes($etapa) . "'";
            }
            
            $query .= "
        ) PM_FILTER ON F.CODIGO = PM_FILTER.CODIGO_FUNCIONARIO";
        }

        $query .= "
        WHERE F.ATIVO = -1 AND F.CODIGO_FUNCIONARIO_DEPTO = 9";

        if (!empty($data_inicio) && !empty($data_fim)) {
            $query .= " AND FPM.DATA_PONTO BETWEEN '" . $data_inicio . "' AND '" . $data_fim . "'";
        }

        if (!empty($codigo_funcionario)) {
            $query .= " AND FPM.CODIGO_FUNCIONARIO = '" . $codigo_funcionario . "'";
        }

        $query .= " GROUP BY FPM.CODIGO_FUNCIONARIO, F.NOMEFUNCIONARIO
                    ORDER BY F.NOMEFUNCIONARIO";

        //echo $query; exit;

        return $query;
    }

    public function getMetaEtapa($ano = null, $mes = null, $filial = null, $etapa = null)
    {
        $sql = "SELECT SUM(m.meta) as soma
                FROM etapas_pcp as e
                LEFT JOIN metas_etapas_pcp as m ON e.codigo_etapa = m.id_etapa
                WHERE 1=1";

        if (!empty($ano) && $ano != "Selecione") {
            $sql .= " AND m.ano = " . intval($ano);
        }

        if (!empty($mes) && $mes != "Selecione") {
            $sql .= " AND m.mes = " . intval($mes);
        }

        if (!empty($filial) && $filial != "Todos") {
            $sql .= " AND m.codigo_filial = " . intval($filial);
        }

        if (!empty($etapa) && $etapa != "Todos") {
            if (is_array($etapa)) {
                $etapa = array_map('addslashes', $etapa);
                $sql .= " AND e.codigo_etapa IN ('" . implode("','", $etapa) . "')";
            } else {
                $sql .= " AND e.codigo_etapa = '" . addslashes($etapa) . "'";
            }
        }

        return $sql;
    }

    public function getAdicoes($ano = null, $mes = null, $etapa = null)
    {
        $sql = "SELECT 
                codigo_funcionario as cdfun, 
                etapa as cdetapa, 
                sum(adicao) as adicao, 
                ano, 
                mes 
                FROM kpi.adicao_producao 
                WHERE 1=1";

        if (!empty($ano) && $ano != "Selecione") {
            $sql .= " AND ano = " . intval($ano);
        }
        if (!empty($mes) && $mes != "Selecione") {
            $sql .= " AND mes = " . intval($mes);
        }

        if (!empty($etapa) && $etapa != "Todos") {
            if (is_array($etapa)) {
                $etapa = array_map('addslashes', $etapa);
                $sql .= " AND etapa IN ('" . implode("','", $etapa) . "')";
            } else {
                $sql .= " AND etapa = '" . addslashes($etapa) . "'";
            }
        }

        $sql .= " GROUP BY cdfun, cdetapa, ano, mes";

        return $sql;
    }

    public function getMetas($ano = null, $mes = null, $etapa = null)
    {
        $sql = "SELECT 
                codigo_funcionario as cdfun, 
                etapa as cdetapa, 
                meta, 
                ano, 
                mes 
                FROM kpi.metas_producao 
                WHERE 1=1";

        if (!empty($ano) && $ano != "Selecione") {
            $sql .= " AND ano = " . intval($ano);
        }
        if (!empty($mes) && $mes != "Selecione") {
            $sql .= " AND mes = " . intval($mes);
        }

        if (!empty($etapa) && $etapa != "Todos") {
            if (is_array($etapa)) {
                $etapa = array_map('addslashes', $etapa);
                $sql .= " AND etapa IN ('" . implode("','", $etapa) . "')";
            } else {
                $sql .= " AND etapa = '" . addslashes($etapa) . "'";
            }
        }

        return $sql;
    }

    public function executarQuery($query, $tipo = 'firebird')
    {
        if ($tipo === 'firebird') {
            $result = ibase_query($this->connection, $query);
        } else {
            $result = $this->connectionmysql->query($query);
        }

        if (!$result) {
            throw new Exception('Erro na consulta: ' . ($tipo === 'firebird' ? ibase_errmsg() : $this->connectionmysql->error));
        }

        return $result;
    }

    public function formatarTempo($minutos)
    {
        $horas = floor($minutos / 60);
        $minutos_restantes = $minutos % 60;
        $segundos = ($minutos * 60) % 60;
        return sprintf('%02d:%02d:%02d', $horas, $minutos_restantes, $segundos);
    }

    public function calcularMediaPorUnidade($qtd_formulas, $tempo_minutos)
    {
        if ($qtd_formulas > 0 && $tempo_minutos > 0) {
            $tempo_em_horas = $tempo_minutos / 60;
            if ($tempo_em_horas > 0) {
                return $qtd_formulas / $tempo_em_horas;
            }
        }
        return 0;
    }

    public function getDatasIntervalo($mes, $ano)
    {
        // Se mês e ano não forem fornecidos, usa o mês e ano atual
        if (empty($mes) || $mes == "Selecione") {
            $mes = date('m');
        }
        if (empty($ano) || $ano == "Selecione") {
            $ano = date('Y');
        }

        // Primeiro dia do mês
        $data_inicio = date('Y-m-d', strtotime("$ano-$mes-01"));

        // Último dia do mês ou dia atual
        $ultimo_dia = date('t', strtotime("$ano-$mes-01")); // Pega o último dia do mês
        $data_fim_mes = date('Y-m-d', strtotime("$ano-$mes-$ultimo_dia"));
        $hoje = date('Y-m-d');

        // Se o mês/ano selecionado for o atual, usa a data de hoje como fim
        if ($mes == date('m') && $ano == date('Y')) {
            $data_fim = $hoje;
        } else {
            $data_fim = $data_fim_mes;
        }

        return array(
            'data_inicio' => $data_inicio,
            'data_fim' => $data_fim
        );
    }
}
