<?php

namespace App\Controllers;

use App\Core\Database;
use App\Core\View;
use App\Repositories\FinanceiroRepository;
use App\Repositories\VendasRepository;
use App\Services\DashboardService;

class ExecutivoController
{
    // ── Shell: renderiza esqueleto sem tocar no banco ─────────────────────────
    public function index(): void
    {
        if (!Database::estaConfigurado()) {
            header('Location: /configurar');
            exit;
        }

        $config = $this->carregarConfig();

        View::render('executivo/index', [
            'titulo'  => 'Painel Executivo — Premium Express Gestão',
            'config'  => $config,
            'ano'     => date('Y'),
        ]);
    }

    // ── API: executa todas as queries e devolve JSON ──────────────────────────
    public function api(): void
    {
        if (!Database::estaConfigurado()) {
            header('Content-Type: application/json; charset=utf-8');
            http_response_code(503);
            echo json_encode(['erro' => 'Banco não configurado'], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
            exit;
        }

        header('Content-Type: application/json; charset=utf-8');

        $status = Database::verificar();
        if (!$status['success']) {
            http_response_code(503);
            echo json_encode(['erro' => $status['mensagem']], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
            exit;
        }

        try {
            set_time_limit(0);

            $pdo = Database::conectar();
            $anoAtual = (int)date('Y');
            $mesAtual = (int)date('m');

            $meses = ['','Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'];

            // ── DRE do mês atual ──────────────────────────────────────────────
            $dreMes = [
                'receita_bruta' => 0.0,
                'cmv'           => 0.0,
                'descontos'     => 0.0,
                'lucro_bruto'   => 0.0,
                'margem_pct'    => 0.0,
                'cmv_confiavel' => true,
            ];
            try {
                $finRepo = new FinanceiroRepository($pdo);
                $dreAnual = $finRepo->dreMensal($anoAtual);

                // Heuristica: CMV total >= receita liq. OU >50% dos meses ruins → nao confiavel.
                // Espelha VendasRepository::cmvConfiavel() e FinanceiroController::dreApi().
                $totCmvAno = 0.0; $totFatAno = 0.0; $mRuins = 0; $mValidos = 0;
                foreach ($dreAnual as $row) {
                    $cmvR = (float)($row['CMV'] ?? 0);
                    $fatR = (float)($row['RECEITA_BRUTA'] ?? 0) - (float)($row['DESCONTOS'] ?? 0);
                    $totCmvAno += $cmvR; $totFatAno += $fatR;
                    if ($fatR > 0) { $mValidos++; if ($cmvR >= $fatR) $mRuins++; }
                }
                $cmvConfiavel = true;
                if ($totFatAno > 0 || $totCmvAno > 0) {
                    if ($totCmvAno >= $totFatAno) $cmvConfiavel = false;
                    elseif ($mValidos > 0 && ($mRuins / $mValidos) > 0.5) $cmvConfiavel = false;
                }

                foreach ($dreAnual as $row) {
                    if ((int)$row['MES'] === $mesAtual) {
                        $rb = (float)($row['RECEITA_BRUTA'] ?? 0);
                        $cmv = (float)($row['CMV'] ?? 0);
                        $desc = (float)($row['DESCONTOS'] ?? 0);
                        $lb = $rb - $cmv;
                        $marg = $rb > 0 ? ($lb / $rb * 100) : 0;
                        $dreMes = [
                            'receita_bruta' => round($rb, 2),
                            'cmv'           => round($cmv, 2),
                            'descontos'     => round($desc, 2),
                            'lucro_bruto'   => round($lb, 2),
                            'margem_pct'    => round($marg, 2),
                            'cmv_confiavel' => $cmvConfiavel,
                        ];
                        break;
                    }
                }
                // Se nao achou o mes corrente mas tem dados do ano, ainda guarda o flag
                if (!isset($dreMes['cmv_confiavel']) || $dreMes['cmv_confiavel'] === true) {
                    $dreMes['cmv_confiavel'] = $cmvConfiavel;
                }
            } catch (\Throwable) {}

            // ── Tendência 6 meses — usa VendasRepository (mesma query do BI) ──
            $tendencia6m = ['labels' => [], 'receita' => [], 'qtd' => []];
            try {
                $vendRepo2   = new VendasRepository($pdo);
                $mensais     = $vendRepo2->vendasMensais($anoAtual);
                // Filtra até o mês atual e pega os últimos 6
                $mesesDisp = array_filter($mensais, fn($r) => (int)$r['MES'] <= $mesAtual);
                $ultimos6  = array_slice(array_values($mesesDisp), -6);
                foreach ($ultimos6 as $row) {
                    $tendencia6m['labels'][]  = $meses[(int)$row['MES']];
                    $tendencia6m['receita'][] = round((float)($row['TOTAL'] ?? 0), 2);
                    $tendencia6m['qtd'][]     = (int)($row['QTD_NOTAS'] ?? 0);
                }
            } catch (\Throwable) {}

            // ── DashboardService: alertas, meta vs realizado, indicadores ─────
            $alertas   = [];
            $metaVsReal = [];
            $indicadores = [];
            try {
                $svc = new DashboardService();
                $alertas     = $svc->alertas();
                $metaVsReal  = $svc->metaVsRealizado();
                $indicadores = $svc->indicadores();
            } catch (\Throwable) {}

            // ── Top 5 vendedores do mês ───────────────────────────────────────
            $topVendedores = [];
            try {
                $vendRepo = new VendasRepository($pdo);
                $dataIni  = date('Y-m-01');
                $dataFim  = date('Y-m-d');
                $todos    = $vendRepo->vendasPorVendedor($dataIni, $dataFim);
                $topVendedores = array_slice($todos, 0, 5);
            } catch (\Throwable) {}

            // ── Score de Saúde (0–100) ────────────────────────────────────────
            $score = 0;

            // Meta (+30 / +15 / +0)
            $percMeta = (float)($metaVsReal['perc_meta'] ?? 0);
            $temMeta  = (bool)($metaVsReal['tem_meta'] ?? false);
            if ($temMeta) {
                if ($percMeta >= 100) $score += 30;
                elseif ($percMeta >= 70) $score += 15;
            }

            // Contas a pagar vencidas (+20 / +10)
            $pagarVencido = (float)($alertas['pagar_vencido_valor'] ?? 0);
            $aPagar       = (float)($alertas['a_pagar_valor'] ?? 0);
            if ($pagarVencido <= 0) {
                $score += 20;
            } elseif ($aPagar > 0 && ($pagarVencido / $aPagar) < 0.10) {
                $score += 10;
            }

            // Margem (+20 / +10) — só pontua se o CMV do ERP é confiável.
            // Sem custo cadastrado nos itens, o CMV vem absurdo → não dá pra avaliar.
            if (($dreMes['cmv_confiavel'] ?? true) === true) {
                $margem = $dreMes['margem_pct'];
                if ($margem >= 30) $score += 20;
                elseif ($margem >= 15) $score += 10;
            }

            // Estoque crítico (+15 / +8)
            $estoqueCritico = (int)($alertas['estoque_abaixo_qtd'] ?? 0);
            if ($estoqueCritico === 0) $score += 15;
            elseif ($estoqueCritico < 5) $score += 8;

            // Inadimplência (+15 / +8)
            $inadimplencia    = (float)($alertas['inadimplencia_valor'] ?? 0);
            $faturamentoMes   = (float)($indicadores['faturamento_mes'] ?? 0);
            if ($inadimplencia <= 0) {
                $score += 15;
            } elseif ($faturamentoMes > 0 && ($inadimplencia / $faturamentoMes) < 0.02) {
                $score += 8;
            }

            // Classificação
            if ($score >= 80) {
                $scoreCls = 'Saudável';
                $scoreCor = '#22c55e';
            } elseif ($score >= 60) {
                $scoreCls = 'Atenção';
                $scoreCor = '#f59e0b';
            } else {
                $scoreCls = 'Crítico';
                $scoreCor = '#ef4444';
            }

            $dados = [
                'dre_mes'       => $dreMes,
                'alertas'       => $alertas,
                'meta_vs_real'  => $metaVsReal,
                'indicadores'   => $indicadores,
                'top_vendedores'=> $topVendedores,
                'score'         => [
                    'valor' => $score,
                    'classe' => $scoreCls,
                    'cor'   => $scoreCor,
                ],
                'tendencia6m'   => $tendencia6m,
            ];

            echo json_encode(['ok' => true, 'dados' => $dados], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        }
        exit;
    }

    private function carregarConfig(): array
    {
        $path = dirname(__DIR__, 2) . '/config/database.php';
        return file_exists($path) ? (require $path) : [];
    }
}
