<?php
require '../conexao/conexao.php';

class ConsultasLeadTime
{
    private $connectionmysql;
    private $connection;

    public function __construct()
    {
        global $connectionmysql, $connection; // Acesso às conexões globais
        $this->connectionmysql = $connectionmysql;
        $this->connection = $connection;
    }

    public function leadTime($hojeFormatado, $receita, $etapa, $funcionario, $data_ate, $operacao = null)
    {
        $condicoes = [];

        // Filtro por data
        $condicoes[] = "(PM.DATA_PROCESSO + PM.HORA_PROCESSO) BETWEEN '" . addslashes($hojeFormatado) . "' AND '" . addslashes($data_ate) . "'";

        // Filtro por receita, quebrando em partes
        if (!empty($receita) && strtoupper($receita) !== "TODOS") {
            $partesReceita = explode('-', $receita);
            $lj = $partesReceita[0];
            $resto = explode('/', $partesReceita[1]);
            $cod = $resto[0];
            $numFormula = $resto[1];

            $condicoes[] = "A1.AVIADA_LJ = '" . addslashes($lj) . "'";
            $condicoes[] = "A1.CODIGO = '" . addslashes($cod) . "'";
            $condicoes[] = "A2.NUMEROFORMULA = '" . addslashes($numFormula) . "'";
        }

        // Filtro por funcionário
        if (!empty($funcionario) && strtoupper($funcionario) !== "TODOS") {
            $condicoes[] = "FU.NOMEFUNCIONARIO = '" . addslashes($funcionario) . "'";
        }

        // Filtro por etapa
        if (!empty($etapa) && strtoupper($etapa) !== "TODOS") {
            $etapasSelecionadas = is_array($etapa) ? $etapa : explode(',', $etapa);
            $etapasFiltro = implode(',', array_map(function ($v) {
                return "'" . addslashes($v) . "'";
            }, $etapasSelecionadas));
            $condicoes[] = "FFP.NOMETIPO IN ($etapasFiltro)";
        }

        // Combina todas as condições - serão aplicadas DENTRO da CTE
        $whereFiltrosAdicionais = !empty($condicoes) ? ' AND ' . implode(' AND ', $condicoes) : '';

        // Query principal - Agregada por Processo
        $query = "
        WITH BASE AS (
            SELECT
                PM.CODIGO_MOV,
                PM.NUMEROFORMULA_MOV,
                PM.TIPO_MOV,
                PM.SEQUENCIA,
                PM.CODIGO_PROCESSO_TIPO,
                FFP.NOMETIPO AS PROCESSO,
                (A1.AVIADA_LJ || '-' || A1.CODIGO || '/' || A2.NUMEROFORMULA) AS RECEITA,
                (PM.DATA_PROCESSO + PM.HORA_PROCESSO) AS TS_ENTRADA,
                FU.NOMEFUNCIONARIO AS MANIPULADOR,
                (
                    SELECT MIN(PM2.DATA_PROCESSO + PM2.HORA_PROCESSO)
                    FROM PROCESSO_MANIPULACAO PM2
                    WHERE PM2.CODIGO_MOV = PM.CODIGO_MOV
                    AND PM2.NUMEROFORMULA_MOV = PM.NUMEROFORMULA_MOV
                    AND PM2.TIPO_MOV = PM.TIPO_MOV
                    AND (PM2.DATA_PROCESSO + PM2.HORA_PROCESSO) > (PM.DATA_PROCESSO + PM.HORA_PROCESSO)
                ) AS TS_PROXIMO
            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 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
            $whereFiltrosAdicionais
        ),
        DURACAO AS (
            SELECT
                B.PROCESSO,
                B.RECEITA,
                B.TS_ENTRADA,
                B.TS_PROXIMO,
                CASE
                    WHEN B.TS_PROXIMO IS NULL THEN NULL
                    ELSE DATEDIFF(MINUTE, B.TS_ENTRADA, B.TS_PROXIMO)
                END AS DURACAO_MIN
            FROM BASE B
        ),
        CONTAGEM_ETAPAS AS (
            SELECT 
                B1.PROCESSO,
                COUNT(DISTINCT B1.RECEITA) AS QTD_FORMULAS
            FROM BASE B1
            GROUP BY B1.PROCESSO
        )
        SELECT
            D.PROCESSO,
            CE.QTD_FORMULAS,
            COUNT(D.DURACAO_MIN) AS QTD_OCORRENCIAS,
            AVG(D.DURACAO_MIN) AS MEDIA_TEMPO,
            SUM(D.DURACAO_MIN) AS TOTAL_TEMPO
        FROM DURACAO D
        INNER JOIN CONTAGEM_ETAPAS CE ON D.PROCESSO = CE.PROCESSO
        WHERE D.DURACAO_MIN IS NOT NULL
        GROUP BY D.PROCESSO, CE.QTD_FORMULAS
        ORDER BY D.PROCESSO;
        ";

        $resultado = ibase_query($this->connection, $query) or die("Erro: " . ibase_errmsg());

        $dados = [];
        while ($linha = ibase_fetch_assoc($resultado)) {
            $dados[] = $linha;
        }

        return $dados;
    }

    public function leadTimeDetalhamento($hojeFormatado, $receita, $etapa, $funcionario, $data_ate, $operacao = null)
    {
        $condicoes = [];

        // Filtro por data
        $condicoes[] = "(PM.DATA_PROCESSO + PM.HORA_PROCESSO) BETWEEN '" . addslashes($hojeFormatado) . "' AND '" . addslashes($data_ate) . "'";

        // Filtro por receita
        if (!empty($receita) && strtoupper($receita) !== "TODOS") {
            $partesReceita = explode('-', $receita);
            $lj = $partesReceita[0];
            $resto = explode('/', $partesReceita[1]);
            $cod = $resto[0];
            $numFormula = $resto[1];

            $condicoes[] = "A1.AVIADA_LJ = '" . addslashes($lj) . "'";
            $condicoes[] = "A1.CODIGO = '" . addslashes($cod) . "'";
            $condicoes[] = "A2.NUMEROFORMULA = '" . addslashes($numFormula) . "'";
        }

        // Filtro por funcionário
        if (!empty($funcionario) && strtoupper($funcionario) !== "TODOS") {
            $condicoes[] = "FU.NOMEFUNCIONARIO = '" . addslashes($funcionario) . "'";
        }

        // Filtro por etapa
        if (!empty($etapa) && strtoupper($etapa) !== "TODOS") {
            $etapasSelecionadas = is_array($etapa) ? $etapa : explode(',', $etapa);
            $etapasFiltro = implode(',', array_map(function ($v) {
                return "'" . addslashes($v) . "'";
            }, $etapasSelecionadas));
            $condicoes[] = "FFP.NOMETIPO IN ($etapasFiltro)";
        }

        // Combina todas as condições
        $whereFiltrosAdicionais = !empty($condicoes) ? ' AND ' . implode(' AND ', $condicoes) : '';

        // Query principal — remove duplicados com DISTINCT (sem GROUP BY)
        $query = "
        WITH BASE AS (
        SELECT DISTINCT
            PM.CODIGO_MOV,
            PM.NUMEROFORMULA_MOV,
            PM.TIPO_MOV,
            PM.SEQUENCIA,
            PM.CODIGO_PROCESSO_TIPO,
            FFP.NOMETIPO AS PROCESSO,
            (A1.AVIADA_LJ || '-' || A1.CODIGO || '/' || A2.NUMEROFORMULA) AS RECEITA,
            (PM.DATA_PROCESSO + PM.HORA_PROCESSO) AS TS_ENTRADA,
            FU.NOMEFUNCIONARIO AS MANIPULADOR,
            (
                SELECT MIN(PM2.DATA_PROCESSO + PM2.HORA_PROCESSO)
                FROM PROCESSO_MANIPULACAO PM2
                WHERE PM2.CODIGO_MOV = PM.CODIGO_MOV
                AND PM2.NUMEROFORMULA_MOV = PM.NUMEROFORMULA_MOV
                AND PM2.TIPO_MOV = PM.TIPO_MOV
                AND (PM2.DATA_PROCESSO + PM2.HORA_PROCESSO) > (PM.DATA_PROCESSO + PM.HORA_PROCESSO)
            ) AS TS_PROXIMO
        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 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
        $whereFiltrosAdicionais
        )
        SELECT DISTINCT
        B.PROCESSO,
        B.RECEITA,
        B.TS_ENTRADA,
        B.MANIPULADOR,
        B.TS_PROXIMO,
        CASE
            WHEN B.TS_PROXIMO IS NULL THEN NULL
            ELSE DATEDIFF(MINUTE, B.TS_ENTRADA, B.TS_PROXIMO)
        END AS DURACAO_MIN
        FROM BASE B
        ORDER BY
        B.RECEITA,
        B.TS_ENTRADA;
        ";

        $resultado = ibase_query($this->connection, $query) or die("Erro: " . ibase_errmsg());

        $dados = [];
        while ($linha = ibase_fetch_assoc($resultado)) {
            $dados[] = $linha;
        }

        return $dados;
    }
}
