<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/helpers.php';
require_once __DIR__ . '/../config/indicacoes_helpers.php';

$data = input_json();
$idUsuario = (int) ($data['id_usuario'] ?? $data['id_motorista'] ?? $data['id_passageiro'] ?? 0);
$valorSolicitado = isset($data['valor']) ? (float) str_replace(',', '.', (string) $data['valor']) : null;

if ($idUsuario <= 0) {
    json_fail('Usuario nao informado.');
}

try {
    $pdo = db();
    $usuario = indicacoes_usuario_base($idUsuario);
    if (!$usuario) {
        json_fail('Usuario nao encontrado.', 404);
    }

    $resumo = indicacoes_resumo_usuario($idUsuario);
    $saldo = (float) $resumo['saldo_disponivel'];
    $valor = $valorSolicitado === null || $valorSolicitado <= 0 ? $saldo : round($valorSolicitado, 2);

    if (!indicacoes_conta_completa($usuario)) {
        json_fail('Cadastre sua conta ou chave Pix antes de solicitar a retirada.', 422);
    }

    if ($saldo < INDICACAO_MIN_RETIRADA || $valor < INDICACAO_MIN_RETIRADA) {
        json_fail('A retirada minima de indicacoes e R$ 25,00.', 422, [
            'saldo_disponivel' => $saldo,
            'minimo_retirada' => INDICACAO_MIN_RETIRADA,
        ]);
    }

    if ($valor > $saldo) {
        json_fail('Valor solicitado maior que o saldo disponivel.', 422, [
            'saldo_disponivel' => $saldo,
        ]);
    }

    $prazo = indicacoes_adicionar_dias_uteis(new DateTimeImmutable('today'), 3);
    $pdo->beginTransaction();
    $stmt = $pdo->prepare(
        'INSERT INTO indicacao_retiradas
         (id_usuario, valor, saldo_no_pedido, status, pix_tipo, pix_chave, banco_nome, banco_agencia, banco_conta,
          banco_tipo_conta, banco_titular_nome, banco_titular_documento, prazo_limite)
         VALUES (?, ?, ?, "pendente", ?, ?, ?, ?, ?, ?, ?, ?, ?)'
    );
    $stmt->execute([
        $idUsuario,
        $valor,
        $saldo,
        $usuario['pix_tipo'] ?: null,
        $usuario['pix_chave'] ?: null,
        $usuario['banco_nome'] ?: null,
        $usuario['banco_agencia'] ?: null,
        $usuario['banco_conta'] ?: null,
        $usuario['banco_tipo_conta'] ?: null,
        $usuario['banco_titular_nome'] ?: null,
        $usuario['banco_titular_documento'] ?: null,
        $prazo->format('Y-m-d'),
    ]);

    $idRetirada = (int) $pdo->lastInsertId();
    $pdo->commit();

    json_ok([
        'id_retirada' => $idRetirada,
        'valor' => $valor,
        'saldo_no_pedido' => $saldo,
        'prazo_limite' => $prazo->format('Y-m-d'),
        'message' => 'Pedido de retirada enviado. Prazo de ate 3 dias uteis.',
    ]);
} catch (Throwable $e) {
    if (isset($pdo) && $pdo instanceof PDO && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    json_fail('Erro ao solicitar retirada.', 500, ['error' => $e->getMessage()]);
}
