<?php
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
// (parte do Premium Express BI - Fire Sistemas)
//
// /cadastro/top-criticos — Top 100 SKUs Criticos (Achadinhos)
//
// Tela ALINHADA com /diag/cadastro, mas com angulo executivo: nao olha o
// catalogo inteiro, olha SO os campeoes de venda dos ultimos 90d que tem
// cadastro furado. E o "foco da limpeza" pro cliente: cada item dessa lista
// deixou de virar margem ou virou prejuizo.
//
// Endpoints:
//   GET /cadastro/top-criticos            -> view
//   GET /api/cadastro/top-criticos/csv    -> download "Pedido pra Fornecedor"
//
// Filtros via querystring: ?dias=90&f=todos&limite=100

declare(strict_types=1);

namespace App\Controllers;

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

class TopCriticosController
{
    /** Sanitiza dias / filtro / limite com defaults seguros. */
    private function entradaPadrao(): array
    {
        $diasIn  = (int)($_GET['dias']   ?? 90);
        $dias    = in_array($diasIn, CadastroCriticosRepository::DIAS_VALIDOS, true) ? $diasIn : 90;

        $filtro  = (string)($_GET['f'] ?? 'todos');
        if (!in_array($filtro, CadastroCriticosRepository::FILTROS_VALIDOS, true)) {
            $filtro = 'todos';
        }

        $limIn   = (int)($_GET['limite'] ?? 100);
        $limite  = in_array($limIn, CadastroCriticosRepository::LIMITES_VALIDOS, true) ? $limIn : 100;

        return [$dias, $filtro, $limite];
    }

    /** Config segura da loja ativa (sem senha) — mesmo padrao de DiagCadastroController. */
    private function configLojaSegura(?string $idLoja): array
    {
        if ($idLoja === null) {
            $path = dirname(__DIR__, 2) . '/config/database.php';
            $cfg  = is_file($path) ? (@include $path) : [];
            if (!is_array($cfg)) $cfg = [];
            return [
                'id'          => null,
                'nome'        => 'loja unica',
                'cod_empresa' => (int) ($cfg['cod_empresa'] ?? 0),
            ];
        }
        $bruto = Lojas::get($idLoja) ?? [];
        return [
            'id'          => $idLoja,
            'nome'        => (string)($bruto['nome'] ?? $idLoja),
            'cod_empresa' => (int)   ($bruto['cod_empresa'] ?? 0),
        ];
    }

    public function index(): void
    {
        // VPN + GROUP BY pesado: folga generosa.
        @ini_set('memory_limit', '512M');
        @set_time_limit(180);

        [$dias, $filtro, $limite] = $this->entradaPadrao();

        $erro          = '';
        $linhas        = [];
        $fatTotal      = 0.0;
        $fatTopN       = 0.0;
        $pctSobreTotal = 0.0;
        $qtdSemCusto   = 0;
        $qtdPrejuizo   = 0;
        $qtdSuspeito   = 0;
        $qtdSemPreco   = 0;
        $qtdSemMarca   = 0;

        try {
            $idLoja = null;
            try { $idLoja = Lojas::idAtiva(); } catch (\Throwable) {}
            $cfgLoja = $this->configLojaSegura($idLoja);

            $pdo  = $idLoja !== null ? Database::conectarLoja($idLoja) : Database::conectar();
            $repo = new CadastroCriticosRepository($pdo);

            $linhas   = $repo->topCriticos($dias, $filtro, $limite);
            $fatTotal = $repo->faturamentoTotal($dias);

            // KPIs derivados das linhas retornadas (rapido, sem nova query).
            foreach ($linhas as $r) {
                $fatTopN += (float)($r['FATURAMENTO'] ?? 0);
                if (!empty($r['FLAG_SEM_CUSTO'])) $qtdSemCusto++;
                if (!empty($r['FLAG_PREJUIZO']))  $qtdPrejuizo++;
                if (!empty($r['FLAG_SUSPEITO']))  $qtdSuspeito++;
                if (!empty($r['FLAG_SEM_PRECO'])) $qtdSemPreco++;
                if (!empty($r['FLAG_SEM_MARCA'])) $qtdSemMarca++;
            }
            $pctSobreTotal = $fatTotal > 0 ? round($fatTopN / $fatTotal * 100, 1) : 0.0;

            // % participacao no faturamento do top N (denominador = fatTopN).
            foreach ($linhas as &$r) {
                $r['PCT_PARTICIPACAO'] = $fatTopN > 0
                    ? round((float)$r['FATURAMENTO'] / $fatTopN * 100, 2)
                    : 0.0;
            }
            unset($r);

        } catch (\Throwable $e) {
            $erro    = $e->getMessage();
            $cfgLoja = $cfgLoja ?? ['id'=>null,'nome'=>'loja','cod_empresa'=>0];
        }

        View::render('cadastro/top-criticos', [
            'titulo'          => ($limite >= 999999 ? 'TODOS os' : 'Top ' . $limite) . ' SKUs Críticos — Foco da Limpeza de Cadastro',
            'subtitulo'       => ($limite >= 999999 ? 'Todos os' : 'Os ' . $limite) . ' itens que vendem nos últimos ' . $dias . ' dias e têm cadastro com problema (ordenado pelos mais críticos primeiro)',
            'erro'            => $erro,
            'cfg_loja'        => $cfgLoja,
            'dias'            => $dias,
            'filtro'          => $filtro,
            'limite'          => $limite,
            'dias_validos'    => CadastroCriticosRepository::DIAS_VALIDOS,
            'filtros_validos' => CadastroCriticosRepository::FILTROS_VALIDOS,
            'limites_validos' => CadastroCriticosRepository::LIMITES_VALIDOS,
            'linhas'          => $linhas,
            'fat_total'       => $fatTotal,
            'fat_top_n'       => $fatTopN,
            'pct_sobre_total' => $pctSobreTotal,
            'qtd_sem_custo'   => $qtdSemCusto,
            'qtd_prejuizo'    => $qtdPrejuizo,
            'qtd_suspeito'    => $qtdSuspeito,
            'qtd_sem_preco'   => $qtdSemPreco,
            'qtd_sem_marca'   => $qtdSemMarca,
        ]);
    }

    /**
     * CSV "Pedido pra Fornecedor".
     * Colunas: EAN | COD_ITEM | DESCRICAO | MARCA | QTD_VENDIDA_90D | FORNECEDOR
     * Nome: pedido-tabela-fornecedor-{loja}-{YYYYMMDD}.csv
     */
    public function exportarCsvApi(): void
    {
        @ini_set('memory_limit', '512M');
        @set_time_limit(180);

        [$dias, $filtro, $limite] = $this->entradaPadrao();

        try {
            $idLoja = null;
            try { $idLoja = Lojas::idAtiva(); } catch (\Throwable) {}
            $cfgLoja = $this->configLojaSegura($idLoja);

            $pdo  = $idLoja !== null ? Database::conectarLoja($idLoja) : Database::conectar();
            $repo = new CadastroCriticosRepository($pdo);
            $linhas = $repo->topCriticos($dias, $filtro, $limite);
        } catch (\Throwable $e) {
            // Em caso de falha, devolve CSV vazio com mensagem (cliente abre, ve o erro e avisa).
            while (ob_get_level() > 0) { @ob_end_clean(); }
            header('Content-Type: text/csv; charset=UTF-8');
            header('Content-Disposition: attachment; filename="erro-top-criticos.csv"');
            echo chr(0xEF) . chr(0xBB) . chr(0xBF);
            echo "ERRO;" . str_replace(["\r","\n",';'], ' ', $e->getMessage()) . "\n";
            exit;
        }

        $slug = preg_replace('/[^a-z0-9]+/i', '-', strtolower((string)($cfgLoja['nome'] ?? 'loja')));
        $slug = trim((string)$slug, '-') ?: 'loja';
        $nome = sprintf('pedido-tabela-fornecedor-%s-%s.csv', $slug, date('Ymd'));

        while (ob_get_level() > 0) { @ob_end_clean(); }
        header('Content-Type: text/csv; charset=UTF-8');
        header('Content-Disposition: attachment; filename="' . $nome . '"');
        header('Cache-Control: no-store, no-cache, must-revalidate');
        header('Pragma: no-cache');

        // BOM UTF-8 pra Excel BR abrir certo.
        echo chr(0xEF) . chr(0xBB) . chr(0xBF);

        $fmtNum = static fn($v) => number_format((float)$v, 2, ',', '');
        $out = fopen('php://output', 'w');

        // Cabecalho amigavel pro fornecedor.
        fputcsv($out, [
            'EAN', 'COD_ITEM', 'DESCRICAO', 'MARCA',
            'QTD_VENDIDA_' . $dias . 'D', 'FATURAMENTO_' . $dias . 'D',
            'FORNECEDOR', 'ULTIMA_COMPRA', 'PROBLEMAS'
        ], ';');

        foreach ($linhas as $r) {
            $status = $r['STATUS'] ?? [];
            $statusTxt = is_array($status) ? implode('|', $status) : (string)$status;
            fputcsv($out, [
                (string)($r['EAN_PRINCIPAL']    ?? ''),
                (string)($r['COD_ITEM']         ?? ''),
                (string)($r['DESCRICAO']        ?? ''),
                (string)($r['MARCA']            ?? ''),
                $fmtNum($r['QTD_VENDIDA']       ?? 0),
                $fmtNum($r['FATURAMENTO']       ?? 0),
                (string)($r['FORNECEDOR_NOME']  ?? ''),
                (string)($r['FORNECEDOR_DATA']  ?? ''),
                strtoupper($statusTxt),
            ], ';');
        }
        fclose($out);
        exit;
    }
}
