<?php
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
// (parte do Premium Express BI - Fire Sistemas)
//
// Tela interna de diagnóstico: /diag/operacoes
// Mostra, pra uma data escolhida, TODAS as COD_TIPO_OPERACAO movimentadas
// no banco do ERP, indicando quais estão DENTRO ou FORA do filtro do BI e por quê.
//
// Objetivo: ajudar a explicar divergências entre o faturamento do BI e o do ERP
// quando algum tipo de operação está marcado MOV_INTERNA='S' / GERA_FINANCEIRO='N'
// ou similar — o BI exclui automaticamente, gerando "faturamento sumido".

declare(strict_types=1);

namespace App\Controllers;

use App\Core\Database;
use App\Core\Lojas;
use App\Core\View;

class DiagOperacoesController
{
    /** Lê config/database.php (extras / exclusões manuais aplicadas pelo BI). */
    private function cfg(): array
    {
        $path = dirname(__DIR__, 2) . '/config/database.php';
        if (!file_exists($path)) return [];
        $data = @include $path;
        return is_array($data) ? $data : [];
    }

    /**
     * Reproduz a lógica de filtroVenda() do VendasRepository, mas operação por
     * operação, expondo a razão exata pela qual cada uma fica de fora.
     */
    public function index(): void
    {
        // ── Parâmetros ───────────────────────────────────────────────────────
        $hoje = date('Y-m-d');
        $data = (string)($_GET['data'] ?? $hoje);
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $data)) {
            $data = $hoje;
        }

        $cfg     = $this->cfg();
        $extras  = array_map('intval', (array)($cfg['tipos_venda_extras']  ?? []));
        $excluir = array_map('intval', (array)($cfg['tipos_venda_excluir'] ?? []));

        $erro = '';
        $linhas = [];
        $codEmpresa = 0;
        $sqlUsado = '';

        try {
            // ── Conexão na loja ATIVA (ou single-loja) ──────────────────────
            $idLoja = Lojas::idAtiva();
            $pdo = $idLoja !== null ? Database::conectarLoja($idLoja) : Database::conectar();

            $codEmpresa = Lojas::codEmpresaAtiva();

            // ── SQL principal ───────────────────────────────────────────────
            $sql = "
                SELECT
                  n.COD_TIPO_OPERACAO    AS COD_OP,
                  t.DESCRICAO            AS NOME,
                  t.TIPO_NATUREZA        AS NATUREZA,
                  t.DEVOLUCAO            AS DEVOL,
                  t.ETRANSF              AS ETRANSF,
                  t.MOV_INTERNA          AS MOV_INTERNA,
                  t.GERA_FINANCEIRO      AS GERA_FINANCEIRO,
                  COUNT(*)               AS QTD_NOTAS,
                  COUNT(CASE WHEN n.DATA_CANC IS NOT NULL THEN 1 END) AS QTD_CANC,
                  SUM(n.TOTAL_NOTA)      AS VALOR_TOTAL,
                  SUM(CASE WHEN n.DATA_CANC IS NULL THEN n.TOTAL_NOTA ELSE 0 END) AS VALOR_VALIDO
                FROM NOTAS_CAB n
                LEFT JOIN TIPO_OPERACAO t
                  ON t.COD_TIPO_OPERACAO = n.COD_TIPO_OPERACAO
                 AND t.COD_EMPRESA       = n.COD_EMPRESA
                WHERE n.DATA_EMISSAO = ?
                  AND n.COD_EMPRESA  = ?
                GROUP BY 1,2,3,4,5,6,7
                ORDER BY VALOR_VALIDO DESC
            ";
            $sqlUsado = $sql;

            $stmt = $pdo->prepare($sql);
            $stmt->execute([$data, $codEmpresa]);
            $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC);

            foreach ($rows as $r) {
                // Normaliza chaves (PDO Firebird retorna em UPPERCASE) e tipos
                $codOp     = (int)($r['COD_OP'] ?? 0);
                $nome      = trim((string)($r['NOME'] ?? ''));
                $natureza  = strtoupper(trim((string)($r['NATUREZA'] ?? '')));
                $devol     = strtoupper(trim((string)($r['DEVOL'] ?? '')));
                $etransf   = strtoupper(trim((string)($r['ETRANSF'] ?? '')));
                $movInt    = strtoupper(trim((string)($r['MOV_INTERNA'] ?? '')));
                $geraFin   = strtoupper(trim((string)($r['GERA_FINANCEIRO'] ?? '')));
                $qtdNotas  = (int)($r['QTD_NOTAS'] ?? 0);
                $qtdCanc   = (int)($r['QTD_CANC']  ?? 0);
                $vlrTotal  = (float)($r['VALOR_TOTAL']  ?? 0);
                $vlrValido = (float)($r['VALOR_VALIDO'] ?? 0);

                // ── Calcula NO_FILTRO_BI + RAZAO_FORA (mesma regra do VendasRepository) ──
                $razoes = [];

                // Override explícito (exclui sempre, mesmo se passaria nos demais critérios)
                if (in_array($codOp, $excluir, true)) {
                    $razoes[] = 'Excluida no override do BI (tipos_venda_excluir)';
                }

                if ($natureza !== '' && $natureza !== 'V') {
                    $razoes[] = 'Natureza != V (compra/transf/etc)';
                }
                if ($devol === 'S') {
                    $razoes[] = 'Devolucao (DEVOL=S)';
                }
                if ($etransf === 'S') {
                    $razoes[] = 'Transferencia entre lojas (ETRANSF=S)';
                }
                if ($movInt === 'S') {
                    $razoes[] = 'Movimento interno (MOV_INTERNA=S)';
                }
                if ($geraFin === 'N') {
                    $razoes[] = 'Nao gera financeiro (GERA_FINANCEIRO=N)';
                }

                // Override extras: força INCLUIR essa op mesmo que tivesse caído fora
                $forcadoEntrar = in_array($codOp, $extras, true);
                if ($forcadoEntrar) {
                    // extras sempre ganha, EXCETO quando tipos_venda_excluir também está marcado
                    if (!in_array($codOp, $excluir, true)) {
                        $razoes = []; // limpa todas as razões — extras incluiu na força
                    }
                }

                $noFiltro = empty($razoes);

                $linhas[] = [
                    'cod_op'       => $codOp,
                    'nome'         => $nome,
                    'natureza'     => $natureza,
                    'devol'        => $devol,
                    'etransf'      => $etransf,
                    'mov_interna'  => $movInt,
                    'gera_fin'     => $geraFin,
                    'qtd_notas'    => $qtdNotas,
                    'qtd_canc'     => $qtdCanc,
                    'valor_total'  => $vlrTotal,
                    'valor_valido' => $vlrValido,
                    'no_filtro_bi' => $noFiltro,
                    'razao_fora'   => $razoes ? implode(' + ', $razoes) : '',
                    'forcado_extras' => $forcadoEntrar,
                ];
            }
        } catch (\Throwable $e) {
            $erro = $e->getMessage();
        }

        // ── Totais ──────────────────────────────────────────────────────────
        $totalMov     = 0.0;  // soma TUDO (mesmo cancelado)
        $totalNoBi    = 0.0;  // soma das que ENTRAM no BI (não-canceladas)
        $totalForaBi  = 0.0;  // soma das que FICAM DE FORA (não-canceladas)
        foreach ($linhas as $l) {
            $totalMov += $l['valor_total'];
            if ($l['no_filtro_bi']) {
                $totalNoBi += $l['valor_valido'];
            } else {
                $totalForaBi += $l['valor_valido'];
            }
        }

        $titulo    = 'Diagnostico de Operacoes — Vendas vs ERP';
        $subtitulo = 'Veja exatamente quais operacoes o BI esta contando e quais esta excluindo do faturamento';

        View::render('diag/operacoes', [
            'titulo'        => $titulo,
            'subtitulo'     => $subtitulo,
            'data_filtro'   => $data,
            'cod_empresa'   => $codEmpresa,
            'extras'        => $extras,
            'excluir'       => $excluir,
            'linhas'        => $linhas,
            'total_mov'     => $totalMov,
            'total_no_bi'   => $totalNoBi,
            'total_fora_bi' => $totalForaBi,
            'qtd_ops'       => count($linhas),
            'erro'          => $erro,
            'sql_usado'     => $sqlUsado,
        ]);
    }
}
