import { Text } from "preact-i18n";
import { Sync } from "./panes/Sync";
import { useContext } from "preact/hooks";
import styles from "./Settings.module.scss";
import { LIBRARY_VERSION } from "revolt.js";
import { APP_VERSION } from "../../version";
import { GenericSettings } from "./GenericSettings";
import { Route, useHistory } from "react-router-dom";
import {
    Bell,
    Palette,
    Coffee,
    Globe,
    IdCard,
    LogOut,
    Sync as SyncIcon,
    Shield,
    Vial,
    User
} from "@styled-icons/boxicons-regular";
import { Brush, Megaphone } from "@styled-icons/boxicons-solid";
import { Gitlab } from "@styled-icons/boxicons-logos";
import { GIT_BRANCH, GIT_REVISION, REPO_URL } from "../../revision";
import LineDivider from "../../components/ui/LineDivider";
import RequiresOnline from "../../context/revoltjs/RequiresOnline";
import ButtonItem from "../../components/navigation/items/ButtonItem";
import { AppContext, OperationsContext } from "../../context/revoltjs/RevoltClient";

import { Account } from "./panes/Account";
import { Profile } from "./panes/Profile";
import { Sessions } from "./panes/Sessions";
import { Feedback } from "./panes/Feedback";
import { Languages } from "./panes/Languages";
import { Appearance } from "./panes/Appearance";
import { Notifications } from "./panes/Notifications";
import { ExperimentsPage } from "./panes/Experiments";

export default function Settings() {
    const history = useHistory();
    const client = useContext(AppContext);
    const operations = useContext(OperationsContext);
    
    function switchPage(to?: string) {
        if (to) {
            history.replace(`/settings/${to}`);
        } else {
            history.replace(`/settings`);
        }
    }

    return (
        <GenericSettings
            pages={[
                {
                    category: <Text id="app.settings.categories.user_settings" />,
                    id: 'account',
                    icon: <User size={20} />,
                    title: <Text id="app.settings.pages.account.title" />
                },
                {
                    id: 'profile',
                    icon: <IdCard size={20} />,
                    title: <Text id="app.settings.pages.profile.title" />
                },
                {
                    id: 'sessions',
                    icon: <Shield size={20} />,
                    title: <Text id="app.settings.pages.sessions.title" />
                },
                {
                    category: <Text id="app.settings.categories.client_settings" />,
                    id: 'appearance',
                    icon: <Palette size={20} />,
                    title: <Text id="app.settings.pages.appearance.title" />
                },
                {
                    id: 'notifications',
                    icon: <Bell size={20} />,
                    title: <Text id="app.settings.pages.notifications.title" />
                },
                {
                    id: 'language',
                    icon: <Globe size={20} />,
                    title: <Text id="app.settings.pages.language.title" />
                },
                {
                    id: 'sync',
                    icon: <SyncIcon size={20} />,
                    title: <Text id="app.settings.pages.sync.title" />
                },
                {
                    divider: true,
                    id: 'experiments',
                    icon: <Vial size={20} />,
                    title: <Text id="app.settings.pages.experiments.title" />
                },
                {
                    id: 'feedback',
                    icon: <Megaphone size={20} />,
                    title: <Text id="app.settings.pages.feedback.title" />
                }
            ]}
            children={[
                <Route path="/settings/profile"><Profile /></Route>,
                <Route path="/settings/sessions">
                    <RequiresOnline><Sessions /></RequiresOnline>
                </Route>,
                <Route path="/settings/appearance"><Appearance /></Route>,
                <Route path="/settings/notifications"><Notifications /></Route>,
                <Route path="/settings/language"><Languages /></Route>,
                <Route path="/settings/sync"><Sync /></Route>,
                <Route path="/settings/experiments"><ExperimentsPage /></Route>,
                <Route path="/settings/feedback"><Feedback /></Route>,
                <Route path="/"><Account /></Route>
            ]}
            defaultPage="account"
            switchPage={switchPage}
            category="pages"
            custom={[
                <a
                    href="https://gitlab.insrt.uk/revolt"
                    target="_blank"
                >
                    <ButtonItem compact>
                        <Gitlab size={20} />
                        <Text id="app.settings.pages.source_code" />
                    </ButtonItem>
                </a>,
                <a href="https://ko-fi.com/insertish" target="_blank">
                    <ButtonItem className={styles.donate} compact>
                        <Coffee size={20} />
                        <Text id="app.settings.pages.donate.title" />
                    </ButtonItem>
                </a>,
                <LineDivider />,
                <ButtonItem
                    onClick={() => operations.logout()}
                    className={styles.logOut}
                    compact
                >
                    <LogOut size={20} />
                    <Text id="app.settings.pages.logOut" />
                </ButtonItem>,
                <div className={styles.version}>
                    <div>
                        <span className={styles.revision}>
                            <a href={`${REPO_URL}/${GIT_REVISION}`} target="_blank">
                                { GIT_REVISION.substr(0, 7) }
                            </a>
                            {` `}
                            <a href={GIT_BRANCH !== 'DETACHED' ? `https://gitlab.insrt.uk/revolt/client/-/tree/${GIT_BRANCH}` : undefined} target="_blank">
                                ({ GIT_BRANCH })
                            </a>
                        </span>
                        <span>{ GIT_BRANCH === 'production' ? 'Stable' : 'Nightly' } {APP_VERSION}</span>
                        <span>API: {client.configuration?.revolt ?? "N/A"}</span>
                        <span>revolt.js: {LIBRARY_VERSION}</span>
                    </div>
                </div>
            ]}
        />
    )
}