#!/usr/bin/python3
import gi
from datetime import datetime, timezone, timedelta
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib, Pango

CITIES = [
    ('Jakarta',    'WIB',   7),
    ('Tokyo',      'JST',   9),
    ('Dubai',      'GST',   4),
    ('Moscow',     'MSK',   3),
    ('London',     'GMT',   0),
    ('New York',   'EST',  -5),
    ('Los Angeles','PST',  -8),
    ('Sydney',     'AEST', 10),
    ('Auckland',   'NZST', 12),
    ('Sao Paulo',  'BRT',  -3),
]

class App(Gtk.Window):
    def __init__(self):
        super().__init__(title='World Clocks')
        self.set_default_size(440, 480)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=4)
        vbox.set_margin_top(10); vbox.set_margin_bottom(10)
        vbox.set_margin_start(10); vbox.set_margin_end(10)
        self.add(vbox)
        self.clock_labels = {}
        for city, tz_name, offset in CITIES:
            hb = Gtk.Box(spacing=10)
            city_lbl = Gtk.Label(label=f'{city} ({tz_name} UTC{offset:+d})', xalign=0, width_chars=26)
            city_lbl.override_font(Pango.FontDescription('14'))
            time_lbl = Gtk.Label(label='--:--:--', xalign=1)
            time_lbl.override_font(Pango.FontDescription('Monospace Bold 18'))
            hb.pack_start(city_lbl, True, True, 0)
            hb.pack_start(time_lbl, False, False, 0)
            vbox.pack_start(hb, False, False, 0)
            sep = Gtk.Separator()
            vbox.pack_start(sep, False, False, 0)
            self.clock_labels[(city, offset)] = time_lbl
        GLib.timeout_add(1000, self.update_clocks)
        self.update_clocks()
    def update_clocks(self):
        utc_now = datetime.now(timezone.utc)
        for (city, offset), lbl in self.clock_labels.items():
            local = utc_now + timedelta(hours=offset)
            lbl.set_text(local.strftime('%H:%M:%S'))
        return True

win = App()
win.connect('destroy', Gtk.main_quit)
win.show_all()
Gtk.main()
