<?php
namespace App\Controllers;

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

class DevolucoesController
{
    // â”€â”€ Helpers â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€

    private function cfg(): array
    {
        $cfgFile = dirname(__DIR__, 2) . '/config/database.php';
        if (!file_exists($cfgFile)) {
            return [];
        }
        return require $cfgFile;
    }

    private function filtroEmpresa(array $cfg, string $alias = 'nc'): string
    {
        $cod = isset($cfg['cod_empresa']) && $cfg['cod_empresa'] ? (int)$cfg['cod_empresa'] : null;
        return $cod ? "AND {$alias}.COD_EMPRESA = {$cod}" : '';
    }

    private function jsonOk(mixed $dados): void
    {
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode(['ok' => true, 'dados' => $dados], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        exit;
    }

    private function jsonErro(string $msg, int $status = 500): void
    {
        http_response_code($status);
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode(['ok' => false, 'erro' => $msg], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        exit;
    }

    // â”€â”€ index() â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€

    public function index(): void
    {
        $cfg = $this->cfg();

        // Sem configuraÃ§Ã£o â†’ redireciona
        if (empty($cfg['host'])) {
            header('Location: /configurar');
            exit;
        }

        View::render('devolucoes/index', [
            'titulo' => 'AnÃ¡lise de DevoluÃ§Ãµes',
            'config' => $cfg,
            'ano'    => (int)date('Y'),
        ]);
    }

    // â”€â”€ api() â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€

    public function api(): void
    {
        $cfg = $this->cfg();

        if (empty($cfg['host'])) {
            $this->jsonErro('Banco nÃ£o configurado', 503);
        }

        // â”€â”€ ParÃ¢metros de filtro â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $ano = isset($_GET['ano']) && ctype_digit((string)$_GET['ano'])
            ? (int)$_GET['ano']
            : (int)date('Y');

        $mes = isset($_GET['mes']) && ctype_digit((string)$_GET['mes']) && (int)$_GET['mes'] >= 1 && (int)$_GET['mes'] <= 12
            ? (int)$_GET['mes']
            : null;

        // â”€â”€ Intervalo de datas â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        if ($mes === null) {
            $dataIni = "{$ano}-01-01";
            $dataFim = "{$ano}-12-31";
        } else {
            $mesPad  = str_pad((string)$mes, 2, '0', STR_PAD_LEFT);
            $dataIni = "{$ano}-{$mesPad}-01";
            $dataFim = date('Y-m-t', strtotime($dataIni));
        }

        // â”€â”€ Filtro de empresa â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $fe   = $this->filtroEmpresa($cfg, 'nc');
        $feNi = $fe; // mesmo filtro, alias nc jÃ¡ estÃ¡ no JOIN

        // â”€â”€ ConexÃ£o â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        try {
            $pdo = Database::conectar();
        } catch (\Throwable $e) {
            $this->jsonErro('Falha na conexÃ£o: ' . $e->getMessage());
        }

        // â”€â”€ Query 1: KPIs gerais â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $kpis = ['qtd_notas' => 0, 'total_devolvido' => 0.0, 'ticket_medio' => 0.0];
        try {
            $row = $pdo->query("
                SELECT
                    COUNT(*)                        AS QTD_NOTAS,
                    COALESCE(SUM(nc.TOTAL_NOTA),0) AS TOTAL_DEVOLVIDO,
                    COALESCE(AVG(nc.TOTAL_NOTA),0) AS TICKET_MEDIO
                FROM NOTAS_CAB nc
                JOIN TIPO_OPERACAO t ON t.COD_TIPO_OPERACAO = nc.COD_TIPO_OPERACAO AND t.COD_EMPRESA = nc.COD_EMPRESA
                WHERE nc.DATA_EMISSAO >= '{$dataIni}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$dataFim}' AS DATE))
                  AND t.DEVOLUCAO = 'S' AND t.TIPO_NATUREZA = 'V' AND nc.DATA_CANC IS NULL
                  {$fe}
            ")->fetch(\PDO::FETCH_ASSOC);

            if ($row) {
                $kpis['qtd_notas']      = (int)$row['QTD_NOTAS'];
                $kpis['total_devolvido'] = (float)$row['TOTAL_DEVOLVIDO'];
                $kpis['ticket_medio']    = (float)$row['TICKET_MEDIO'];
            }
        } catch (\Throwable) {
            // retorna zeros
        }

        // â”€â”€ Query 2: Faturamento do perÃ­odo â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $faturamento = 0.0;
        try {
            $row = $pdo->query("
                SELECT COALESCE(SUM(nc.TOTAL_NOTA),0) AS FATURAMENTO
                FROM NOTAS_CAB nc
                JOIN TIPO_OPERACAO t ON t.COD_TIPO_OPERACAO = nc.COD_TIPO_OPERACAO AND t.COD_EMPRESA = nc.COD_EMPRESA
                WHERE nc.DATA_EMISSAO >= '{$dataIni}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$dataFim}' AS DATE))
                  AND t.TIPO_NATUREZA = 'V' AND (t.DEVOLUCAO = 'N' OR t.DEVOLUCAO IS NULL) AND nc.DATA_CANC IS NULL
                  {$fe}
            ")->fetch(\PDO::FETCH_ASSOC);

            if ($row) {
                $faturamento = (float)$row['FATURAMENTO'];
            }
        } catch (\Throwable) {
            // retorna zero
        }

        // â”€â”€ Percentual de devoluÃ§Ã£o â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $percDevolucao = $faturamento > 0
            ? round($kpis['total_devolvido'] / $faturamento * 100, 2)
            : 0.0;

        // â”€â”€ Query 3: DevoluÃ§Ãµes por mÃªs (apenas sem filtro de mÃªs) â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $porMes = ['labels' => [], 'valores' => []];
        if ($mes === null) {
            $labelsMap = ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'];
            $valMap    = array_fill(1, 12, 0.0);

            try {
                $rows = $pdo->query("
                    SELECT
                        EXTRACT(MONTH FROM nc.DATA_EMISSAO) AS MES,
                        COUNT(*)                             AS QTD,
                        COALESCE(SUM(nc.TOTAL_NOTA),0)      AS TOTAL
                    FROM NOTAS_CAB nc
                    JOIN TIPO_OPERACAO t ON t.COD_TIPO_OPERACAO = nc.COD_TIPO_OPERACAO AND t.COD_EMPRESA = nc.COD_EMPRESA
                    WHERE nc.DATA_EMISSAO >= '{$dataIni}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$dataFim}' AS DATE))
                      AND t.DEVOLUCAO = 'S' AND t.TIPO_NATUREZA = 'V' AND nc.DATA_CANC IS NULL
                      {$fe}
                    GROUP BY EXTRACT(MONTH FROM nc.DATA_EMISSAO)
                    ORDER BY MES
                ")->fetchAll(\PDO::FETCH_ASSOC);

                foreach ($rows as $r) {
                    $m = (int)$r['MES'];
                    if ($m >= 1 && $m <= 12) {
                        $valMap[$m] = (float)$r['TOTAL'];
                    }
                }
            } catch (\Throwable) {
                // retorna zeros
            }

            $porMes['labels']  = $labelsMap;
            $porMes['valores'] = array_values($valMap);
        }

        // â”€â”€ Query 4: Top 10 produtos mais devolvidos â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $topProdutos = [];
        try {
            $topProdutos = $pdo->query("
                SELECT FIRST 10
                    ni.COD_ITEM,
                    TRIM(COALESCE(ni.DESCRICAO,'(sem desc)'))  AS PRODUTO,
                    SUM(ni.QTD)                                 AS QTD_DEVOLVIDA,
                    COALESCE(SUM(ni.TOTAL),0)                   AS TOTAL_DEVOLVIDO
                FROM NOTAS_ITENS ni
                JOIN NOTAS_CAB nc ON nc.NR_NOTA = ni.NR_NOTA AND nc.SERIE = ni.SERIE AND nc.COD_EMPRESA = ni.COD_EMPRESA
                JOIN TIPO_OPERACAO t ON t.COD_TIPO_OPERACAO = nc.COD_TIPO_OPERACAO AND t.COD_EMPRESA = nc.COD_EMPRESA
                WHERE nc.DATA_EMISSAO >= '{$dataIni}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$dataFim}' AS DATE))
                  AND t.DEVOLUCAO = 'S' AND t.TIPO_NATUREZA = 'V' AND nc.DATA_CANC IS NULL
                  {$feNi}
                GROUP BY ni.COD_ITEM, ni.DESCRICAO
                ORDER BY TOTAL_DEVOLVIDO DESC
            ")->fetchAll(\PDO::FETCH_ASSOC);

            $topProdutos = array_map(fn($r) => [
                'cod_item'       => $r['COD_ITEM'],
                'produto'        => $r['PRODUTO'],
                'qtd_devolvida'  => (float)$r['QTD_DEVOLVIDA'],
                'total_devolvido'=> (float)$r['TOTAL_DEVOLVIDO'],
            ], $topProdutos);
        } catch (\Throwable) {
            $topProdutos = [];
        }

        // â”€â”€ Query 5: Top 10 clientes com mais devoluÃ§Ãµes â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $topClientes = [];
        try {
            $topClientes = $pdo->query("
                SELECT FIRST 10
                    nc.COD_PESSOA,
                    TRIM(COALESCE(p.NOME,'(sem nome)'))  AS CLIENTE,
                    COUNT(*)                              AS QTD_NOTAS,
                    COALESCE(SUM(nc.TOTAL_NOTA),0)       AS TOTAL_DEVOLVIDO
                FROM NOTAS_CAB nc
                JOIN TIPO_OPERACAO t ON t.COD_TIPO_OPERACAO = nc.COD_TIPO_OPERACAO AND t.COD_EMPRESA = nc.COD_EMPRESA
                LEFT JOIN PESSOAS p ON p.COD_PESSOA = nc.COD_PESSOA
                WHERE nc.DATA_EMISSAO >= '{$dataIni}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$dataFim}' AS DATE))
                  AND t.DEVOLUCAO = 'S' AND t.TIPO_NATUREZA = 'V' AND nc.DATA_CANC IS NULL
                  {$fe}
                GROUP BY nc.COD_PESSOA, p.NOME
                ORDER BY TOTAL_DEVOLVIDO DESC
            ")->fetchAll(\PDO::FETCH_ASSOC);

            $topClientes = array_map(fn($r) => [
                'cod_pessoa'     => $r['COD_PESSOA'],
                'cliente'        => $r['CLIENTE'],
                'qtd_notas'      => (int)$r['QTD_NOTAS'],
                'total_devolvido'=> (float)$r['TOTAL_DEVOLVIDO'],
            ], $topClientes);
        } catch (\Throwable) {
            $topClientes = [];
        }

        // â”€â”€ Anos disponÃ­veis â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $anosDisponiveis = [];
        try {
            $rows = $pdo->query("
                SELECT DISTINCT EXTRACT(YEAR FROM nc.DATA_EMISSAO) AS ANO
                FROM NOTAS_CAB nc
                JOIN TIPO_OPERACAO t ON t.COD_TIPO_OPERACAO = nc.COD_TIPO_OPERACAO AND t.COD_EMPRESA = nc.COD_EMPRESA
                WHERE t.DEVOLUCAO = 'S' AND t.TIPO_NATUREZA = 'V' AND nc.DATA_CANC IS NULL {$fe}
                ORDER BY ANO DESC
            ")->fetchAll(\PDO::FETCH_COLUMN);

            $anosDisponiveis = array_map('intval', $rows);
        } catch (\Throwable) {
            // fallback
        }

        if (empty($anosDisponiveis)) {
            $anosDisponiveis = [(int)date('Y')];
        }

        // â”€â”€ Monta resposta â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
        $this->jsonOk([
            'filtro' => [
                'ano' => $ano,
                'mes' => $mes,
            ],
            'kpis' => [
                'qtd_notas'       => $kpis['qtd_notas'],
                'total_devolvido' => round($kpis['total_devolvido'], 2),
                'ticket_medio'    => round($kpis['ticket_medio'], 2),
                'faturamento'     => round($faturamento, 2),
                'perc_devolucao'  => $percDevolucao,
            ],
            'por_mes'          => $porMes,
            'top_produtos'     => $topProdutos,
            'top_clientes'     => $topClientes,
            'anos_disponiveis' => $anosDisponiveis,
        ]);
    }
}
