import { NextResponse } from 'next/server';

export const runtime = 'edge';

interface MercadoPagoBrickPayload {
  transaction_amount: number;
  payment_method_id?: string;
  token?: string;
  payer?: {
    email?: string;
    first_name?: string;
    last_name?: string;
    identification?: {
      type?: string;
      number?: string;
    };
  };
  issuer_id?: string;
  pedidoId?: string;
  faturaId?: string;
  description?: string;
  metadata?: Record<string, any>;
}

export async function POST(request: Request) {
  try {
    const body = (await request.json()) as MercadoPagoBrickPayload;

    if (!body || !body.transaction_amount) {
      return NextResponse.json(
        { error: 'Valor da transação é obrigatório' },
        { status: 400 }
      );
    }

    const accessToken = process.env.MERCADO_PAGO_ACCESS_TOKEN;

    if (!accessToken) {
      console.error('❌ [API] MERCADO_PAGO_ACCESS_TOKEN não configurado');
      return NextResponse.json(
        { error: 'Configuração do Mercado Pago ausente' },
        { status: 500 }
      );
    }

    // 🔍 CRÍTICO: Verificar ambiente do Access Token
    const isTestAccessToken = accessToken.startsWith('TEST-');
    const isProdAccessToken = accessToken.startsWith('APP_USR-');
    console.log('🔑 [API] Access Token Ambiente:', isTestAccessToken ? 'TEST (SANDBOX)' : isProdAccessToken ? 'PRODUÇÃO' : 'DESCONHECIDO');
    console.log('🔑 [API] Access Token prefix:', accessToken.substring(0, 15) + '...');

    // ⚠️ IMPORTANTE: O token do cartão foi gerado com a chave pública do frontend
    // Se a chave pública é de TEST mas o Access Token é de PRODUÇÃO (ou vice-versa),
    // o Mercado Pago vai rejeitar com erro "Card Token not found"
    if (body.token) {
      console.log('🔑 [API] Card Token recebido:', body.token.substring(0, 20) + '...');
    }

    const paymentMethodId = body.payment_method_id || 'credit_card';

    console.log('📋 [API] Payload recebido:', {
      payment_method_id: paymentMethodId,
      has_token: !!body.token,
      transaction_amount: body.transaction_amount,
      pedido_id: body.pedidoId
    });

    if (paymentMethodId !== 'pix' && !body.token) {
      console.error('❌ [API] Token ausente para cartão. Body completo:', body);
      return NextResponse.json(
        {
          error: 'Token do cartão não foi gerado pelo Payment Brick',
          details: {
            message: 'O token do cartão é obrigatório para pagamentos com cartão. Verifique se os dados do cartão foram preenchidos corretamente.',
            payment_method_id: paymentMethodId,
            received_fields: Object.keys(body)
          }
        },
        { status: 400 }
      );
    }

    const paymentPayload: Record<string, any> = {
      transaction_amount: Number(body.transaction_amount),
      payment_method_id: paymentMethodId,
      installments: 1,
      description: body.description || `Pedido ${body.pedidoId ?? ''}`.trim(),
      external_reference: body.pedidoId,
      metadata: {
        origem: 'checkout-front',
        pedidoId: body.pedidoId,
        faturaId: body.faturaId,
        ...(body.metadata || {})
      },
      payer: {
        email: body.payer?.email,
        first_name: body.payer?.first_name,
        last_name: body.payer?.last_name,
        identification: body.payer?.identification
      }
    };

    if (paymentMethodId === 'pix') {
      paymentPayload.transaction_amount = Number(paymentPayload.transaction_amount.toFixed(2));
    } else {
      paymentPayload.token = body.token;
      if (body.issuer_id) {
        paymentPayload.issuer_id = body.issuer_id;
      }
    }

    const mpResponse = await fetch('https://api.mercadopago.com/v1/payments', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${accessToken}`,
        'Content-Type': 'application/json',
        'X-Idempotency-Key': crypto.randomUUID()
      },
      body: JSON.stringify(paymentPayload)
    });

    const result = await mpResponse.json();

    if (!mpResponse.ok) {
      console.error('Erro do Mercado Pago Bricks:', result);
      return NextResponse.json(
        { error: result.message || 'Erro ao criar pagamento', details: result },
        { status: mpResponse.status }
      );
    }

    return NextResponse.json({
      success: true,
      payment: result,
      status: result.status,
      status_detail: result.status_detail
    });
  } catch (error) {
    console.error('Erro ao processar pagamento via Bricks:', error);
    return NextResponse.json(
      { error: 'Erro interno ao processar pagamento' },
      { status: 500 }
    );
  }
}


