/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/app/bootstrapUserSettings.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
import { supabase } from '@/lib/supabase/client';
import { useLayout } from '@/layout/composables/layout';
import { $t, updatePreset, updateSurfacePalette } from '@primeuix/themes';
import Aura from '@primeuix/themes/aura';
import Lara from '@primeuix/themes/lara';
import Nora from '@primeuix/themes/nora';

const presets = { Aura, Lara, Nora };

function safeEq(a, b) {
    return String(a || '').trim() === String(b || '').trim();
}

// copia do seu getPresetExt (ou exporta ele do Perfil pra reutilizar)
function getPresetExt(primaryColors, layoutConfig) {
    const color = primaryColors.find((c) => c.name === layoutConfig.primary) || { name: 'noir', palette: {} };

    if (color.name === 'noir') {
        return {
            semantic: {
                primary: {
                    50: '{surface.50}',
                    100: '{surface.100}',
                    200: '{surface.200}',
                    300: '{surface.300}',
                    400: '{surface.400}',
                    500: '{surface.500}',
                    600: '{surface.600}',
                    700: '{surface.700}',
                    800: '{surface.800}',
                    900: '{surface.900}',
                    950: '{surface.950}'
                },
                colorScheme: {
                    light: {
                        primary: { color: '{primary.950}', contrastColor: '#ffffff', hoverColor: '{primary.800}', activeColor: '{primary.700}' },
                        highlight: { background: '{primary.950}', focusBackground: '{primary.700}', color: '#ffffff', focusColor: '#ffffff' }
                    },
                    dark: {
                        primary: { color: '{primary.50}', contrastColor: '{primary.950}', hoverColor: '{primary.200}', activeColor: '{primary.300}' },
                        highlight: { background: '{primary.50}', focusBackground: '{primary.300}', color: '{primary.950}', focusColor: '{primary.950}' }
                    }
                }
            }
        };
    }

    return {
        semantic: {
            primary: color.palette,
            colorScheme: {
                light: {
                    primary: { color: '{primary.500}', contrastColor: '#ffffff', hoverColor: '{primary.600}', activeColor: '{primary.700}' },
                    highlight: { background: '{primary.50}', focusBackground: '{primary.100}', color: '{primary.700}', focusColor: '{primary.800}' }
                },
                dark: {
                    primary: { color: '{primary.400}', contrastColor: '{surface.900}', hoverColor: '{primary.300}', activeColor: '{primary.200}' },
                    highlight: {
                        background: 'color-mix(in srgb, {primary.400}, transparent 84%)',
                        focusBackground: 'color-mix(in srgb, {primary.400}, transparent 76%)',
                        color: 'rgba(255,255,255,.87)',
                        focusColor: 'rgba(255,255,255,.87)'
                    }
                }
            }
        }
    };
}

export async function bootstrapUserSettings({
    primaryColors = [], // passe a lista do seu Perfil (ou uma versão reduzida)
    surfaces = [] // idem
} = {}) {
    const { layoutConfig, isDarkTheme, toggleDarkMode, changeMenuMode, setVariant } = useLayout();

    const { data: uRes, error: uErr } = await supabase.auth.getUser();
    if (uErr) return;
    const user = uRes?.user;
    if (!user) return;

    const { data: settings, error } = await supabase.from('user_settings').select('theme_mode, preset, primary_color, surface_color, menu_mode, layout_variant').eq('user_id', user.id).maybeSingle();

    if (error || !settings) return;

    // layout variant: respeita a preferência já gravada no localStorage.
    // Se localStorage está vazio, só aplica 'rail' do banco (confirma o padrão).
    // Nunca aplica 'classic' automaticamente quando não há preferência local —
    // dado antigo no banco não deve sobrescrever o padrão do app.
    const _lsV = (() => {
        try {
            const v = localStorage.getItem('layout_variant');
            return v === 'rail' || v === 'classic' || v === 'melissa' ? v : null;
        } catch {
            return null;
        }
    })();

    if (_lsV !== null) {
        // localStorage já tem valor → aplica ele (garante coerência com layoutConfig)
        if (_lsV !== (settings.layout_variant ?? _lsV)) setVariant(_lsV);
    } else if (settings.layout_variant === 'rail' || settings.layout_variant === 'melissa') {
        // localStorage vazio + banco tem 'rail'/'melissa' → aplica e grava no localStorage
        setVariant(settings.layout_variant);
    }
    // localStorage vazio + banco tem 'classic' → mantém padrão 'rail' (não aplica)

    // menu mode
    if (settings.menu_mode && settings.menu_mode !== layoutConfig.menuMode) {
        layoutConfig.menuMode = settings.menu_mode;
        changeMenuMode();
    }

    // preset
    if (settings.preset && settings.preset !== layoutConfig.preset) {
        layoutConfig.preset = settings.preset;
        const presetValue = presets[settings.preset] || presets.Aura;
        const surfacePalette = surfaces.find((s) => s.name === layoutConfig.surface)?.palette;
        $t().preset(presetValue).preset(getPresetExt(primaryColors, layoutConfig)).surfacePalette(surfacePalette).use({ useDefaultOptions: true });
    }

    // colors
    if (settings.primary_color && !safeEq(settings.primary_color, layoutConfig.primary)) {
        layoutConfig.primary = settings.primary_color;
        updatePreset(getPresetExt(primaryColors, layoutConfig));
    }

    if (settings.surface_color && !safeEq(settings.surface_color, layoutConfig.surface)) {
        layoutConfig.surface = settings.surface_color;
        const surface = surfaces.find((s) => s.name === settings.surface_color);
        if (surface) updateSurfacePalette(surface.palette);
    }

    // dark/light
    if (settings.theme_mode) {
        const shouldBeDark = settings.theme_mode === 'dark';
        if (shouldBeDark !== isDarkTheme) toggleDarkMode();
    }
}
