<?php
// Depto de Engenharia e Automacao - Master Automacao - Autor: Derlivon Silva

namespace App\Controllers;

use App\Core\Database;
use App\Core\View;
use App\Repositories\ConveniosRepository;

class ConveniosController
{
    private function repo(): ConveniosRepository
    {
        return new ConveniosRepository(Database::conectar());
    }

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

    private function guardaConexao(): void
    {
        if (!Database::estaConfigurado()) { header('Location: /configurar'); exit; }
    }

    private function filtrosSemDB(): array
    {
        $hoje    = date('Y-m-d');
        $sessAno = isset($_SESSION['filtro_ano']) ? (int)$_SESSION['filtro_ano'] : null;
        $sessMes = isset($_SESSION['filtro_mes']) && (int)$_SESSION['filtro_mes'] > 0
                   ? (int)$_SESSION['filtro_mes'] : null;

        if ($sessAno && $sessMes) {
            $defaultIni = sprintf('%04d-%02d-01', $sessAno, $sessMes);
            $fimDoMes   = date('Y-m-t', strtotime($defaultIni));
            $defaultFim = min($fimDoMes, $hoje);
            if ($defaultIni > $hoje) { $defaultIni = $defaultFim = $hoje; }
        } elseif ($sessAno) {
            $defaultIni = sprintf('%04d-01-01', $sessAno);
            $defaultFim = min(sprintf('%04d-12-31', $sessAno), $hoje);
        } else {
            $defaultIni = date('Y-m-01');
            $defaultFim = $hoje;
        }
        $dataIni = $_GET['data_ini'] ?? $defaultIni;
        $dataFim = $_GET['data_fim'] ?? $defaultFim;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataIni)) $dataIni = $defaultIni;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataFim))  $dataFim = $defaultFim;
        if ($dataFim < $dataIni) $dataFim = $dataIni;
        $anoAtual = (int)date('Y');
        $anos = range($anoAtual, max(2020, $anoAtual - 4));
        return compact('dataIni','dataFim','anos');
    }

    private function parseDatas(): array
    {
        $hoje    = date('Y-m-d');
        $default = date('Y-m-01');
        $dataIni = $_GET['data_ini'] ?? $default;
        $dataFim = $_GET['data_fim'] ?? $hoje;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataIni)) $dataIni = $default;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataFim))  $dataFim = $hoje;
        if ($dataFim < $dataIni) $dataFim = $dataIni;
        return [$dataIni, $dataFim];
    }

    private function render(string $view, string $titulo): void
    {
        $this->guardaConexao();
        $config = $this->config();
        View::render($view, [
            'titulo'   => $titulo . ' — Premium Express Gestão',
            'config'   => $config,
            'conexao'  => ['success' => true, 'mensagem' => ''],
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'filtros'  => $this->filtrosSemDB(),
            'erros'    => [],
            'ano'      => date('Y'),
        ]);
    }

    public function painel(): void          { $this->render('convenios/painel',          'Convênios — Painel'); }
    public function aging(): void           { $this->render('convenios/aging',           'Convênios — Aging'); }
    public function topConveniados(): void  { $this->render('convenios/top-conveniados', 'Top Conveniados'); }

    public function painelApi(): void
    {
        header('Content-Type: application/json; charset=utf-8');
        [$ini, $fim] = $this->parseDatas();
        try {
            $repo  = $this->repo();
            $kpis  = $repo->painel($ini, $fim);
            $lista = $repo->listar($ini, $fim);   // CONVENIOS-tabela
            $formas = $repo->formasConvenio($ini, $fim); // FORMA_PGTO tipo convenio

            // Marca origem nas linhas da tabela CONVENIOS
            foreach ($lista as &$r) { $r['ORIGEM'] = $r['ORIGEM'] ?? 'convenio'; $r['QTD_NOTAS'] = $r['QTD_NOTAS'] ?? null; }
            unset($r);

            // Soma totais das formas nos KPIs (não havendo CONVENIOS, mostra as formas-tipo)
            foreach ($formas as $f) {
                $kpis['vendido_periodo']      += (float)$f['VENDIDO_PERIODO'];
                $kpis['recebido_periodo']     += (float)$f['RECEBIDO_PERIODO'];
                $kpis['saldo_aberto_periodo'] += (float)$f['SALDO_TOTAL_ABERTO'];
                $kpis['vencido_total']        += (float)$f['SALDO_VENCIDO'];
                $kpis['qtd_titulos_periodo']  += (int)  $f['QTD_NOTAS'];
                $kpis['qtd_titulos_vencidos'] += (int)  ($f['QTD_TITULOS_VENCIDOS'] ?? 0);
            }
            $kpis['total_convenios_ativos'] = (int)$kpis['total_convenios_ativos'] + count($formas);

            echo json_encode([
                'ok'      => true,
                'kpis'    => $kpis,
                'lista'   => array_merge($lista, $formas),
            ]);
        } catch (\Throwable $e) { http_response_code(500); echo json_encode(['ok'=>false,'erro'=>$e->getMessage()]); }
    }

    public function agingApi(): void
    {
        header('Content-Type: application/json; charset=utf-8');
        try { echo json_encode(['ok'=>true,'aging'=>$this->repo()->aging()]); }
        catch (\Throwable $e) { http_response_code(500); echo json_encode(['ok'=>false,'erro'=>$e->getMessage()]); }
    }

    public function topConveniadosApi(): void
    {
        header('Content-Type: application/json; charset=utf-8');
        [$ini, $fim] = $this->parseDatas();
        $limite = max(5, min(200, (int)($_GET['limite'] ?? 30)));
        try {
            $repo = $this->repo();
            $a = $repo->topConveniados($ini, $fim, $limite);       // CONVENIOS formais
            $b = $repo->topConveniadosFormas($ini, $fim, $limite); // formas-tipo-convenio
            $rows = array_merge($a, $b);
            usort($rows, fn($x,$y) => (float)($y['TOTAL_COMPRADO']??0) <=> (float)($x['TOTAL_COMPRADO']??0));
            if (count($rows) > $limite) $rows = array_slice($rows, 0, $limite);
            echo json_encode(['ok'=>true,'rows'=>$rows]);
        } catch (\Throwable $e) { http_response_code(500); echo json_encode(['ok'=>false,'erro'=>$e->getMessage()]); }
    }
}
