<?php
/**
 * api/financeiro.php — Lista o fluxo de caixa (entradas automáticas de
 * renovação/PIX + lançamentos manuais de entrada/saída) e permite ao
 * usuário lançar movimentações manuais (ex: despesas, custos avulsos).
 */

require_once __DIR__ . '/../core/db_helper.php';
require_once __DIR__ . '/../core/auth.php';

header('Content-Type: application/json; charset=utf-8');
$usuarioLogado = exigir_login();
$acao = $_GET['acao'] ?? $_POST['acao'] ?? 'listar';
$corpo = json_decode(file_get_contents('php://input'), true) ?? $_POST;

function responder_fin($d, $c = 200)
{
    http_response_code($c);
    echo json_encode($d, JSON_UNESCAPED_UNICODE);
    exit;
}

switch ($acao) {

    case 'listar':
        $financeiro = db_read('financeiro');
        $escopo = escopo_visibilidade($usuarioLogado);

        if ($escopo !== null) {
            // Filtra por: lançamentos ligados a clientes visíveis, ou
            // lançamentos manuais feitos pelo próprio usuário/subordinados.
            $clientes = db_read('clientes');
            $idsClientesVisiveis = array_column(array_filter($clientes, fn($c) => in_array($c['criado_por'] ?? '', $escopo, true)), 'id');
            $financeiro = array_values(array_filter($financeiro, function ($f) use ($idsClientesVisiveis, $escopo) {
                if (!empty($f['cliente_id'])) {
                    return in_array($f['cliente_id'], $idsClientesVisiveis, true);
                }
                return in_array($f['criado_por'] ?? '', $escopo, true);
            }));
        }

        // Filtro opcional por período (?de=2026-08-01&ate=2026-08-31).
        // Sem os parâmetros, mostra tudo (comportamento de sempre).
        $de = $_GET['de'] ?? '';
        $ate = $_GET['ate'] ?? '';
        if ($de || $ate) {
            $financeiro = array_values(array_filter($financeiro, function ($f) use ($de, $ate) {
                $dataItem = substr($f['data'] ?? '', 0, 10); // Y-m-d
                if ($de && $dataItem < $de) return false;
                if ($ate && $dataItem > $ate) return false;
                return true;
            }));
        }

        // Ordena mais recente primeiro
        usort($financeiro, fn($a, $b) => strcmp($b['data'] ?? '', $a['data'] ?? ''));

        $totalEntradas = 0.0;
        $totalSaidas = 0.0;
        foreach ($financeiro as $f) {
            if (($f['tipo'] ?? '') === 'entrada') $totalEntradas += (float) $f['valor'];
            if (($f['tipo'] ?? '') === 'saida') $totalSaidas += (float) $f['valor'];
        }

        responder_fin([
            'ok' => true,
            'movimentacoes' => array_slice($financeiro, 0, 300),
            'total_entradas' => $totalEntradas,
            'total_saidas' => $totalSaidas,
            'saldo' => $totalEntradas - $totalSaidas,
        ]);
        break;

    case 'criar':
        $tipo = $corpo['tipo'] ?? '';
        $valor = (float) ($corpo['valor'] ?? 0);
        $descricao = trim($corpo['descricao'] ?? '');

        if (!in_array($tipo, ['entrada', 'saida'], true) || $valor <= 0 || !$descricao) {
            responder_fin(['ok' => false, 'erro' => 'Informe tipo (entrada/saída), valor maior que zero e descrição.'], 422);
        }

        $novo = [
            'id' => gerar_id('FIN-'),
            'tipo' => $tipo,
            'origem' => 'lancamento_manual',
            'cliente_id' => null,
            'valor' => $valor,
            'descricao' => $descricao,
            'criado_por' => $usuarioLogado['id'],
            'data' => date('Y-m-d H:i:s'),
        ];

        db_update('financeiro', function (&$financeiro) use ($novo) {
            $financeiro[] = $novo;
        });

        auditoria_log($usuarioLogado['usuario'], 'FINANCEIRO_LANCAMENTO_MANUAL', "{$tipo}: R$ {$valor} - {$descricao}");
        responder_fin(['ok' => true, 'movimentacao' => $novo]);
        break;

    case 'deletar':
        $id = $corpo['id'] ?? '';
        db_update('financeiro', function (&$financeiro) use ($id) {
            $financeiro = array_values(array_filter($financeiro, fn($f) => $f['id'] !== $id));
        });
        auditoria_log($usuarioLogado['usuario'], 'FINANCEIRO_LANCAMENTO_REMOVIDO', $id);
        responder_fin(['ok' => true]);
        break;

    default:
        responder_fin(['ok' => false, 'erro' => 'Ação inválida.'], 400);
}
