import { Box, GlobalStyles } from '@bigcommerce/big-design';
import { theme as defaultTheme } from '@bigcommerce/big-design-theme';
import type { AppProps } from 'next/app';
import Head from 'next/head';
import { ThemeProvider } from 'styled-components';
import Header from '../components/header';
import SessionProvider from '../context/session';

const replaceThemeColors = <T,>(value: T, seen = new WeakMap<object, any>()): T => {
    if (typeof value === 'string') {
        return value
            .replace(/#3c64f4/gi, '#ff9600')
            .replace(/#313440/gi, '#2F2F2B') as any;
    }

    if (!value || typeof value !== 'object') {
        return value;
    }

    if (seen.has(value as any)) {
        return seen.get(value as any);
    }

    if (Array.isArray(value)) {
        const arr: any[] = [];
        seen.set(value as any, arr);
        for (const item of value) {
            arr.push(replaceThemeColors(item, seen));
        }
        return arr as any;
    }

    const obj: Record<string, any> = {};
    seen.set(value as any, obj);
    for (const [k, v] of Object.entries(value as any)) {
        obj[k] = replaceThemeColors(v, seen);
    }
    return obj as any;
};

const theme = replaceThemeColors(defaultTheme);

const MyApp = ({ Component, pageProps }: AppProps) => {
    return (
        <ThemeProvider theme={theme}>
            <Head>
                <meta name="viewport" content="width=device-width, initial-scale=1" />
            </Head>
            <GlobalStyles />
            <Box
                marginHorizontal={{ mobile: 'none', tablet: 'xxxLarge' }}
                marginVertical={{ mobile: 'none', tablet: "xxLarge" }}
            >
                <Header />
                <SessionProvider>
                    <Component {...pageProps} />
                </SessionProvider>
            </Box>
        </ThemeProvider>
    );
};

export default MyApp;
