// ============================================================
// Festa Mágica IA — Woovi (Pix) Service
// ============================================================
// Fluxo Pix transparente:
//   Front → n8n (cria cobrança Woovi) → QR/copia-e-cola na tela
//   Front faz polling do status via n8n até COMPLETED
//   Webhook Woovi → n8n credita / cria usuário / magic link / e-mail
//
// IMPORTANTE: o App ID da Woovi NUNCA passa pelo browser.
// Tanto a criação da cobrança quanto a consulta de status são
// feitas server-side pelo n8n. O front só fala com o n8n.
// ============================================================

const N8N_BASE = 'https://n8n.seureview.com.br/webhook';

const PIX_CREATE_URL = `${N8N_BASE}/festa-magica-pix`;
const PIX_STATUS_URL = `${N8N_BASE}/festa-magica-pix-status`;

export interface CreatePixParams {
    userEmail: string;
    source?: string;        // 'landing' | 'funil' | 'default'
    userId?: string;
    value?: number;         // em centavos BRL
    credits?: number;
    planName?: string;
    priceId?: string;
    fbp?: string;
    fbc?: string;
}

export interface PixCharge {
    correlationID: string;
    brCode: string;          // código copia-e-cola
    qrCodeImage: string;     // URL da imagem do QR (PNG)
    value: number;           // em centavos
    expiresDate?: string;
}

export type PixStatus = 'ACTIVE' | 'COMPLETED' | 'EXPIRED';

/**
 * Cria uma cobrança Pix na Woovi (via n8n) e retorna os dados
 * para exibir o QR Code e o copia-e-cola na própria tela.
 */
export async function createPixCharge(params: CreatePixParams): Promise<PixCharge> {
    const response = await fetch(PIX_CREATE_URL, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            source: params.source || 'landing',
            userEmail: params.userEmail,
            userId: params.userId || '',
            value: params.value,
            credits: params.credits,
            planName: params.planName,
            priceId: params.priceId,
            fbp: params.fbp || '',
            fbc: params.fbc || '',
        }),
    });

    if (!response.ok) {
        throw new Error(`Erro ao gerar Pix: ${response.status}`);
    }

    const data = await response.json();

    if (!data.success || !data.brCode) {
        throw new Error(data.error || 'Não foi possível gerar o Pix.');
    }

    return {
        correlationID: data.correlationID,
        brCode: data.brCode,
        qrCodeImage: data.qrCodeImage,
        value: data.value,
        expiresDate: data.expiresDate,
    };
}

/**
 * Consulta o status de uma cobrança Pix (via n8n).
 * Usado no polling enquanto o usuário paga.
 */
export async function pollPixStatus(correlationID: string): Promise<PixStatus> {
    const response = await fetch(PIX_STATUS_URL, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ correlationID }),
    });

    if (!response.ok) {
        throw new Error(`Erro ao consultar status do Pix: ${response.status}`);
    }

    const data = await response.json();
    return (data.status as PixStatus) || 'ACTIVE';
}
