#!/usr/bin/env python3

import gi
import signal
import os
import sys

try:
    gi.require_version('AyatanaAppIndicator3', '0.1')
    from gi.repository import AyatanaAppIndicator3 as appindicator
    print("use AyatanaAppIndicator3")
except:
    try:
        gi.require_version('AppIndicator3', '0.1')
        from gi.repository import AppIndicator3 as appindicator
        print("use AppIndicator3")
    except:
        try:
            gi.require_version('AppIndicator', '0.1')
            from gi.repository import AppIndicator as appindicator
            print("use AppIndicator")
        except:
            print("Indicator libs not found")
            sys.exit(1)

gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib


class AppIndicatorTemperature:
    def __init__(self):
        self.current_temp = "5°"
        self.temperatures = ["5°", "-25°", "15°", "0°", "10°", "25°", "-5°"]
        self.temp_index = 0

        self.indicator = appindicator.Indicator.new(
            "temperature-app-indicator",
            "weather-clear-symbolic",
            appindicator.IndicatorCategory.APPLICATION_STATUS
        )

        self.indicator.set_status(appindicator.IndicatorStatus.ACTIVE)

        self.create_menu()

        self.update_all_properties()

        GLib.timeout_add_seconds(3, self.update_temperature)

        print("AppIndicator run")

    def create_menu(self):
        """Создаем контекстное меню"""
        self.menu = Gtk.Menu()

        self.temp_item = Gtk.MenuItem(label="")
        self.update_menu_item()
        self.temp_item.set_sensitive(False)
        self.menu.append(self.temp_item)

        self.menu.append(Gtk.SeparatorMenuItem())

        refresh_item = Gtk.MenuItem(label="Update now")
        refresh_item.connect("activate", self.force_update)
        self.menu.append(refresh_item)

        self.menu.append(Gtk.SeparatorMenuItem())

        exit_item = Gtk.MenuItem(label="Exit")
        exit_item.connect("activate", self.quit_app)
        self.menu.append(exit_item)

        for item in self.menu.get_children():
            item.show()

        self.indicator.set_menu(self.menu)

    def update_menu_item(self):
        self.temp_item.set_label(f"Temperature: {self.current_temp}")

    def update_all_properties(self):
        print(f"Set temperature: {self.current_temp}")

        if hasattr(self.indicator, 'set_title'):
            self.indicator.set_title(f"Temperatur: {self.current_temp}")
            print(f"Captition update")

        if hasattr(self.indicator, 'set_label'):
            try:
                self.indicator.set_label(self.current_temp, "")
                print(f"Set label: {self.current_temp}")
            except Exception as e:
                print(f"label: {e}")

        icon_name = self.get_temperature_icon()
        try:
            self.indicator.set_icon(icon_name)
            print(f"icons: {icon_name}")
        except Exception as e:
            print(f"icons: {e}")

        self.update_menu_item()

    def get_temperature_icon(self):
        try:
            temp = int(self.current_temp.replace('°', ''))

            if temp < -10:
                return "weather-snow-symbolic"
            elif temp < 0:
                return "weather-few-clouds-symbolic"
            elif temp < 15:
                return "weather-clear-symbolic"
            else:
                return "weather-clear-night-symbolic"
        except:
            return "weather-clear-symbolic"

    def update_temperature(self):
        self.temp_index = (self.temp_index + 1) % len(self.temperatures)
        old_temp = self.current_temp
        self.current_temp = self.temperatures[self.temp_index]

        if old_temp != self.current_temp:
            self.update_all_properties()

        return True

    def force_update(self, widget=None):
        print("Update manual...")
        self.update_temperature()

    def quit_app(self, widget=None):
        print("Exit")
        Gtk.main_quit()

    def run(self):
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        print("app run")
        Gtk.main()

if __name__ == "__main__":
    app = AppIndicatorTemperature()
    app.run()