<?php
declare(strict_types=1);

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

$payloadRaw = file_get_contents('php://input') ?: '';
$payload = json_decode($payloadRaw, true);
if (!is_array($payload)) {
    $payload = $_POST ?: $_GET ?: [];
}

$eventId = trim((string) ($payload['id'] ?? $payload['event_id'] ?? $_GET['id'] ?? ''));
$eventType = trim((string) ($payload['type'] ?? $payload['topic'] ?? $_GET['topic'] ?? ''));
$action = trim((string) ($payload['action'] ?? ''));
$resourceId = trim((string) (
    $payload['data']['id']
    ?? $payload['resource']
    ?? $payload['resource_id']
    ?? $_GET['data_id']
    ?? ''
));

try {
    $pdo = db();
    if (!mp_table_exists($pdo, 'pagamento_eventos_webhook')) {
        json_fail('Tabela pagamento_eventos_webhook nao existe. Rode a atualizacao do banco.', 500);
    }

    $stmt = $pdo->prepare(
        'INSERT INTO pagamento_eventos_webhook
          (event_id, event_type, resource_id, acao, payload, processado)
         VALUES (?, ?, ?, ?, ?, 0)
         ON DUPLICATE KEY UPDATE
           event_type = VALUES(event_type),
           resource_id = VALUES(resource_id),
           acao = VALUES(acao),
           payload = VALUES(payload)'
    );
    $stmt->execute([
        $eventId !== '' ? $eventId : null,
        $eventType !== '' ? $eventType : null,
        $resourceId !== '' ? $resourceId : null,
        $action !== '' ? $action : null,
        json_encode($payload, JSON_UNESCAPED_UNICODE),
    ]);

    if ($resourceId !== '' && mp_table_exists($pdo, 'pagamentos_corridas')) {
        $pagamentoMp = $payload;
        try {
            $pagamentoMp = mp_http_json_request(
                'GET',
                'https://api.mercadopago.com/v1/payments/' . rawurlencode($resourceId),
                ['Authorization: Bearer ' . mp_access_token_plataforma($pdo)]
            );
        } catch (Throwable $ignored) {
            $pagamentoMp = $payload;
        }

        $status = mp_status_pagamento_local((string) ($pagamentoMp['status'] ?? $payload['status'] ?? $payload['data']['status'] ?? 'pending'));
        $externalReference = (string) ($pagamentoMp['external_reference'] ?? $payload['external_reference'] ?? '');
        $rowStmt = $pdo->prepare(
            'SELECT pc.*, COALESCE(c.saldo_negativo_cobrado, 0) AS saldo_negativo_cobrado
             FROM pagamentos_corridas pc
             LEFT JOIN corridas c ON c.id = pc.id_corrida
             WHERE pc.mp_payment_id = ?
                OR pc.external_reference = ?
             LIMIT 1'
        );
        $rowStmt->execute([$resourceId, $externalReference]);
        $rowPagamento = $rowStmt->fetch() ?: [];
        $valores = mp_corrida_valores(
            (float) ($rowPagamento['valor_total'] ?? $pagamentoMp['transaction_amount'] ?? 0),
            (float) ($rowPagamento['saldo_negativo_cobrado'] ?? 0),
            mp_taxa_gateway_de_pagamento($pagamentoMp)
        );

        $up = $pdo->prepare(
            'UPDATE pagamentos_corridas
             SET mp_payment_id = COALESCE(mp_payment_id, ?),
                 status = ?,
                 valor_motorista = ?,
                 valor_plataforma = ?,
                 taxa_gateway = ?,
                 application_fee = ?,
                 raw_response = ?,
                 atualizado_em = CURRENT_TIMESTAMP
             WHERE mp_payment_id = ?
                OR external_reference = ?'
        );
        $up->execute([
            $resourceId,
            $status,
            $valores['valor_motorista'],
            $valores['valor_plataforma'],
            $valores['taxa_gateway'],
            $valores['application_fee'],
            json_encode($pagamentoMp, JSON_UNESCAPED_UNICODE),
            $resourceId,
            $externalReference,
        ]);

        $idCorrida = (int) ($rowPagamento['id_corrida'] ?? 0);
        if ($idCorrida > 0) {
            $sets = ['status_pagamento = ?', 'mp_payment_id = COALESCE(mp_payment_id, ?)'];
            $params = [$status, $resourceId];
            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;
            $corridaUp = $pdo->prepare('UPDATE corridas SET ' . implode(', ', $sets) . ' WHERE id = ?');
            $corridaUp->execute($params);

            if ($status === 'aprovado') {
                $statusStmt = $pdo->prepare('SELECT status FROM corridas WHERE id = ? LIMIT 1');
                $statusStmt->execute([$idCorrida]);
                if ((string) $statusStmt->fetchColumn() === 'pendente') {
                    corrida_ofertas_despachar($pdo, $idCorrida);
                }
            }
        }
    }

    json_ok(['received' => true]);
} catch (Throwable $e) {
    json_fail('Erro ao registrar webhook de pagamento.', 500, ['error' => $e->getMessage()]);
}
