<?php

namespace App\Controllers;

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

class EstoqueController
{
    private function repo(): EstoqueRepository
    {
        return new EstoqueRepository(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; }
    }

    // ── Filtros SEM consulta ao banco — só session + GET ─────────────────────
    // Usado para render do shell: TTFB < 10ms, sem conexão Firebird.
    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;

        $anoSel   = (int)substr($dataIni, 0, 4);
        $anoAtual = (int)date('Y');
        $anos     = range($anoAtual, max(2020, $anoAtual - 4));

        return compact('dataIni', 'dataFim', 'anos', 'anoSel');
    }

    // ── API helper: parse e valida datas do GET ───────────────────────────────
    private function parseDatas(string $ultimaFallback): array
    {
        // Padrão = últimos 15 dias (janela menor carrega bem mais rápido a frio).
        // O usuário pode ampliar o período pelo filtro de datas da própria tela.
        $padraoIni = date('Y-m-d', strtotime($ultimaFallback . ' -14 days'));
        $dataIni = $_GET['data_ini'] ?? $padraoIni;
        $dataFim = $_GET['data_fim'] ?? $ultimaFallback;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataIni)) $dataIni = $padraoIni;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataFim))  $dataFim = $ultimaFallback;
        if ($dataFim < $dataIni) $dataFim = $dataIni;
        return [$dataIni, $dataFim];
    }

    // ════════════════════════════════════════════════════════════════════════
    //  PÁGINAS — shell instantâneo, sem queries no render
    // ════════════════════════════════════════════════════════════════════════

    public function posicao(): void
    {
        $this->guardaConexao();
        $config  = $this->config();
        $filtros = $this->filtrosSemDB();

        View::render('estoque/posicao', [
            'titulo'   => 'Posição de Estoque — Premium Express Gestão',
            'config'   => $config,
            'conexao'  => ['success' => true, 'mensagem' => ''],
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'filtros'  => $filtros,
            'erros'    => [],
            'ano'      => date('Y'),
        ]);
    }

    public function minimos(): void
    {
        $this->guardaConexao();
        $config  = $this->config();
        $filtros = $this->filtrosSemDB();

        View::render('estoque/minimos', [
            'titulo'   => 'Estoque Abaixo do Mínimo — Premium Express Gestão',
            'config'   => $config,
            'conexao'  => ['success' => true, 'mensagem' => ''],
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'filtros'  => $filtros,
            'erros'    => [],
            'ano'      => date('Y'),
        ]);
    }

    public function giro(): void
    {
        $this->guardaConexao();
        $config  = $this->config();
        $filtros = $this->filtrosSemDB();

        View::render('estoque/giro', [
            'titulo'   => 'Giro de Estoque — Premium Express Gestão',
            'config'   => $config,
            'conexao'  => ['success' => true, 'mensagem' => ''],
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'filtros'  => $filtros,
            'erros'    => [],
            'ano'      => date('Y'),
        ]);
    }

    public function margem(): void
    {
        $this->guardaConexao();
        $config  = $this->config();
        $filtros = $this->filtrosSemDB();

        View::render('estoque/margem', [
            'titulo'   => 'Custo × Margem — Premium Express Gestão',
            'config'   => $config,
            'conexao'  => ['success' => true, 'mensagem' => ''],
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'filtros'  => $filtros,
            'erros'    => [],
            'ano'      => date('Y'),
        ]);
    }

    public function inventario(): void
    {
        $this->guardaConexao();
        $config  = $this->config();
        $filtros = $this->filtrosSemDB();

        View::render('estoque/inventario', [
            'titulo'   => 'Inventário — Premium Express Gestão',
            'config'   => $config,
            'conexao'  => ['success' => true, 'mensagem' => ''],
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'filtros'  => $filtros,
            'erros'    => [],
            'ano'      => date('Y'),
        ]);
    }

    // ════════════════════════════════════════════════════════════════════════
    //  APIs JSON — dados carregados pelo browser após o shell aparecer
    // ════════════════════════════════════════════════════════════════════════

    /** GET /api/estoque/kpis */
    public function kpisApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $repo  = $this->repo();
            $kpis  = $repo->kpis();
            $anos  = range((int)date('Y'), max(2020, (int)date('Y') - 4));
            echo json_encode([
                'kpis' => $kpis,
                'anos' => $anos,
            ], 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;
    }

    /** GET /api/estoque/kpis-minimos */
    public function kpisMinimosApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $repo = $this->repo();
            $kpis = $repo->kpisMinimos();
            echo json_encode(['kpis' => $kpis], 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;
    }

    /** GET /api/estoque/posicao?busca= */
    public function posicaoApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $repo   = $this->repo();
            $busca  = trim($_GET['busca'] ?? '');
            $linhas = $repo->posicao($busca);
            echo json_encode(['linhas' => $linhas], 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;
    }

    /** GET /api/estoque/minimos */
    public function minimosApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $repo   = $this->repo();
            $linhas = $repo->minimos();
            echo json_encode(['linhas' => $linhas], 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;
    }

    /** GET /api/estoque/giro?data_ini=&data_fim= */
    public function giroApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $repo   = $this->repo();
            $ultima = $repo->ultimaData();
            [$dataIni, $dataFim] = $this->parseDatas($ultima);
            $linhas = $repo->giro($dataIni, $dataFim);
            echo json_encode(['linhas' => $linhas, 'dataIni' => $dataIni, 'dataFim' => $dataFim], 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;
    }

    /** GET /api/estoque/margem */
    public function margemApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $repo   = $this->repo();
            $linhas = $repo->margem();
            echo json_encode(['linhas' => $linhas], 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;
    }

    /** GET /api/estoque/inventario */
    public function inventarioApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $repo   = $this->repo();
            $linhas = $repo->inventario();
            echo json_encode(['linhas' => $linhas], 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;
    }
}
