<?php

namespace App\Controllers;

use App\Core\View;
use App\Services\FechamentoCaixaService;

/**
 * Controla o módulo Fechamento de Caixa.
 *
 * Rotas:
 *   GET /caixa/fechamento        → index()  — renderiza a página (shell HTML)
 *   GET /caixa/fechamento/dados  → dados()  — retorna JSON para o card AJAX
 */
class FechamentoCaixaController
{
    // =========================================================================
    // PÁGINA PRINCIPAL (shell HTML)
    // =========================================================================

    public function index(): void
    {
        // Shell instantâneo — sem queries ao Firebird aqui.
        // Operadores e datas são carregados via JS após o DOM pronto.
        $hoje    = date('Y-m-d');
        $dataIni = $_GET['data_ini'] ?? date('Y-m-d', strtotime('-30 days'));
        $dataFim = $_GET['data_fim'] ?? $hoje;
        $operador = trim($_GET['operador'] ?? '');

        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataIni)) $dataIni = date('Y-m-d', strtotime('-30 days'));
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataFim))  $dataFim = $hoje;

        View::render('caixa/fechamento', [
            'titulo'     => 'Fechamento de Caixa',
            'operadores' => [],   // carregado via /caixa/fechamento/operadores
            'operador'   => $operador,
            'dataIni'    => $dataIni,
            'dataFim'    => $dataFim,
        ]);
    }

    // =========================================================================
    // ENDPOINT JSON — operadores com movimento no período
    // =========================================================================

    /**
     * GET /caixa/fechamento/operadores?periodo=hoje|semana|mes|ano
     * Retorna lista de operadores com fechamentos no período selecionado.
     * Usa a data do último fechamento como âncora (não hoje).
     */
    public function operadores(): void
    {
        header('Content-Type: application/json; charset=UTF-8');

        $periodo = $_GET['periodo'] ?? 'mes';

        $svc    = new FechamentoCaixaService();
        $repo   = $svc->getRepo();

        // Período manual: usa datas passadas diretamente
        if ($periodo === 'manual') {
            $dataIni = $_GET['data_ini'] ?? '';
            $dataFim = $_GET['data_fim'] ?? '';
            if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataIni) ||
                !preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataFim)) {
                echo json_encode(['sucesso' => false, 'mensagem' => 'Datas inválidas.']);
                return;
            }
        } else {
            if (!in_array($periodo, ['hoje', 'semana', 'mes', 'ano'], true)) {
                $periodo = 'mes';
            }
            // Âncora = última data com fechamento registrado
            $ancora  = $repo->ultimaDataFechamento() ?: date('Y-m-d');
            $dataFim = $ancora;

            switch ($periodo) {
                case 'hoje':
                    // "Hoje" = hoje de verdade (não a âncora do último fechamento).
                    $dataIni = date('Y-m-d');
                    $dataFim = date('Y-m-d');
                    break;
                case 'semana':
                    $dataIni = date('Y-m-d', strtotime($ancora . ' -6 days'));
                    break;
                case 'ano':
                    $dataIni = date('Y-m-d', strtotime($ancora . ' -364 days'));
                    break;
                default: // mes
                    $dataIni = date('Y-m-d', strtotime($ancora . ' -29 days'));
            }
        }

        $operadores = $repo->operadoresComMovimento($dataIni, $dataFim);

        echo json_encode([
            'sucesso'    => true,
            'periodo'    => $periodo,
            'data_ini'   => $dataIni,
            'data_fim'   => $dataFim,
            'operadores' => $operadores,
        ], JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR);
    }

    // =========================================================================
    // ENDPOINT JSON — consumido pelo card via fetch()
    // =========================================================================

    public function dados(): void
    {
        header('Content-Type: application/json; charset=UTF-8');

        // Parâmetros do filtro
        $operador = trim($_GET['operador'] ?? '');
        $dataIni  = $_GET['data_ini'] ?? '';
        $dataFim  = $_GET['data_fim'] ?? '';

        // Validações básicas
        if ($operador === '') {
            echo json_encode(['sucesso' => false, 'mensagem' => 'Informe o operador.']);
            return;
        }
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataIni) ||
            !preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataFim)) {
            echo json_encode(['sucesso' => false, 'mensagem' => 'Datas inválidas.']);
            return;
        }

        try {
            set_time_limit(300); // 5 min — queries Firebird podem ser lentas
            $svc         = new FechamentoCaixaService();
            $fechamentos = $svc->fechamentosCompletos($operador, $dataIni, $dataFim);

            echo json_encode([
                'sucesso'      => true,
                'total'        => count($fechamentos),
                'fechamentos'  => $fechamentos,
            ], JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR);

        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode([
                'sucesso'   => false,
                'mensagem'  => $e->getMessage(),
            ], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        }
    }
}
