<?php

namespace App\Http\Controllers;

use App\Http\Controllers\PaymentController;
use App\Http\Controllers\Controller;
use App\Models\Payment;
use App\Services\MercadoPagoService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class MercadoPagoWebhookController extends Controller
{
    public function __construct(private MercadoPagoService $mp) {}

    /**
     * POST /api/webhooks/mercadopago
     * Recebe notificações do MP e atualiza o pagamento local.
     */
    public function handle(Request $request, PaymentController $payments): JsonResponse
    {
        $body = $request->all();

        Log::info('[WEBHOOK MP] recebido', $body);

        if (($body['type'] ?? null) !== 'payment') {
            return response()->json(['received' => true]);
        }

        $mpPaymentId = $body['data']['id'] ?? null;
        if (! $mpPaymentId) {
            return response()->json(['received' => true]);
        }

        try {
            // Busca o pagamento real (notificação sozinha não é confiável)
            $remote = $this->mp->getPayment($mpPaymentId);

            $payment = Payment::where('mp_payment_id', $mpPaymentId)
                ->orWhere('external_reference', $remote['external_reference'])
                ->first();

            if (! $payment) {
                Log::warning('[WEBHOOK MP] pagamento desconhecido', ['mp_id' => $mpPaymentId]);
                return response()->json(['received' => true]);
            }

            $payment->update([
                'mp_payment_id' => $mpPaymentId,
                'status'        => $remote['status'],
                'status_detail' => $remote['status_detail'],
                'approved_at'   => $remote['status'] === 'approved'
                    ? ($payment->approved_at ?? now())
                    : null,
            ]);

            // Credita saldo se aprovado
            if ($remote['status'] === 'approved') {
                $payments->creditUserBalance($payment->refresh());
            }
        } catch (\Throwable $e) {
            Log::error('[WEBHOOK MP] erro', ['error' => $e->getMessage()]);
        }

        // Sempre 200 — senão o MP fica reenviando
        return response()->json(['received' => true]);
    }
}