/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/router/accessRedirects.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/

/**
 * Redirecionamentos padronizados para:
 * - RBAC (papel): usuário NÃO deveria acessar essa área nem pagando → manda pra 403 (ou home do papel)
 * - Entitlements (plano): usuário poderia acessar se tivesse feature → manda pro /upgrade
 *
 * Por que isso existe?
 * - Evitar o bug clássico: "pessoa sem permissão caiu no /upgrade"
 * - Padronizar o comportamento do app em um único lugar
 * - Deixar claro: RBAC ≠ Plano
 *
 * Convenção recomendada:
 * - RBAC (role): sempre é bloqueio (403) OU home do papel (UX mais "suave")
 * - Plano (feature): sempre é upgrade (porque o usuário *poderia* ter acesso pagando)
 */

/**
 * Home por role (tenant_members.role).
 * Obs: 'admin' é role GLOBAL (profiles.role). Aqui é guard de tenant,
 * mas mantemos um fallback seguro para legado.
 */
export function roleHomePath(role) {
    // ✅ clínica: aceita nomes canônicos e legado
    if (role === 'clinic_admin' || role === 'tenant_admin') return '/admin';
    if (role === 'therapist') return '/therapist';
    if (role === 'patient') return '/portal';

    // ✅ fallback (não deveria acontecer em tenant)
    if (role === 'admin') return '/admin';

    return '/';
}

/**
 * RBAC (papel) → padrão: acesso negado (403).
 *
 * Se você preferir UX "suave", pode mandar para a home do papel.
 * Eu deixei as duas opções:
 * - use403 = true  → sempre /pages/access (recomendado para clareza)
 * - use403 = false → home do papel (útil quando você quer "auto-corrigir" navegação)
 */
export function denyByRole({ to, currentRole, use403 = true } = {}) {
    // ✅ padrão forte: 403 (não é caso de upgrade)
    if (use403) return { path: '/pages/access' };

    // modo "suave": manda pra home do papel
    const fallback = roleHomePath(currentRole);

    // evita loop: se já está no fallback, manda pra página de acesso negado
    if (to?.path && to.path === fallback) {
        return { path: '/pages/access' };
    }

    return { path: fallback };
}

/**
 * Entitlements (plano) → upgrade.
 * missingFeature: feature key (ex: 'online_scheduling.manage')
 * redirectTo: para onde voltar após upgrade
 */
export function denyByPlan({ to, missingFeature, redirectTo } = {}) {
    return {
        path: '/upgrade',
        query: {
            feature: missingFeature || '',
            redirectTo: redirectTo || to?.fullPath || '/'
        }
    };
}
