import { createInertiaApp } from '@inertiajs/react';
import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers';
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
import { useEffect } from 'react';
import { Toaster, toast } from 'sonner';
import { router } from '@inertiajs/react';
import { CommerceProvider } from '@/contexts/CommerceProvider';
import { initializeTheme, useAppearance } from '@/hooks/use-appearance';

const appName = import.meta.env.VITE_APP_NAME || 'Captex';

function FlashToaster() {
    const { appearance } = useAppearance();

    useEffect(() => {
        return router.on('flash', (event) => {
            const flash = event.detail?.flash;
            const data = flash?.toast;

            if (!data) {
                return;
            }

            toast[data.type](data.message);
        });
    }, []);

    return (
        <Toaster
            theme={appearance}
            className="toaster group"
            position="bottom-right"
            style={{
                '--normal-bg': 'var(--popover)',
                '--normal-text': 'var(--popover-foreground)',
                '--normal-border': 'var(--border)',
            }}
        />
    );
}

function resolveThemePage(pageGlobs, name, fallbackPageGlobs = null) {
    for (const extension of ['tsx', 'jsx']) {
        const expectedSuffix = `/pages/${name}.${extension}`.toLowerCase();
        const path = Object.keys(pageGlobs[extension] ?? {}).find((candidate) =>
            candidate.replaceAll('\\', '/').toLowerCase().endsWith(expectedSuffix),
        );

        if (path && pageGlobs[extension]?.[path]) {
            return resolvePageComponent(path, pageGlobs[extension]);
        }
    }

    if (fallbackPageGlobs) {
        return resolveThemePage(fallbackPageGlobs, name);
    }

    return null;
}

function resolveLayout(name, themeName, layouts) {
    const normalizedName = name.toLowerCase();
    const { appLayout, authLayout, settingsLayout, storeLayout } = layouts;
    const adminPages = ['dashboard', 'admin', 'users', 'products', 'orders'];

    if (
        normalizedName.startsWith('settings/') ||
        normalizedName.startsWith('account/')
    ) {
        return settingsLayout ?? appLayout;
    }

    if (
        adminPages.includes(normalizedName) ||
        normalizedName.startsWith('admin/')
    ) {
        return appLayout ?? storeLayout;
    }

    if (normalizedName.startsWith('auth/')) {
        return themeName === 'theme3' ? storeLayout : authLayout ?? storeLayout;
    }

    return storeLayout;
}

export function createThemeApp({ themeName, pageGlobs, fallbackPageGlobs, layouts }) {
    createInertiaApp({
        title: (title) => (title ? `${title}` : appName),
        resolve: async (name) => {
            const resolved = resolveThemePage(pageGlobs, name, fallbackPageGlobs);

            if (resolved) {
                return resolved;
            }

            throw new Error(`Page not found for ${themeName}: ${name}`);
        },
        layout: (name) => resolveLayout(name, themeName, layouts),
        strictMode: true,
        withApp(app, { page }) {
            return (
                <TooltipPrimitive.Provider delayDuration={0}>
                    <CommerceProvider initialCommerce={page.props.commerce}>
                        {app}
                    </CommerceProvider>
                    <FlashToaster />
                </TooltipPrimitive.Provider>
            );
        },
        progress: {
            color: '#4B5563',
        },
    });

    initializeTheme();
}
