<?php

namespace App\Controllers;

use App\Core\Database;
use App\Core\View;
use App\Services\DashboardService;

class DashboardController
{
    // ── Filtros SEM consulta ao banco — só session + GET ─────────────────────
    // Retorna filtroAno/filtroMes para injetar no shell view.
    private function filtrosSemDB(): array
    {
        // Botão "Hoje" — limpa session e força data de hoje
        if (isset($_GET['hoje']) && $_GET['hoje'] === '1') {
            unset($_SESSION['filtro_ano'], $_SESSION['filtro_mes']);
        }

        $filtroAno = isset($_GET['ano']) && ctype_digit($_GET['ano'])
            ? (int)$_GET['ano']
            : (isset($_SESSION['filtro_ano']) ? (int)$_SESSION['filtro_ano'] : null);
        $filtroMes = isset($_GET['mes']) && ctype_digit($_GET['mes'])
            ? (int)$_GET['mes']
            : (isset($_SESSION['filtro_mes']) && $_SESSION['filtro_mes'] > 0 ? (int)$_SESSION['filtro_mes'] : null);

        if ($filtroMes && ($filtroMes < 1 || $filtroMes > 12)) $filtroMes = null;
        if ($filtroAno && ($filtroAno < 1990 || $filtroAno > 2100)) $filtroAno = null;

        // Persist to session
        if ($filtroAno) $_SESSION['filtro_ano'] = $filtroAno;
        if ($filtroMes) $_SESSION['filtro_mes'] = $filtroMes;

        return [
            'filtroAno' => $filtroAno,
            'filtroMes' => $filtroMes,
            'eHoje'     => !$filtroAno && !(isset($_GET['hoje']) && $_GET['hoje'] === '0'),
        ];
    }

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

        $config  = $this->carregarConfig();
        $filtros = $this->filtrosSemDB();

        View::render('dashboard/index', [
            'titulo'    => 'Dashboard — Premium Express Gestão',
            'config'    => $config,
            'conexao'   => ['success' => true, 'mensagem' => ''],
            'segmento'  => \App\Core\Lojas::resolverSegmento($config),
            'filtroAno' => $filtros['filtroAno'],
            'filtroMes' => $filtros['filtroMes'],
            'eHoje'     => $filtros['eHoje'],
            'ano'       => date('Y'),
        ]);
    }

    // ── API: executa todas as queries e devolve JSON ──────────────────────────
    public function dashboardApi(): 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');

        $filtros   = $this->filtrosSemDB();
        $filtroAno = $filtros['filtroAno'];
        $filtroMes = $filtros['filtroMes'];

        $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);
            $svc = new DashboardService($filtroAno, $filtroMes);
            $dados = [
                'meta'           => $svc->meta(),
                'meta_vs_real'   => $svc->metaVsRealizado(),
                'indicadores'    => $svc->indicadores(),
                'alertas'        => $svc->alertas(),
                'mesas'          => $svc->listaMesas(),
                'top_produtos'   => $svc->topProdutos('hoje'),
                'top_semana'     => $svc->topProdutos('semana'),
                'grafico_dias'   => $svc->graficoFaturamentoDiario(30),
                'grafico_horas'  => $svc->graficoHorasPico(),
                'grafico_mensal' => $svc->graficoHistoricoMensal(),
                'grafico_anual'  => $svc->graficoHistoricoAnual(),
                'top_historico'  => $svc->topProdutosHistorico(),
                'top_dias'       => $svc->topDiasHistorico(),
                'rolling_12m'    => $svc->graficoRolling12m(),
            ];
            echo json_encode(['ok' => true, 'dados' => $dados], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } 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) : [];
    }
}
