<?php
declare(strict_types=1);

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

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

if ($idMotorista <= 0) {
    json_fail('Motorista nao informado.');
}

try {
    $pdo = db();
    $usuario = indicacoes_usuario_base($idMotorista);
    if (!$usuario || $usuario['tipo'] !== 'motorista') {
        json_fail('Motorista nao encontrado.', 404);
    }

    $resumo = carteira_resumo_motorista($idMotorista, $pdo);
    $saldo = (float) $resumo['saldo_disponivel'];
    $valor = $valorSolicitado === null || $valorSolicitado <= 0 ? $saldo : carteira_money($valorSolicitado);

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

    if ($saldo < CARTEIRA_MIN_RESGATE || $valor < CARTEIRA_MIN_RESGATE) {
        json_fail('O resgate minimo da carteira e R$ 25,00.', 422, [
            'saldo_disponivel' => $saldo,
            'minimo_resgate' => CARTEIRA_MIN_RESGATE,
        ]);
    }

    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 carteira_retiradas
         (id_motorista, 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([
        $idMotorista,
        $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'),
    ]);

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

    json_ok([
        'id_resgate' => $idResgate,
        'valor' => $valor,
        'saldo_no_pedido' => $saldo,
        'prazo_limite' => $prazo->format('Y-m-d'),
        'message' => 'Pedido de resgate 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 resgate.', 500, ['error' => $e->getMessage()]);
}
