import {
    Accordion, ActionIcon,
    Box,
    Flex,
    Grid,
    Group,
    LoadingOverlay,
    Modal,
    ScrollArea,
    Tabs,
    Text,
    Title, Tooltip,
    useMantineTheme
} from "@mantine/core";

import DashboardStyle from "../Dashboard.module.css";
import {
    IconApps,
    IconLayoutBottombar, IconLayoutNavbar,
    IconLayoutSidebarLeftExpand,
    IconMenu2,
    IconReload,
    IconSettings,
    IconTemplate, IconXboxX
} from "@tabler/icons-react";
import * as TablerIcons from "@tabler/icons-react";
import {lazy, Suspense, useEffect, useState} from "@wordpress/element";
import axios from "axios";
import {useDisclosure, useFullscreen, useViewportSize} from "@mantine/hooks";
// import _PageRepositoryComponent from "./_PageRepositoryComponent";
// import AppbarLayouts from "./appbar/AppbarLayouts";
// import NavbarLayouts from "./navbar/NavbarLayouts";
// import DrawerLayouts from "./drawer/DrawerLayouts";
// import Settings from "./settings/Settings";
// import ThemeList from "./theme/ThemeList";


const _PageRepositoryComponent = lazy(() => import('./_PageRepositoryComponent'));
const AppbarLayouts = lazy(() => import('./appbar/AppbarLayouts'));
const NavbarLayouts = lazy(() => import('./navbar/NavbarLayouts'));
const DrawerLayouts = lazy(() => import('./drawer/DrawerLayouts'));
const Settings = lazy(() => import('./settings/Settings'));
const ThemeList = lazy(() => import('./theme/ThemeList'));

const DefaultSidebar = ({ isSupportPluginChange, setIsSupportPluginChange, isThemeChange, setThemeChange, reloadPageList ,setRecentAddedComponentId, activeScreen, selectedLayout, recallAppbar, setRecallAppbar, recallNavbar, recallDrawer, setRecallNavbar, setRecallDrawer, setReloadPageList, setSelectedLayout, setShowRightSidebar}) => {
    const {height, width} = useViewportSize()
    const global = [
        { link: "", label: "Appbar", slug: "appbar", icon: IconApps },
        { link: "", label: "Navbar", slug: "navbar", icon: IconMenu2 },
        { link: "", label: "Drawer", slug: "drawer", icon: IconLayoutSidebarLeftExpand },
    ];

    const [activeTab, setActiveTab] = useState('global');
    const [availableComponents, setAvailableComponents] = useState([]);

    const [pageComponentLoading, setPageComponentLoading] = useState(false);
    const [repositoryReload, setRepositoryReload] = useState(false);
    const theme = useMantineTheme();
    const [isOpenSettingsModal, handlesSettingsModal] = useDisclosure(false);
    const [isOpenThemesModal, handlesThemesModal] = useDisclosure(false);
    const { toggle, fullscreen } = useFullscreen();

    const getComponentRepository = () => {
        setPageComponentLoading(true);

        axios({
            method: 'get',
            url: `${appLocalizer.apiUrl}/appza/web/api/v1/page/component-repository`,
            headers: {
                "Accept": `application/json`,
                "Content-Type": `application/json`,
                "Access-Control-Allow-Origin": '*',

            },
            params: {
                page_slug: activeScreen
            }
        })
            .then(res => {
                setAvailableComponents(res.data);
                setPageComponentLoading(false);

            })
            .catch(function (err) {
                console.log(err);
            });
    }
    useEffect(() => {
        if (null !== activeScreen) {
            getComponentRepository();

        }
    }, [activeScreen, repositoryReload, isThemeChange, isSupportPluginChange]);

    useEffect(() => {
        setRecallAppbar(prevState => !prevState);
    }, [reloadPageList]);

    return(
        <>
            <Tabs
                px="sm"
                pb="sm"
                // h="100%"
                variant="pills"
                defaultValue="global"
                onChange={ activeTab => {
                    setActiveTab(activeTab);
                    'global' === activeTab && setShowRightSidebar(false);
                }}
                styles={{
                    tab: {
                        width: `45%`
                    }
                }}
            >
                <Tabs.List grow justify="center" bg={theme.primaryColor + '.0'} mb="xs" style={{borderRadius: 'var(--mantine-radius-sm)'}}>
                    <Tabs.Tab value="global">Global</Tabs.Tab>
                    <Tabs.Tab value="components">Components</Tabs.Tab>
                </Tabs.List>
                <Tabs.Panel value="global">
                    <ScrollArea h={height - 188} scrollbarSize={3} pos="relative">
                        <Accordion chevronPosition="right" variant="contained" mb={`sm`} defaultValue="" styles={{
                            content: {
                                padding: 5
                            }
                        }}
                        >
                            <Accordion.Item mb={10} style={{borderTop: '1px solid var(--mantine-color-gray-2)', borderRadius: 'var(--mantine-radius-sm)'}} value={`Appbar`}>
                                <Accordion.Control icon={<IconLayoutNavbar stroke={1}/>}>
                                    <Text fw={700}> Appbar </Text>
                                </Accordion.Control>
                                <Accordion.Panel style={{backgroundColor: 'var(--mantine-color-gary-1)'}}>
                                    <ScrollArea h={height - 370} scrollbarSize={3}>
                                        <Suspense fallback="Loading...">
                                            <AppbarLayouts
                                                isThemeChange={isThemeChange}
                                                recallAppbar={recallAppbar}
                                                setRecallAppbar={setRecallAppbar}
                                                setSelectedLayout={setSelectedLayout}
                                                setShowRightSidebar={setShowRightSidebar}
                                                isSupportPluginChange={isSupportPluginChange}
                                            />
                                        </Suspense>
                                    </ScrollArea>

                                </Accordion.Panel>
                            </Accordion.Item>
                            <Accordion.Item mb={10} style={{borderTop: '1px solid var(--mantine-color-gray-2)', borderRadius: 'var(--mantine-radius-sm)'}} value={`Navbar`}>
                                <Accordion.Control icon={<IconLayoutBottombar stroke={1}/>}>
                                    <Text fw={700}> Navbar </Text>
                                </Accordion.Control>
                                <Accordion.Panel style={{backgroundColor: 'var(--mantine-color-gary-1)'}}>
                                    <ScrollArea h={height - 370} scrollbarSize={3}>
                                        <Suspense fallback="Loading...">
                                            <NavbarLayouts
                                                isThemeChange={isThemeChange}
                                                recallNavbar={recallNavbar}
                                                setRecallNavbar={setRecallNavbar}
                                                setSelectedLayout={setSelectedLayout}
                                                selectedLayout={selectedLayout}
                                                setShowRightSidebar={setShowRightSidebar}
                                                isSupportPluginChange={isSupportPluginChange}
                                            />
                                        </Suspense>
                                    </ScrollArea>

                                </Accordion.Panel>
                            </Accordion.Item>
                            <Accordion.Item mb={10} style={{borderTop: '1px solid var(--mantine-color-gray-2)', borderRadius: 'var(--mantine-radius-sm)'}} value={`Drawer`}>
                                <Accordion.Control icon={<IconLayoutSidebarLeftExpand stroke={1}/>}>
                                    <Text fw={700}> Drawer </Text>
                                </Accordion.Control>
                                <Accordion.Panel style={{backgroundColor: 'var(--mantine-color-gary-1)'}}>
                                    <ScrollArea h={height - 370} scrollbarSize={3}>
                                        <Suspense fallback="Loading...">
                                            <DrawerLayouts
                                                isThemeChange={isThemeChange}
                                                recallDrawer={recallDrawer}
                                                setRecallDrawer={setRecallDrawer}
                                                setSelectedLayout={setSelectedLayout}
                                                setShowRightSidebar={setShowRightSidebar}
                                                isSupportPluginChange={isSupportPluginChange}
                                            />
                                        </Suspense>
                                    </ScrollArea>

                                </Accordion.Panel>
                            </Accordion.Item>
                        </Accordion>
                    </ScrollArea>

                </Tabs.Panel>
                <Tabs.Panel value="components">
                    <ScrollArea h={height - 188} scrollbarSize={3} pos="relative">
                        <Tooltip
                            color={theme.primaryColor + '.1'}
                            label={ <Text c={theme.colors.dark[7]} fw={500} size="sm">Reload</Text> }
                        >
                            <ActionIcon
                                variant="light"
                                size="xs"
                                pos="absolute"
                                bottom={0}
                                right={0}
                                onClick={() => setRepositoryReload(prevState => !prevState)}
                            >
                                <IconReload />
                            </ActionIcon>
                        </Tooltip>
                        <LoadingOverlay visible={pageComponentLoading} zIndex={100} overlayProps={{ radius: "sm", blur: 5 }} loaderProps={{ size: 'sm' }} />

                    {/*{
                        availableComponents.length === 0 && <Center>
                            <Button size="xs" onClick={() => setRepositoryReload(prevState => !prevState)} leftSection={<IconReload />}>Reload</Button>
                        </Center>
                    }*/}
                    {
                        availableComponents &&
                        <Accordion
                            chevronPosition="right"
                            variant="contained"
                            mb="xs"
                            defaultValue=""
                            styles={{
                                content: {
                                    padding: 5
                                }
                            }}
                        >
                            {
                                availableComponents?.map((group, index) => {
                                    const ICON = TablerIcons[group?.icon] === undefined ? TablerIcons['IconDots'] : TablerIcons[group?.icon];

                                    return (
                                        <Accordion.Item mb={10} style={{borderTop: '1px solid var(--mantine-color-gray-2)', borderRadius: 'var(--mantine-radius-sm)'}} value={group?.name}>
                                            <Accordion.Control icon={<ICON stroke={1}/>}>
                                                <Group wrap="nowrap">
                                                    <Text fw={700}>{group?.name}</Text>
                                                </Group>
                                            </Accordion.Control>
                                            <Accordion.Panel style={{backgroundColor: 'var(--mantine-color-gary-1)'}}>
                                                <ScrollArea h={height - 370} scrollbarSize={3} pos="relative">
                                                    <Grid gutter={0}>

                                                        {
                                                            group?.items?.map((component, index) => (
                                                                <Suspense fallback="Loading...">
                                                                    <_PageRepositoryComponent
                                                                        key={component.id}
                                                                        setRecentAddedComponentId={setRecentAddedComponentId}
                                                                        component={component}
                                                                        setShowRightSidebar={setShowRightSidebar}
                                                                        setSelectedLayout={setSelectedLayout}
                                                                        setReloadPageList={setReloadPageList}
                                                                    />
                                                                </Suspense>
                                                            ))
                                                        }
                                                    </Grid>
                                                </ScrollArea>
                                            </Accordion.Panel>
                                        </Accordion.Item>
                                    );
                                })
                            }
                        </Accordion>
                    }

                    </ScrollArea>
                </Tabs.Panel>
            </Tabs>

            <Box h={1} w="100%" bg="gray.2"></Box>
            <Flex
                direction="row"
                align="center"
                justify="space-around"
                py={`md`}
            >
                <Flex
                    direction="column"
                    align="center"
                    justify="space-between"
                    className={DashboardStyle.leftBarFooterItem}
                    onClick={handlesSettingsModal.open}
                >
                    <IconSettings
                        stroke={1.5}
                        style={{ justifyContent: "center", alignItems: "center" }}
                    />
                    <Text textAlign="center">Settings</Text>
                </Flex>
                <Flex
                    direction="column"
                    align="center"
                    justify="center"
                    className={DashboardStyle.leftBarFooterItem}
                    onClick={handlesThemesModal.open}
                >
                    <IconTemplate stroke={1.5} />
                    <Text>Themes</Text>
                </Flex>
            </Flex>


            <Modal
                opened={isOpenSettingsModal}
                onClose={handlesSettingsModal.close}
                size="100%"
                closeOnClickOutside={false}
                withCloseButton={false}
                styles={{
                    inner: {
                        paddingLeft: `${fullscreen ? 'var(--mantine-spacing-sm)' : '45px'}`,
                        paddingRight: 'var(--mantine-spacing-sm)',
                    },
                    content: {
                        height: height - 10,
                    },
                    body: {
                        paddingTop: 0,
                        paddingBottom: 0,
                        height: '100%'
                    }
                }}
            >
                <Modal.Header p={0}>
                    <Modal.Title>
                        <Title order={3} data-autofocus>Settings</Title>
                    </Modal.Title>
                    <Modal.CloseButton>
                        <ActionIcon
                            variant="light"
                            color={theme.colors.gray[5]}
                            onClick={handlesSettingsModal.close}
                        >
                            <IconXboxX stroke={1.5} />
                        </ActionIcon>
                    </Modal.CloseButton>
                </Modal.Header>

                {/*<Settings setIsSupportPluginChange={setIsSupportPluginChange}/>*/}
                <Box pos="relative">
                    <Suspense fallback={<LoadingOverlay visible={true} zIndex={1000} overlayProps={{ radius: "sm", blur: 5 }} loaderProps={{ size: 'sm' }} />}>
                        <Settings setIsSupportPluginChange={setIsSupportPluginChange} handlesSettingsModal={handlesSettingsModal} handlesThemesModal={handlesThemesModal}/>
                    </Suspense>
                </Box>
            </Modal>

            <Modal
                opened={isOpenThemesModal}
                onClose={handlesThemesModal.close}
                size="100%"
                closeOnClickOutside={false}
                withCloseButton={false}
                styles={{
                    inner: {
                        paddingLeft: `${fullscreen ? 'var(--mantine-spacing-sm)' : '45px'}`,
                        paddingRight: 'var(--mantine-spacing-sm)',
                    },
                    content: {
                        height: height - 10,
                    },
                    body: {
                        paddingTop: 0,
                        paddingBottom: 0
                    }
                }}
            >
                <Modal.Header p={0}>
                    <Modal.Title>
                        <Title order={3} data-autofocus>Themes</Title>
                    </Modal.Title>
                    <Modal.CloseButton>
                        <ActionIcon
                            variant="light"
                            color={theme.colors.gray[5]}
                            onClick={handlesThemesModal.close}
                        >
                            <IconXboxX stroke={1.5} />
                        </ActionIcon>
                    </Modal.CloseButton>
                </Modal.Header>

                <Box pos="relative">
                    <Suspense fallback={<LoadingOverlay visible={true} zIndex={1000} overlayProps={{ radius: "sm", blur: 5 }} loaderProps={{ size: 'sm' }} />}>
                        <ThemeList setThemeChange={setThemeChange} isOnboarding={false} slideHeight={`78vh`}/>
                    </Suspense>
                </Box>

            </Modal>





        </>

    );
}

export default DefaultSidebar;