<?php
declare(strict_types=1);

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

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$data = $method === 'POST' ? input_json() : $_GET;
$idUsuario = (int) ($data['id_usuario'] ?? $data['id_passageiro'] ?? 0);

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

function conta_passageiro_payload(array $usuario): array
{
    return [
        'id' => (int) $usuario['id'],
        'nome' => $usuario['nome'],
        'primeiro_nome' => $usuario['primeiro_nome'] ?? null,
        'sobrenome' => $usuario['sobrenome'] ?? null,
        'cpf' => $usuario['cpf'] ?? null,
        'email' => $usuario['email'] ?? null,
        'celular' => $usuario['celular'] ?? null,
        'cep' => $usuario['cep'] ?? null,
        'endereco_logradouro' => $usuario['endereco_logradouro'] ?? null,
        'endereco_numero' => $usuario['endereco_numero'] ?? null,
        'endereco_complemento' => $usuario['endereco_complemento'] ?? null,
        'endereco_bairro' => $usuario['endereco_bairro'] ?? null,
        'endereco_cidade' => $usuario['endereco_cidade'] ?? null,
        'endereco_uf' => $usuario['endereco_uf'] ?? null,
        'banco_nome' => $usuario['banco_nome'] ?? null,
        'banco_agencia' => $usuario['banco_agencia'] ?? null,
        'banco_conta' => $usuario['banco_conta'] ?? null,
        'banco_tipo_conta' => $usuario['banco_tipo_conta'] ?? null,
        'banco_titular_nome' => $usuario['banco_titular_nome'] ?? null,
        'banco_titular_documento' => $usuario['banco_titular_documento'] ?? null,
        'pix_tipo' => $usuario['pix_tipo'] ?? null,
        'pix_chave' => $usuario['pix_chave'] ?? null,
        'conta_completa' => indicacoes_conta_completa($usuario),
    ];
}

try {
    $pdo = db();
    $stmt = $pdo->prepare(
        'SELECT id, nome, primeiro_nome, sobrenome, cpf, email, celular, tipo,
                cep, endereco_logradouro, endereco_numero, endereco_complemento,
                endereco_bairro, endereco_cidade, endereco_uf,
                banco_nome, banco_agencia, banco_conta, banco_tipo_conta,
                banco_titular_nome, banco_titular_documento, pix_tipo, pix_chave
         FROM usuarios
         WHERE id = ?
         LIMIT 1'
    );
    $stmt->execute([$idUsuario]);
    $usuario = $stmt->fetch();
    if (!$usuario) {
        json_fail('Usuario nao encontrado.', 404);
    }

    if ($method !== 'POST') {
        json_ok(['conta' => conta_passageiro_payload($usuario)]);
    }

    $cep = preg_replace('/\D+/', '', (string) ($data['cep'] ?? $usuario['cep'] ?? ''));
    $uf = strtoupper(trim((string) ($data['endereco_uf'] ?? $usuario['endereco_uf'] ?? '')));
    $bancoTipo = trim((string) ($data['banco_tipo_conta'] ?? ''));
    $pixTipo = trim((string) ($data['pix_tipo'] ?? ''));

    if ($cep !== '' && !preg_match('/^\d{8}$/', $cep)) {
        json_fail('CEP invalido.');
    }
    if ($uf !== '' && !preg_match('/^[A-Z]{2}$/', $uf)) {
        json_fail('UF invalida.');
    }
    if ($bancoTipo !== '' && !in_array($bancoTipo, ['corrente', 'poupanca', 'pagamento'], true)) {
        json_fail('Tipo de conta invalido.');
    }
    if ($pixTipo !== '' && !in_array($pixTipo, ['cpf', 'cnpj', 'email', 'celular', 'aleatoria'], true)) {
        json_fail('Tipo de Pix invalido.');
    }

    $up = $pdo->prepare(
        'UPDATE usuarios
         SET cep = ?, endereco_logradouro = ?, endereco_numero = ?, endereco_complemento = ?,
             endereco_bairro = ?, endereco_cidade = ?, endereco_uf = ?,
             banco_nome = ?, banco_agencia = ?, banco_conta = ?, banco_tipo_conta = ?,
             banco_titular_nome = ?, banco_titular_documento = ?, pix_tipo = ?, pix_chave = ?
         WHERE id = ?'
    );
    $up->execute([
        $cep === '' ? null : $cep,
        trim((string) ($data['endereco_logradouro'] ?? '')) ?: null,
        trim((string) ($data['endereco_numero'] ?? '')) ?: null,
        trim((string) ($data['endereco_complemento'] ?? '')) ?: null,
        trim((string) ($data['endereco_bairro'] ?? '')) ?: null,
        trim((string) ($data['endereco_cidade'] ?? '')) ?: null,
        $uf === '' ? null : $uf,
        trim((string) ($data['banco_nome'] ?? '')) ?: null,
        trim((string) ($data['banco_agencia'] ?? '')) ?: null,
        trim((string) ($data['banco_conta'] ?? '')) ?: null,
        $bancoTipo === '' ? null : $bancoTipo,
        trim((string) ($data['banco_titular_nome'] ?? '')) ?: null,
        preg_replace('/\D+/', '', (string) ($data['banco_titular_documento'] ?? '')) ?: null,
        $pixTipo === '' ? null : $pixTipo,
        trim((string) ($data['pix_chave'] ?? '')) ?: null,
        $idUsuario,
    ]);

    $stmt->execute([$idUsuario]);
    $usuarioAtualizado = $stmt->fetch();
    json_ok([
        'conta' => conta_passageiro_payload($usuarioAtualizado),
        'message' => 'Conta atualizada com sucesso.',
    ]);
} catch (Throwable $e) {
    json_fail('Erro ao carregar ou atualizar conta.', 500, ['error' => $e->getMessage()]);
}
