/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/composables/useRoleGuard.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
import { computed } from 'vue';
import { useTenantStore } from '@/stores/tenantStore';

/**
 * ---------------------------------------------------------
 * useRoleGuard() — RBAC puro (somente PAPEL do tenant)
 * + testMODE (modo operacional de teste)
 * ---------------------------------------------------------
 *
 * Objetivo:
 * Controlar visibilidade/ações por PAPEL dentro do tenant (clínica).
 * Aqui NÃO entra plano, módulos ou features pagas.
 *
 * Fonte da verdade do papel (tenant role):
 * - public.tenant_members.role
 *   → 'saas' | 'tenant_admin' | 'therapist' | 'patient'
 *
 * ---------------------------------------------------------
 * testMODE — INTERRUPTOR OPERACIONAL
 * ---------------------------------------------------------
 *
 * testMODE NÃO é regra de negócio.
 * Ele serve para:
 * - testar módulos antes de liberar no plano
 * - visualizar telas ainda não contratadas
 * - validar UI sem alterar regras de plano
 *
 * COMPORTAMENTO:
 *
 * - TEST_MODE_ROLES = []
 *     → testMODE OFF (ninguém vê)
 *
 * - TEST_MODE_ROLES = [ROLES.ADMIN]
 *     → Apenas tenant_admin vê elementos marcados como testMODE
 *
 * - TEST_MODE_ROLES = [ROLES.ADMIN, ROLES.THERAPIST]
 *     → Admin e Therapist veem
 *
 * - TEST_MODE_ROLES = [ROLES.SAAS, ROLES.ADMIN, ROLES.THERAPIST, ROLES.PATIENT]
 *     → testMODE ON geral
 *
 * ---------------------------------------------------------
 * COMO IMPORTAR NO COMPONENTE
 * ---------------------------------------------------------
 *
 * 1) Importação padrão:
 *
 *   import { useRoleGuard } from '@/composables/useRoleGuard'
 *
 *   const { canSee, canSeeOrTest } = useRoleGuard()
 *
 *
 * 2) Se for usar apenas testMODE:
 *
 *   import { useRoleGuard } from '@/composables/useRoleGuard'
 *
 *   const { canSee } = useRoleGuard()
 *
 *
 * ---------------------------------------------------------
 * EXEMPLOS DE USO NO TEMPLATE
 * ---------------------------------------------------------
 *
 * 1) Elemento puramente experimental:
 *
 *   <Button
 *     v-if="canSee('testMODE')"
 *     label="Botão em teste"
 *   />
 *
 *
 * 2) Liberar visualização mesmo sem plano:
 *
 *   <Button
 *     v-if="entStore.can('online_scheduling.manage') || canSee('testMODE')"
 *     label="Agendamento Online"
 *     @click="..."
 *   />
 *
 * Interpretação:
 * - Gate A → plano liberado
 * - Gate B → testMODE ativo
 *
 *
 * 3) Usando helper:
 *
 *   <Button
 *     v-if="canSeeOrTest('settings.view')"
 *     ...
 *   />
 *
 * Isso significa:
 * - Usuário pode ver normalmente pela regra RBAC
 *   OU
 * - testMODE está ativo
 *
 *
 * ---------------------------------------------------------
 * IMPORTANTE:
 * testMODE controla apenas UI.
 * Segurança real deve existir no backend (RLS).
 * ---------------------------------------------------------
 */

export function useRoleGuard() {
    const tenantStore = useTenantStore();

    const ROLES = Object.freeze({
        SAAS: 'saas',
        ADMIN: 'clinic_admin',
        SUPERVISOR: 'supervisor',
        THERAPIST: 'therapist',
        PATIENT: 'patient'
    });

    const role = computed(() => tenantStore.membership?.role ?? tenantStore.activeRole ?? null);
    const isReady = computed(() => !!role.value);

    const isSaas = computed(() => role.value === ROLES.SAAS);
    const isTenantAdmin = computed(() => role.value === ROLES.ADMIN);
    const isSupervisor = computed(() => role.value === ROLES.SUPERVISOR);
    const isTherapist = computed(() => role.value === ROLES.THERAPIST);
    const isPatient = computed(() => role.value === ROLES.PATIENT);
    const isStaff = computed(() => [ROLES.ADMIN, ROLES.SUPERVISOR, ROLES.THERAPIST].includes(role.value));

    const TEST_MODE_ROLES = Object.freeze([ROLES.ADMIN, ROLES.SUPERVISOR, ROLES.THERAPIST, ROLES.SAAS, ROLES.PATIENT]);

    const rbac = Object.freeze({
        testMODE: TEST_MODE_ROLES,

        'settings.view': [ROLES.ADMIN, ROLES.SUPERVISOR, ROLES.THERAPIST],
        'profile.view': [ROLES.ADMIN, ROLES.SUPERVISOR, ROLES.THERAPIST, ROLES.PATIENT],
        'security.view': [ROLES.ADMIN, ROLES.SUPERVISOR, ROLES.THERAPIST, ROLES.PATIENT]
    });

    function canSee(key) {
        const r = role.value;
        if (!r) return false;

        const allowed = rbac[key];
        if (!allowed) return false;

        return allowed.includes(r);
    }

    function canSeeOrTest(key) {
        return canSee(key) || canSee('testMODE');
    }

    return {
        role,
        isReady,

        ROLES,
        isSaas,
        isTenantAdmin,
        isSupervisor,
        isTherapist,
        isPatient,
        isStaff,

        canSee,
        canSeeOrTest
    };
}
