/* Root do app — montagem do React + roteamento.

   Decide qual pagina renderizar baseado em:
   - se usuario esta logado (access_token valido em memoria);
   - rota atual (hash).

   Hidratacao inicial:
   - Tenta /auth/refresh ao carregar (se ha refresh cookie valido, ganha access).
   - Se conseguir: ja vai pra rota pedida (ou /dashboard).
   - Senao: vai pra /login.
*/

const { useState, useEffect } = React;


function App() {
    const [route, setRoute] = useState(window.C7_ROUTER.current());
    const [ready, setReady] = useState(false);

    // Hidratacao inicial via refresh cookie + /auth/me pra saber terms_accepted_at.
    useEffect(() => {
        (async () => {
            try {
                await window.C7_API.refresh();
                if (window.C7_API.is_logged_in()) {
                    try {
                        const me = await window.C7_API.get('/auth/me');
                        window.C7_STORE.set({ user: me });
                    } catch (e) { /* segue mesmo sem /me */ }
                }
            } catch (e) { /* sem sessao — segue */ }
            setReady(true);
        })();
    }, []);

    // Re-render quando muda rota.
    useEffect(() => {
        return window.C7_ROUTER.subscribe(setRoute);
    }, []);

    // Atualiza titulo da aba conforme rota atual.
    useEffect(() => {
        const titles = {
            '/login':            'Entrar',
            '/login/2fa':        'Verificar 2FA',
            '/register':         'Criar conta',
            '/forgot-password':  'Recuperar senha',
            '/verify-email':     'Verificar email',
            '/cancel-password-reset': 'Cancelar troca de senha',
            '/setup-2fa':        'Configurar 2FA',
            '/change-password':  'Alterar senha',
            '/aceitar-termos':   'Aceitar termos',
            '/dashboard':        'Dashboard',
            '/ordens':           'Ordens',
            '/ordens/nova':      'Nova ordem',
            '/perfil':           'Perfil',
            '/fornecedores':     'Fornecedores',
            '/termos':           'Termos de uso',
            '/privacidade':      'Politica de privacidade',
        };
        const p = route.path;
        let label = titles[p];
        if (!label && p.startsWith('/ordens/')) label = 'Ordem';
        document.title = label
            ? `${label} — EBRO`
            : 'EBRO';
    }, [route.path]);

    if (!ready) {
        return (
            <div className="boot-loader">
                <div className="boot-spinner"></div>
                <p>carregando…</p>
            </div>
        );
    }

    const logged_in = window.C7_API.is_logged_in();
    const path = route.path;
    const user = window.C7_STORE.get().user;
    const needs_terms = logged_in && user && !user.terms_accepted_at;
    const needs_2fa_setup    = logged_in && user && !user.totp_enabled;
    const needs_pw_change    = logged_in && user && user.must_change_password;

    // Rotas publicas (login/2fa + paginas legais + cadastro + reset).
    const public_paths = ['/login', '/login/2fa', '/termos', '/privacidade',
                          '/register', '/forgot-password', '/verify-email',
                          '/cancel-password-reset'];
    const is_public = public_paths.includes(path);

    if (!logged_in && !is_public) {
        window.C7_ROUTER.replace('/login');
        return null;
    }
    if (logged_in && (path === '/login' || path === '/login/2fa'
                      || path === '/register' || path === '/forgot-password')) {
        window.C7_ROUTER.replace('/dashboard');
        return null;
    }

    // Chain de onboarding forcado: setup-2fa -> change-password -> aceitar-termos -> dashboard.
    // Cada guarda redireciona pra propria pagina e libera as outras dentro do chain.
    const ONBOARDING_PATHS = ['/setup-2fa', '/change-password', '/aceitar-termos',
                               '/termos', '/privacidade'];
    const in_onboarding = ONBOARDING_PATHS.includes(path);

    // 1. Sem 2FA: forca configurar 2FA primeiro (pre-requisito pra change-password)
    if (needs_2fa_setup && path !== '/setup-2fa'
        && path !== '/termos' && path !== '/privacidade'
        && path !== '/verify-email') {
        window.C7_ROUTER.replace('/setup-2fa');
        return null;
    }
    // 2. Com 2FA mas com senha temp: forca trocar
    if (!needs_2fa_setup && needs_pw_change && path !== '/change-password'
        && path !== '/termos' && path !== '/privacidade'
        && path !== '/verify-email') {
        window.C7_ROUTER.replace('/change-password');
        return null;
    }
    // 3. 2FA + senha ok, mas sem aceitar termos
    if (!needs_2fa_setup && !needs_pw_change && needs_terms
        && path !== '/aceitar-termos'
        && path !== '/termos' && path !== '/privacidade'
        && path !== '/verify-email') {
        window.C7_ROUTER.replace('/aceitar-termos');
        return null;
    }

    // Resolve pagina por rota
    if (path === '/login')             return <window.C7_LoginPage />;
    if (path === '/login/2fa')         return <window.C7_Login2FAPage />;
    if (path === '/register')          return <window.C7_RegisterPage />;
    if (path === '/forgot-password')   return <window.C7_ForgotPasswordPage />;
    if (path === '/verify-email')      return <window.C7_VerifyEmailPage />;
    if (path === '/cancel-password-reset') return <window.C7_CancelPasswordResetPage />;
    if (path === '/setup-2fa')       return <window.C7_Setup2FAPage />;
    if (path === '/change-password') return <window.C7_ChangePasswordPage />;
    if (path === '/dashboard')       return <window.C7_DashboardPage />;
    if (path === '/ordens')          return <window.C7_OrdersPage />;
    if (path === '/ordens/nova')     return <window.C7_OrderNewPage />;
    if (path.startsWith('/ordens/')) {
        const order_id = path.split('/').pop();
        return <window.C7_OrderDetailPage order_id={order_id} />;
    }
    if (path === '/perfil')          return <window.C7_ProfilePage />;
    if (path === '/fornecedores')    return <window.C7_SuppliersPage />;
    if (path === '/termos')          return <window.C7_TermsPage />;
    if (path === '/privacidade')     return <window.C7_PrivacyPage />;
    if (path === '/aceitar-termos')  return <window.C7_AcceptTermsPage />;

    // 404 — manda pro dashboard
    window.C7_ROUTER.replace('/dashboard');
    return null;
}


// Monta o React
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
