/**
 * BetterDiscord Client UI Module
 * Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
 * All rights reserved.
 * https://betterdiscord.net
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
*/

import { Events, DiscordApi, Settings } from 'modules';
import { remote } from 'electron';
import DOM from './dom';
import Vue from './vue';
import { BdSettingsWrapper, BdModals, BdToasts, BdNotifications, BdContextMenu } from './components';

export default class {

    static initUiEvents() {
        document.body.classList.add('bd-v2');
        const hideButtonSetting = Settings.getSetting('ui', 'default', 'hide-button');
        hideButtonSetting.on('setting-updated', event => {
            if (event.value) document.body.classList.add('bd-hideButton');
            else document.body.classList.remove('bd-hideButton');
        });
        if (hideButtonSetting.value) document.body.classList.add('bd-hideButton');

        const currentWindow = remote.getCurrentWindow();
        const windowOptions = currentWindow.__bd_options;

        if (!windowOptions.hasOwnProperty('frame') || windowOptions.frame) document.body.classList.add('bd-windowHasFrame');
        if (windowOptions.transparent) document.body.classList.add('bd-windowIsTransparent');

        this.pathCache = {
            isDm: null,
            server: DiscordApi.currentGuild,
            channel: DiscordApi.currentChannel
        };

        currentWindow.webContents.on('did-navigate-in-page', (e, url, isMainFrame) => {
            const { currentGuild, currentChannel } = DiscordApi;

            if (!this.pathCache.server)
                Events.emit('server-switch', { server: currentGuild, channel: currentChannel });
            else if (!this.pathCache.channel)
                Events.emit('channel-switch', currentChannel);
            else if (currentGuild && currentGuild.id && this.pathCache.server && this.pathCache.server.id !== currentGuild.id)
                Events.emit('server-switch', { server: currentGuild, channel: currentChannel });
            else if (currentChannel && currentChannel.id && this.pathCache.channel && this.pathCache.channel.id !== currentChannel.id)
                Events.emit('channel-switch', currentChannel);

            this.pathCache.server = currentGuild;
            this.pathCache.channel = currentChannel;
        });
    }

    static injectUi() {
        DOM.createElement('div', null, 'bd-settings').appendTo(DOM.bdBody);
        DOM.createElement('div', null, 'bd-modals').appendTo(DOM.bdModals);
        DOM.createElement('div', null, 'bd-toasts').appendTo(DOM.bdToasts);
        DOM.createElement('div', null, 'bd-notifications').appendTo(DOM.bdNotifications);
        DOM.createElement('div', null, 'bd-contextmenu').appendTo(DOM.bdContextMenu);
        DOM.createElement('bd-tooltips').appendTo(DOM.bdBody);

        this.toasts = new (Vue.extend(BdToasts))({
            el: '#bd-toasts'
        });

        this.modals = new (Vue.extend(BdModals))({
            el: '#bd-modals'
        });

        this.vueInstance = new (Vue.extend(BdSettingsWrapper))({
            el: '#bd-settings'
        });

        this.notifications = new (Vue.extend(BdNotifications))({
            el: '#bd-notifications'
        });

        this.contextmenu = new (Vue.extend(BdContextMenu))({
            el: '#bd-contextmenu'
        });

        return this.vueInstance;
    }

}
