#!/usr/bin/env python3

import gi

gi.require_version("Gtk", "3.0")
gi.require_version('AppIndicator3', '0.1')
gi.require_version('Notify', '0.7')

import os
import signal
import gettext
import json
import subprocess

_ = gettext.gettext

from gi.repository import Gtk as gtk
from gi.repository import Gio as gio
from gi.repository import AppIndicator3 as appindicator
from gi.repository import Notify as notify

APPINDICATOR_ID = 'unity-indicator-appearance'

appearance_settings = gio.Settings.new('org.gnome.desktop.interface')
indicator = appindicator.Indicator.new(APPINDICATOR_ID, 'unity-indicator-appearance', appindicator.IndicatorCategory.SYSTEM_SERVICES)

def main():
    indicator.set_status(appindicator.IndicatorStatus.PASSIVE)
    indicator.set_menu(build_menu())
    update_menu_status(appearance_settings, None)
    appearance_settings.connect('changed::gtk-theme', update_menu_status)
    notify.init(APPINDICATOR_ID)
    gtk.main()

def update_menu_status(_1, _2):
    if appearance_settings.get_string('gtk-theme').startswith('Yaru') and appearance_settings.get_string('icon-theme').startswith('Yaru'):
        indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    else:
        indicator.set_status(appindicator.IndicatorStatus.PASSIVE)

def build_menu():
    menu = gtk.Menu()

    # main menu items
    item_switch_theme = gtk.MenuItem(label=_('Switch theme'))
    item_switch_theme.connect('activate', switch_theme)

    item_autohide_launcher = gtk.MenuItem(label=_('Enable/disable auto-hide launcher'))
    item_autohide_launcher.connect('activate', autohide_launcher)

    item_more_appearance_settings = gtk.MenuItem(label=_('More appearance settings...'))
    item_more_appearance_settings.connect('activate', more_appearance_settings)

    menu.append(item_switch_theme)

    # accent color submenu
    item_switch_accent_color = gtk.MenuItem(label='Switch accent color')
    accent_color_submenu = gtk.Menu()
    item_switch_accent_color.set_submenu(accent_color_submenu)
    menu.append(item_switch_accent_color)

    # add accent colors
    default_item = gtk.MenuItem(label=_('Default'))
    default_item.connect('activate', switch_color, 'default')

    bark_item = gtk.MenuItem(label=_('Bark'))
    bark_item.connect('activate', switch_color, 'bark')

    blue_item = gtk.MenuItem(label=_('Blue'))
    blue_item.connect('activate', switch_color, 'blue')

    magenta_item = gtk.MenuItem(label=_('Magenta'))
    magenta_item.connect('activate', switch_color, 'magenta')

    olive_item = gtk.MenuItem(label=_('Olive'))
    olive_item.connect('activate', switch_color, 'olive')

    prussiangreen_item = gtk.MenuItem(label=_('Prussian Green'))
    prussiangreen_item.connect('activate', switch_color, 'prussiangreen')

    purple_item = gtk.MenuItem(label=_('Purple'))
    purple_item.connect('activate', switch_color, 'purple')

    red_item = gtk.MenuItem(label=_('Red'))
    red_item.connect('activate', switch_color, 'red')

    sage_item = gtk.MenuItem(label=_('Sage'))
    sage_item.connect('activate', switch_color, 'sage')

    viridian_item = gtk.MenuItem(label=_('Viridian'))
    viridian_item.connect('activate', switch_color, 'viridian')

    # add colors to submenu
    accent_color_submenu.append(default_item)
    accent_color_submenu.append(bark_item)
    accent_color_submenu.append(blue_item)
    accent_color_submenu.append(magenta_item)
    accent_color_submenu.append(olive_item)
    accent_color_submenu.append(prussiangreen_item)
    accent_color_submenu.append(purple_item)
    accent_color_submenu.append(red_item)
    accent_color_submenu.append(sage_item)
    accent_color_submenu.append(viridian_item)

    # add more appearance settings
    menu.append(item_autohide_launcher)
    menu.append(item_more_appearance_settings)

    menu.show_all()
    return menu

def switch_theme(_):
    if appearance_settings.get_string('gtk-theme') == 'Yaru-dark':
        appearance_settings.set_string('gtk-theme', 'Yaru')
        appearance_settings.set_string('color-scheme', 'prefer-light')
        if '-dark' in appearance_settings.get_string('icon-theme'):
            appearance_settings.set_string('icon-theme', appearance_settings.get_string('icon-theme')[:-5])
    else:
        appearance_settings.set_string('gtk-theme', 'Yaru-dark')
        appearance_settings.set_string('color-scheme', 'prefer-dark')
        if '-dark' not in appearance_settings.get_string('icon-theme'):
            appearance_settings.set_string('icon-theme', appearance_settings.get_string('icon-theme') + '-dark')
    appearance_settings.apply()

def autohide_launcher(_):
    unityshell_compiz_settings = gio.Settings.new_with_path('org.compiz.unityshell', '/org/compiz/profiles/unity/plugins/unityshell/')
    if unityshell_compiz_settings.get_int('launcher-hide-mode') == 0:
        unityshell_compiz_settings.set_int('launcher-hide-mode', 1)
    else:
        unityshell_compiz_settings.set_int('launcher-hide-mode', 0)
    unityshell_compiz_settings.apply()

def more_appearance_settings(_):
    subprocess.Popen(['unity-control-center', 'appearance'])

def switch_color(widget, *data):
    if data[0] == 'default':
        gtk_theme = appearance_settings.get_string('gtk-theme')
        if 'Yaru' in gtk_theme:
            appearance_settings.set_string('icon-theme', gtk_theme)
        return

    if appearance_settings.get_string('gtk-theme') == 'Yaru-dark':
        appearance_settings.set_string('icon-theme', 'Yaru-' + data[0] + '-dark')
    else:
        appearance_settings.set_string('icon-theme', 'Yaru-' + data[0])
    appearance_settings.apply()

if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    main()