<?php
declare(strict_types=1);

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

$data = input_json() + $_GET;
require_fields($data, ['id_corrida', 'id_motorista']);

$idCorrida = (int) $data['id_corrida'];
$idMotorista = (int) $data['id_motorista'];

if ($idCorrida <= 0 || $idMotorista <= 0) {
    json_fail('Dados invalidos para consultar Pix da corrida.');
}

try {
    $pdo = db();
    $stmt = $pdo->prepare(
        'SELECT pc.*, c.id_motorista AS corrida_motorista, c.status AS corrida_status,
                COALESCE(c.valor, pc.valor_total, 0) AS corrida_valor,
                COALESCE(c.saldo_negativo_cobrado, 0) AS saldo_negativo_cobrado
         FROM pagamentos_corridas pc
         INNER JOIN corridas c ON c.id = pc.id_corrida
         WHERE pc.id_corrida = ?
           AND pc.metodo = "pix_online"
         ORDER BY pc.id DESC
         LIMIT 1'
    );
    $stmt->execute([$idCorrida]);
    $row = $stmt->fetch();
    if (!$row) {
        json_fail('Pagamento Pix da corrida nao encontrado.', 404);
    }
    if ((int) ($row['corrida_motorista'] ?? 0) !== $idMotorista) {
        json_fail('Essa corrida nao pertence a este motorista.', 403);
    }

    $payment = json_decode((string) ($row['raw_response'] ?? ''), true);
    if (!is_array($payment)) {
        $payment = [];
    }

    $mpPaymentId = trim((string) ($row['mp_payment_id'] ?? ''));
    if ($mpPaymentId !== '' && !in_array((string) $row['status'], ['aprovado', 'cancelado', 'recusado', 'estornado'], true)) {
        $payment = mp_http_json_request(
            'GET',
            'https://api.mercadopago.com/v1/payments/' . rawurlencode($mpPaymentId),
            ['Authorization: Bearer ' . mp_access_token_plataforma($pdo)]
        );
        $status = mp_status_pagamento_local((string) ($payment['status'] ?? 'pending'));
        $valores = mp_corrida_valores(
            (float) ($row['valor_total'] ?: $row['corrida_valor'] ?? 0),
            (float) ($row['saldo_negativo_cobrado'] ?? 0),
            mp_taxa_gateway_de_pagamento($payment)
        );

        $up = $pdo->prepare(
            'UPDATE pagamentos_corridas
             SET status = ?,
                 valor_motorista = ?,
                 valor_plataforma = ?,
                 taxa_gateway = ?,
                 application_fee = ?,
                 raw_response = ?,
                 atualizado_em = CURRENT_TIMESTAMP
             WHERE id = ?'
        );
        $up->execute([
            $status,
            $valores['valor_motorista'],
            $valores['valor_plataforma'],
            $valores['taxa_gateway'],
            $valores['application_fee'],
            json_encode($payment, JSON_UNESCAPED_UNICODE),
            (int) $row['id'],
        ]);
        $row['status'] = $status;
        $row['valor_motorista'] = $valores['valor_motorista'];
        $row['valor_plataforma'] = $valores['valor_plataforma'];
        $row['taxa_gateway'] = $valores['taxa_gateway'];
        $row['application_fee'] = $valores['application_fee'];
        $row['raw_response'] = json_encode($payment, JSON_UNESCAPED_UNICODE);

        $sets = ['status_pagamento = ?', 'mp_payment_id = COALESCE(mp_payment_id, ?)'];
        $params = [$status, $mpPaymentId];
        if (mp_column_exists($pdo, 'corridas', 'valor_motorista_liquido')) {
            $sets[] = 'valor_motorista_liquido = ?';
            $params[] = $valores['valor_motorista'];
        }
        if (mp_column_exists($pdo, 'corridas', 'valor_plataforma_bruto')) {
            $sets[] = 'valor_plataforma_bruto = ?';
            $params[] = $valores['valor_plataforma_bruto'];
        }
        if (mp_column_exists($pdo, 'corridas', 'taxa_gateway')) {
            $sets[] = 'taxa_gateway = ?';
            $params[] = $valores['taxa_gateway'];
        }
        $params[] = $idCorrida;
        $corridaStatus = $pdo->prepare('UPDATE corridas SET ' . implode(', ', $sets) . ' WHERE id = ?');
        $corridaStatus->execute($params);
    }

    json_ok([
        'pagamento' => mp_pix_payload_publico($payment, $row),
        'corrida_status' => (string) ($row['corrida_status'] ?? ''),
    ]);
} catch (Throwable $e) {
    json_fail(
        mp_gateway_exception_message($e, 'Erro ao consultar Pix da corrida.'),
        $e instanceof MercadoPagoApiException ? 422 : 500,
        mp_gateway_exception_payload($e)
    );
}
