<?php
// Conexão com o banco Firebird
require '../conexao/conexao.php';

$data_inicio = isset($_GET['data']) ? $_GET['data'] : date('Y-m-01');
$data_fim = isset($_GET['data_ate']) ? $_GET['data_ate'] : date('Y-m-t');
$etapa = isset($_GET['etapa']) ? $_GET['etapa'] : 'Todos';

// Consulta SQL otimizada com índices
$sql = "SELECT 
    PM.CODIGO_PROCESSO_TIPO,
    FFP.NOMETIPO as NOME_PROCESSO,
    PM.CODIGO_PROCESSO_TIPO || ' - ' || FFP.NOMETIPO AS PROCESSO,
    A1.AVIADA_LJ || '-' || A1.CODIGO || '/' || A2.NUMEROFORMULA AS RECEITA,
    PM.DATA_PROCESSO, 
    PM.HORA_PROCESSO,
    PM.SEQUENCIA,
    FU.NOMEFUNCIONARIO AS MANIPULADOR
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
    INNER JOIN FORMAFARMACEUTICA FF ON A2.CODIGO_FORMAFARMACEUTICA = FF.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 CLIENTE CL ON A1.CODIGO_CLIENTE = CL.CODIGO
WHERE PM.CODIGO_FUNCIONARIO IS NOT NULL
    AND A1.STATUS_MOV <> 0 
    AND PM.DATA_PROCESSO BETWEEN ? AND ?
ORDER BY PM.DATA_PROCESSO, PM.HORA_PROCESSO, PM.SEQUENCIA";

// Preparar e executar a consulta com parâmetros
$query = ibase_prepare($connection, $sql);
if (!$query) {
    die('Erro na preparação da consulta: ' . ibase_errmsg());
}

$result = ibase_execute($query, $data_inicio, $data_fim);
if (!$result) {
    die('Erro na execução da consulta: ' . ibase_errmsg());
}

// Processar os resultados em lotes para economia de memória
$processos_agrupados = [];
$receitas_por_processo = [];
$ultimo_timestamp = [];
$batch_size = 1000;
$batch = [];

while ($row = ibase_fetch_assoc($result)) {
    $batch[] = $row;
    
    if (count($batch) >= $batch_size) {
        processarLote($batch, $processos_agrupados, $receitas_por_processo, $ultimo_timestamp);
        $batch = [];
    }
}

// Processar o último lote
if (!empty($batch)) {
    processarLote($batch, $processos_agrupados, $receitas_por_processo, $ultimo_timestamp);
}

ibase_free_result($result);

// Iniciar transação MySQL
$connectionmysql->begin_transaction();

try {
    // Preparar statements uma única vez
    $stmt_check = $connectionmysql->prepare("SELECT CODIGO_PROCESSO FROM tempo_lead_time WHERE CODIGO_PROCESSO = ?");
    $stmt_update = $connectionmysql->prepare("
        UPDATE tempo_lead_time 
        SET tempo = ?, qtd_formulas = ?, data_alteracao = NOW(), ultima_receita = ?
        WHERE CODIGO_PROCESSO = ?
    ");
    $stmt_insert = $connectionmysql->prepare("
        INSERT INTO tempo_lead_time 
        (processo, codigo_processo, tempo, qtd_formulas, data_alteracao, ultima_receita)
        VALUES (?, ?, ?, ?, NOW(), ?)
    ");

    if (!$stmt_check || !$stmt_update || !$stmt_insert) {
        throw new Exception("Erro ao preparar statements: " . $connectionmysql->error);
    }

    // Processar cada processo agrupado
    foreach ($processos_agrupados as $proc) {
        $stmt_check->bind_param("s", $proc['CODIGO_PROCESSO']);
        $stmt_check->execute();
        $result_check = $stmt_check->get_result();
        
        if ($result_check->fetch_assoc()) {
            // Update
            $stmt_update->bind_param("iiss",
                $proc['TEMPO_TOTAL'],
                $proc['CONTAGEM'],
                $proc['ULTIMA_RECEITA'],
                $proc['CODIGO_PROCESSO']
            );
            if (!$stmt_update->execute()) {
                throw new Exception("Erro no UPDATE: " . $stmt_update->error);
            }
        } else {
            // Insert
            $stmt_insert->bind_param("ssiis",
                $proc['PROCESSO'],
                $proc['CODIGO_PROCESSO'],
                $proc['TEMPO_TOTAL'],
                $proc['CONTAGEM'],
                $proc['ULTIMA_RECEITA']
            );
            if (!$stmt_insert->execute()) {
                throw new Exception("Erro no INSERT: " . $stmt_insert->error);
            }
        }
    }

    // Commit se tudo deu certo
    $connectionmysql->commit();

} catch (Exception $e) {
    // Rollback em caso de erro
    $connectionmysql->rollback();
    die("Erro no processamento: " . $e->getMessage());
}

// Função para processar lotes de registros
function processarLote($lote, &$processos_agrupados, &$receitas_por_processo, &$ultimo_timestamp) {
    foreach ($lote as $proc) {
        $codigo_processo = $proc['CODIGO_PROCESSO_TIPO'];
        $nome_processo = $proc['PROCESSO'];
        $data_hora_atual = $proc['DATA_PROCESSO'] . ' ' . $proc['HORA_PROCESSO'];
        $timestamp_atual = strtotime($data_hora_atual);
        
        if (!isset($processos_agrupados[$codigo_processo])) {
            $processos_agrupados[$codigo_processo] = [
                'PROCESSO' => $nome_processo,
                'CODIGO_PROCESSO' => $codigo_processo,
                'TEMPO_TOTAL' => 0,
                'CONTAGEM' => 0,
                'ULTIMA_RECEITA' => $proc['RECEITA']
            ];
            $receitas_por_processo[$codigo_processo] = [];
        }
        
        // Registrar receita única
        if (!isset($receitas_por_processo[$codigo_processo][$proc['RECEITA']])) {
            $receitas_por_processo[$codigo_processo][$proc['RECEITA']] = true;
            $processos_agrupados[$codigo_processo]['CONTAGEM']++;
        }
        
        // Atualizar última receita
        $processos_agrupados[$codigo_processo]['ULTIMA_RECEITA'] = $proc['RECEITA'];
        
        // Calcular tempo
        if (isset($ultimo_timestamp[$codigo_processo])) {
            $tempo = $timestamp_atual - $ultimo_timestamp[$codigo_processo];
            if ($tempo > 0) {
                $processos_agrupados[$codigo_processo]['TEMPO_TOTAL'] += $tempo;
            }
        }
        
        $ultimo_timestamp[$codigo_processo] = $timestamp_atual;
    }
}

// Incluir o processamento de fórmulas detalhadas
require_once "salva_formula_detalhada.php";

// Fechar conexões
ibase_free_result($query);
ibase_close($connection);
$connectionmysql->close();


?>

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cálculo de Lead Time</title>
    <style>
        table {
            border-collapse: collapse;
            width: 100%;
            margin-top: 20px;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        .total {
            font-weight: bold;
            background-color: #f9f9f9;
        }
        .success-message {
            background-color: #dff0d8;
            border: 1px solid #d6e9c6;
            color: #3c763d;
            padding: 15px;
            margin-bottom: 20px;
            border-radius: 4px;
        }
    </style>
</head>
<body>
<h1>Lista de Processos Agrupados</h1>

<?php if (!empty($processos_agrupados)): ?>
    <div class="success-message">
        Dados salvos com sucesso na base de dados!
    </div>
<?php endif; ?>

<table>
    <thead>
        <tr>
            <th>Processo</th>
            <th>Código do Processo</th>
            <th>Tempo Total (segundos)</th>
            <th>Quantidade de Ocorrências</th>
            <th>Tempo Médio (segundos)</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($processos_agrupados as $proc): ?>
            <tr>
                <td><?= htmlspecialchars($proc['PROCESSO']) ?></td>
                <td><?= htmlspecialchars($proc['CODIGO_PROCESSO']) ?></td>
                <td><?= $proc['TEMPO_TOTAL'] ?></td>
                <td><?= $proc['CONTAGEM'] ?></td>
                <td><?= round($proc['TEMPO_TOTAL'] / $proc['CONTAGEM'], 2) ?></td>
            </tr>
        <?php endforeach; ?>
        <tr class="total">
            <td colspan="2">Total Geral</td>
            <td><?= $tempo_total_geral ?></td>
            <td colspan="2"></td>
        </tr>
    </tbody>
</table>

</body>
</html>