#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, GdkPixbuf
import cairo
import tempfile
import os
import signal
import sys

class SimpleTrayApp:
    def __init__(self):
        self.current_temperature = "21°"
        self.status_icon = Gtk.StatusIcon()

        self.update_temperature(self.current_temperature)
        self.status_icon.set_visible(True)

        self.setup_menu()

    def create_icon_with_text(self, text):
        width = max(24, len(text) * 8 + 8)
        height = 24

        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
        ctx = cairo.Context(surface)

        ctx.set_source_rgba(0, 0, 0, 0)
        ctx.set_operator(cairo.OPERATOR_SOURCE)
        ctx.paint()

        ctx.set_operator(cairo.OPERATOR_OVER)
        ctx.set_source_rgba(0.1, 0.1, 0.1, 0.9)
        ctx.arc(width-4, 4, 4, 0, 3.14159/2)
        ctx.arc(width-4, height-4, 4, 3.14159/2, 3.14159)
        ctx.arc(4, height-4, 4, 3.14159, 3*3.14159/2)
        ctx.arc(4, 4, 4, 3*3.14159/2, 2*3.14159)
        ctx.close_path()
        ctx.fill()

        ctx.set_source_rgb(1, 1, 1)
        ctx.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
        ctx.set_font_size(12)

        extents = ctx.text_extents(text)
        x = (width - extents.width) / 2
        y = (height + extents.height) / 2 - 2

        ctx.move_to(x, y)
        ctx.show_text(text)

        return surface

    def surface_to_pixbuf(self, surface):
        with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
            surface.write_to_png(tmp.name)
            pixbuf = GdkPixbuf.Pixbuf.new_from_file(tmp.name)
            os.unlink(tmp.name)
        return pixbuf

    def update_temperature(self, temperature):
        self.current_temperature = temperature

        surface = self.create_icon_with_text(temperature)
        pixbuf = self.surface_to_pixbuf(surface)
        self.status_icon.set_from_pixbuf(pixbuf)

        self.status_icon.set_tooltip_text(f"Temperature: {temperature}\nHumidity: 65%")

        print(f"Temperature updated: {temperature}")

    def setup_menu(self):
        self.menu = Gtk.Menu()

        self.title_item = Gtk.MenuItem(label=f"Temperature: {self.current_temperature}")
        self.title_item.set_sensitive(False)
        self.menu.append(self.title_item)

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

        test_temps = [
            ("short: 9°", "9°"),
            ("middle: -5°", "-5°"),
            ("long: -22°", "-22°"),
        ]

        for label, temp in test_temps:
            item = Gtk.MenuItem(label=label)
            item.connect("activate", lambda w, t=temp: self.on_temp_selected(t))
            self.menu.append(item)

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

        self.menu.show_all()

        self.status_icon.connect("popup-menu", self.on_popup_menu)
        self.status_icon.connect("activate", self.on_activate)

    def on_popup_menu(self, icon, button, time):
        self.menu.popup(None, None, Gtk.StatusIcon.position_menu, icon, button, time)

    def on_activate(self, icon):
        print(f"Current temperature: {self.current_temperature}")

    def on_temp_selected(self, temperature):
        self.update_temperature(temperature)
        self.title_item.set_label(f"Temperature: {temperature}")

    def on_exit(self, widget):
        Gtk.main_quit()

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

    def start_demo(self):
        temps = ["9°", "-5°", "-22°", "+35°"]
        def demo(index=0):
            if index < len(temps):
                self.update_temperature(temps[index])
                self.title_item.set_label(f"Temperature: {temps[index]}")
                GLib.timeout_add_seconds(2, lambda: demo(index + 1))
        GLib.timeout_add_seconds(2, lambda: demo())

if __name__ == "__main__":
    if not Gtk.init_check()[0]:
        print("Error GTK init")
        sys.exit(1)
    app = SimpleTrayApp()
    app.run()