/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Arquivo: src/utils/planLimit.js
|
| Traduz o erro de enforcement de limite de plano vindo do banco
| (RAISE 'PLAN_LIMIT_REACHED|<recurso>|<limite>') num toast amigável com
| CTA de upgrade, reusando o grupo de toast 'system-alerts' do AppLayout
| (que já renderiza um botão de ação a partir de data.deeplink).
|--------------------------------------------------------------------------
*/
import { buildUpgradeUrl } from '@/utils/upgradeContext';

const RESOURCE_LABELS = {
    patients: 'pacientes'
};

/**
 * Extrai {resource, limit} de um erro de limite de plano. Retorna null se o
 * erro não for um PLAN_LIMIT_REACHED (deixa o caller tratar genericamente).
 */
export function parsePlanLimitError(err) {
    const msg = err?.message || err?.error_description || err?.details || '';
    const m = /PLAN_LIMIT_REACHED\|([a-z_]+)\|(\d+)/i.exec(String(msg));
    if (!m) return null;
    return { resource: m[1], limit: Number(m[2]) };
}

/**
 * Se `err` for um erro de limite de plano, mostra o toast amigável com CTA e
 * retorna true (o caller deve então parar — não mostrar o erro genérico).
 * Caso contrário retorna false.
 *
 * @param {object} toast      instância do PrimeVue useToast()
 * @param {Error}  err        erro capturado
 * @param {string|null} redirectTo  rota pra voltar após o upgrade (ex: route.fullPath)
 */
export function maybeShowPlanLimitToast(toast, err, redirectTo = null) {
    const parsed = parsePlanLimitError(err);
    if (!parsed) return false;

    const label = RESOURCE_LABELS[parsed.resource] || parsed.resource;

    toast?.add?.({
        group: 'system-alerts',
        severity: 'warn',
        summary: 'Limite do plano gratuito',
        detail: `Você atingiu o limite de ${parsed.limit} ${label} do plano gratuito. Faça upgrade para adicionar mais.`,
        life: 8000,
        data: {
            deeplink: buildUpgradeUrl({ redirectTo }),
            actionLabel: 'Fazer upgrade'
        }
    });
    return true;
}
