import * as electron from 'electron';
import * as path from 'path';


export default class MinimizeToTray {
    /**
     * Private variables for interaction in plugins
     */
    private _win: any;
    private _app: any;
    private _store: any;
    private _tray: any;
    private _forceQuit = false;

    /**
     * Base Plugin Details (Eventually implemented into a GUI in settings)
     */
    public name: string = 'Minimize to tray';
    public description: string = 'Allow Cider to minimize to tray';
    public version: string = '1.0.0';
    public author: string = 'vapormusic';

    constructor(app: any, store: any) {
        this._app = app;
        this._store = store;
    }

    private SetContextMenu(visibility : any) {
        let self = this
        if (visibility) {
            this._tray.setContextMenu(electron.Menu.buildFromTemplate([
                // {
                //     label: 'Check for Updates',
                //     click: function () {
                //         app.ame.utils.checkForUpdates(true)
                //     }
                // },
                {
                    label: 'Minimize to Tray',
                    click: function () {
                        if (typeof self._win.hide === 'function') {
                            self._win.hide();
                            self.SetContextMenu(false);
                        }
                    }
                },
                {
                    label: 'Quit',
                    click: function () {
                        self._forceQuit = true; self._app.quit();
                    }
                }
            ]));
        } else {
            this._tray.setContextMenu(electron.Menu.buildFromTemplate([
                // {
                //     label: 'Check for Updates',
                //     click: function () {
                //         this._app.ame.utils.checkForUpdates(true)
                //     }
                // },
                {
                    label: `Show ${electron.app.getName()}`,
                    click: function () {
                        if (typeof self._win.show === 'function') {
                            self._win.show();
                            self.SetContextMenu(true);
                        }
                    }
                },
                {
                    label: 'Quit',
                    click: function () {
                        self._forceQuit = true; self._app.quit();
                    }
                }
            ]));
        }
        return true

    }

    /**
     * Runs on app ready
     */
    onReady(win: any): void {
        this._win = win;
        const winTray = electron.nativeImage.createFromPath(path.join(__dirname, `../../resources/icons/icon.ico`)).resize({
            width: 32,
            height: 32
        })
        const macTray = electron.nativeImage.createFromPath(path.join(__dirname, `../../resources/icons/icon.png`)).resize({
            width: 20,
            height: 20
        })
        const linuxTray = electron.nativeImage.createFromPath(path.join(__dirname, `../../resources/icons/icon.png`)).resize({
            width: 32,
            height: 32
        })
        let trayIcon : any ;
        if (process.platform === "win32") {
            trayIcon = winTray
        } else if (process.platform === "linux") {
            trayIcon = linuxTray
        } else if (process.platform === "darwin") {
            trayIcon = macTray
        }

        this._tray = new electron.Tray(trayIcon)
        this._tray.setToolTip(this._app.getName());
        this.SetContextMenu(true);

        this._tray.on('double-click', () => {
            if (typeof this._win.show === 'function') {
                if (this._win.isVisible()) {
                    this._win.focus()
                } else {
                    this._win.show()
                }
            }
        }) 
        electron.ipcMain.on("minimizeTray", (event, value) => {
            // listen for close event
            this._win.hide();
            this.SetContextMenu(false);
        });
        this._win.on("close", (e :any) => {
            if (this._forceQuit || this._store.general["close_behavior"] == '0'  ) {
                this._app.quit();
            } else if (this._store.general["close_behavior"] == '1') {
                e.preventDefault();
                this._win.minimize();
            } else {
                e.preventDefault();
                this._win.hide();
                this.SetContextMenu(false);
            }
        }); 
    }

    /**
     * Runs on app stop
     */
    onBeforeQuit(): void {

    }

    /**
     * Runs on playback State Change
     * @param attributes Music Attributes (attributes.state = current state)
     */
    onPlaybackStateDidChange(attributes: object): void {
    }

    /**
     * Runs on song change
     * @param attributes Music Attributes
     */
    onNowPlayingItemDidChange(attributes: object): void {
    }

}
