<?php

namespace App\Controllers;

use App\Core\Database;
use App\Core\View;

class DespesasController
{
    private string $path;

    public function __construct()
    {
        $this->path = dirname(__DIR__, 2) . '/config/despesas.json';
    }

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

    public function lerDespesas(): array
    {
        if (!file_exists($this->path)) return ['categorias' => [], 'anos' => []];
        $d = json_decode(file_get_contents($this->path), true);
        return is_array($d) ? $d : ['categorias' => [], 'anos' => []];
    }

    public function despesasMes(int $ano, int $mes): float
    {
        $d = $this->lerDespesas();
        $cats = $d[$ano][$mes] ?? [];
        return array_sum(array_values($cats));
    }

    public function despesasMensaisAnual(int $ano): array
    {
        $d = $this->lerDespesas();
        $cats = $d['categorias'] ?? [];
        $out  = [];
        for ($m = 1; $m <= 12; $m++) {
            $row = ['MES' => $m, 'TOTAL' => 0];
            foreach ($cats as $cat) {
                $v = (float)($d[$ano][$m][$cat] ?? 0);
                $row[$cat]   = $v;
                $row['TOTAL'] += $v;
            }
            $out[$m] = $row;
        }
        return $out;
    }

    public function index(): void
    {
        $config = $this->config();
        $status = Database::verificar();
        $dados  = $this->lerDespesas();
        $cats   = $dados['categorias'] ?? [];

        $anoSel = isset($_GET['ano']) && ctype_digit($_GET['ano']) ? (int)$_GET['ano'] : (int)date('Y');
        $anos   = [];
        for ($a = (int)date('Y') + 1; $a >= 2017; $a--) $anos[] = $a;

        $nomeMeses = ['','Janeiro','Fevereiro','Março','Abril','Maio','Junho',
                      'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'];

        View::render('financeiro/despesas', [
            'titulo'    => 'Despesas Operacionais — Premium Express Gestão',
            'config'    => $config, 'conexao' => $status,
            'segmento'  => \App\Core\Lojas::resolverSegmento($config),
            'dados'     => $dados, 'cats' => $cats,
            'anoSel'    => $anoSel, 'anos' => $anos,
            'nomeMeses' => $nomeMeses,
            'salvo'     => isset($_GET['salvo']),
            'ano'       => date('Y'),
        ]);
    }

    public function salvar(): void
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            header('Location: /financeiro/despesas'); exit;
        }

        $ano  = isset($_POST['ano']) && ctype_digit($_POST['ano']) ? (int)$_POST['ano'] : (int)date('Y');
        $d    = $this->lerDespesas();
        $cats = $d['categorias'] ?? [];

        for ($m = 1; $m <= 12; $m++) {
            if (!isset($d[$ano][$m])) $d[$ano][$m] = [];
            foreach ($cats as $cat) {
                $key = 'desp_' . $m . '_' . md5($cat);
                $raw = str_replace(['.', ','], ['', '.'], trim($_POST[$key] ?? '0'));
                $d[$ano][$m][$cat] = max(0, (float)$raw);
            }
        }

        ksort($d);
        file_put_contents($this->path, json_encode($d, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
        header("Location: /financeiro/despesas?ano={$ano}&salvo=1");
        exit;
    }
}
