/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/router/index.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
import { createRouter, createWebHistory } from 'vue-router';
import AppLayout from '@/layout/AppLayout.vue';

// ── Rotas de app (filhas do AppLayout compartilhado) ──────────────────────
import therapistRoutes, { therapistStandalone } from './routes.therapist';
import adminRoutes, { clinicStandalone } from './routes.clinic';
import accountRoutes from './routes.account';
import billingRoutes from './routes.billing';
import supervisorRoutes from './routes.supervisor';
import featuresRoutes from './routes.features';
import configuracoesRoutes from './routes.configs';

// ── Rotas com AppLayout próprio (usuários distintos, sem navegação cruzada) ──
import saasRoutes from './routes.saas';
import editorRoutes from './routes.editor';
import portalRoutes from './routes.portal';

// ── Rotas sem AppLayout ───────────────────────────────────────────────────
import authRoutes from './routes.auth';
import publicRoutes from './routes.public';
import miscRoutes from './routes.misc';

import { pinia } from '@/plugins/pinia';
import { supportGuard } from '@/support/supportGuard';
import { logError } from '@/support/supportLogger';
import { applyGuards } from './guards';

const routes = [
    // ── Sem layout (public + auth) ─────────────────────────────────────────
    ...(Array.isArray(publicRoutes) ? publicRoutes : [publicRoutes]),
    ...(Array.isArray(authRoutes) ? authRoutes : [authRoutes]),

    // ── Fullscreen — fora do AppLayout (setup wizards etc.) ────────────────
    ...therapistStandalone,
    ...clinicStandalone,

    // ══════════════════════════════════════════════════════════════════════
    // AppLayout ÚNICO compartilhado por todas as áreas autenticadas.
    //
    // Benefício: sidebar, topbar e estado do layout NUNCA são desmontados
    // ao navegar entre /therapist, /admin, /configuracoes, /account etc.
    // Cada área usa um RouterPassthrough (path relativo sem componente visual)
    // que mantém o AppLayout intacto enquanto só o conteúdo é trocado.
    // ══════════════════════════════════════════════════════════════════════
    {
        path: '/',
        component: AppLayout,
        children: [
            therapistRoutes,     // path: 'therapist'
            adminRoutes,         // path: 'admin'
            accountRoutes,       // path: 'account'
            billingRoutes,       // path: 'upgrade'
            supervisorRoutes,    // path: 'supervisor'
            featuresRoutes,      // path: 'features'
            configuracoesRoutes  // path: 'configuracoes'
        ]
    },

    // ── AppLayout próprio: áreas de usuários distintos ────────────────────
    // Saas, editor e portal são sessões de usuário completamente diferentes.
    // Nunca há navegação cruzada entre essas áreas e as áreas de app acima.
    ...(Array.isArray(saasRoutes) ? saasRoutes : [saasRoutes]),
    ...(Array.isArray(editorRoutes) ? editorRoutes : [editorRoutes]),
    ...(Array.isArray(portalRoutes) ? portalRoutes : [portalRoutes]),

    // ── Misc (catch-all SEMPRE por último) ────────────────────────────────
    ...(Array.isArray(miscRoutes) ? miscRoutes : [miscRoutes]),

    // ── Compat: rota legada /login → /auth/login ──────────────────────────
    {
        path: '/login',
        redirect: (to) => ({ path: '/auth/login', query: to.query || {} })
    }
];

const router = createRouter({
    history: createWebHistory(),
    routes,
    scrollBehavior(to, from, savedPosition) {
        if (savedPosition) return savedPosition;
        return false;
    }
});

router.onError((e) => logError('router.onError', 'router error', e));

// ✅ support guard — passa pinia para garantir acesso ao store antes do app.use(pinia)
router.beforeEach(async (to) => {
    await supportGuard(to, pinia);
});

// ── Layout Melissa: home do role -> /melissa ─────────────────────────
// Quando o user gravou layout_variant='melissa' em user_settings, qualquer
// entrada na home do role (therapist.dashboard ou admin.dashboard) cai
// direto no layout Melissa. Tomada de decisão via localStorage (espelho
// gravado pelo bootstrapUserSettings + setVariant) — evita esperar a
// store carregar do DB e prevenir flash do shell clássico antes do
// redirect. Bypassa em mobile (<1280px), onde Melissa não foi feito pra
// rodar e o effectiveVariant do layout.js já força 'classic'.
const HOME_ROUTE_NAMES = new Set(['therapist.dashboard', 'admin.dashboard']);
router.beforeEach((to) => {
    if (!HOME_ROUTE_NAMES.has(to.name)) return;

    let variant = null;
    try {
        variant = localStorage.getItem('layout_variant');
    } catch {
        // localStorage indisponível (modo privado / SSR) — segue o caminho normal
        return;
    }
    if (variant !== 'melissa') return;

    const isMobile = typeof window !== 'undefined'
        && typeof window.matchMedia === 'function'
        && window.matchMedia('(max-width: 1279px)').matches;
    if (isMobile) return;

    return { name: 'Melissa' };
});

applyGuards(router);

export default router;
