<?php

namespace App\Controllers;

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

/**
 * Relatório de Vendas configurável (espelha o relatório do ERP):
 * filtros amplos + modo sintético/analítico + exportação.
 */
class RelatorioVendasController
{
    private function repo(): VendasRepository { return new VendasRepository(Database::conectar()); }

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

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

    // GET /relatorios/vendas-avancado — shell + lookups dos filtros
    public function index(): void
    {
        $this->guardaConexao();
        // Lookups carregam via /api (async) p/ a página abrir instantânea.
        $config = $this->config();
        View::render('relatorios/vendas-avancado', [
            'titulo'   => 'Relatório de Vendas — Premium Express Gestão',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'lookups'  => [],
            'ano'      => date('Y'),
        ]);
    }

    // GET /api/relatorios/vendas-avancado/lookups — listas dos selects (cacheado)
    public function lookupsApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            echo json_encode($this->repo()->relatorioVendasLookups(), 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/relatorios/vendas-avancado — executa com os filtros
    public function dadosApi(): void
    {
        $this->guardaConexao();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $g = $_GET;
            $f = [
                'data_ini'   => $g['data_ini']   ?? null,
                'data_fim'   => $g['data_fim']   ?? null,
                'data_campo' => $g['data_campo'] ?? 'emissao',
                'naturezas'  => isset($g['naturezas']) ? array_filter(explode(',', (string)$g['naturezas'])) : [],
                'nat_ini'    => $g['nat_ini']  ?? null,
                'nat_fim'    => $g['nat_fim']  ?? null,
                'nota_ini'   => $g['nota_ini'] ?? null,
                'nota_fim'   => $g['nota_fim'] ?? null,
                'serie'      => $g['serie']    ?? null,
                'cli_ini'    => $g['cli_ini']  ?? null,
                'cli_fim'    => $g['cli_fim']  ?? null,
                'vendedor'   => $g['vendedor'] ?? null,
                'cond'       => $g['cond']     ?? null,
                'forma'      => $g['forma']    ?? null,
                'agente'     => $g['agente']   ?? null,
                'usuario'    => $g['usuario']  ?? null,
                'canceladas' => $g['canceladas'] ?? 'excluir',
                'nfce'       => !empty($g['nfce']),
                'nfe'        => !empty($g['nfe']),
                'so_servicos'        => !empty($g['so_servicos']),
                'so_promocao'        => !empty($g['so_promocao']),
                'so_gera_financeiro' => !empty($g['so_gera_financeiro']),
                'ignora_naodre'      => !empty($g['ignora_naodre']),
                'inc_mov_interna'    => !empty($g['inc_mov_interna']),
                'inc_transferencias' => !empty($g['inc_transferencias']),
                'inc_devolucoes'     => !empty($g['inc_devolucoes']),
                'custos'     => !empty($g['custos']),
                'produtos'   => !empty($g['produtos']),
                'ordenar'    => $g['ordenar'] ?? 'data',
                'limite'     => $g['limite']  ?? 1000,
            ];
            echo json_encode($this->repo()->relatorioVendas($f), 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;
    }
}
