#!/usr/bin/python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

RATES = {'USD':1.0,'EUR':0.92,'GBP':0.79,'JPY':149.5,'IDR':15600.0,
         'SGD':1.34,'AUD':1.53,'CNY':7.24}
CURRENCIES = list(RATES.keys())

class App(Gtk.Window):
    def __init__(self):
        super().__init__(title='Currency Converter')
        self.set_default_size(350, 220)
        grid = Gtk.Grid(column_spacing=8, row_spacing=8)
        grid.set_margin_top(16); grid.set_margin_bottom(16)
        grid.set_margin_start(16); grid.set_margin_end(16)
        self.add(grid)
        grid.attach(Gtk.Label(label='Amount:', xalign=0), 0, 0, 1, 1)
        self.amount = Gtk.Entry(); self.amount.set_text('1')
        grid.attach(self.amount, 1, 0, 2, 1)
        grid.attach(Gtk.Label(label='From:', xalign=0), 0, 1, 1, 1)
        self.src = Gtk.ComboBoxText()
        for c in CURRENCIES: self.src.append_text(c)
        self.src.set_active(0)
        grid.attach(self.src, 1, 1, 1, 1)
        grid.attach(Gtk.Label(label='To:', xalign=0), 0, 2, 1, 1)
        self.dst = Gtk.ComboBoxText()
        for c in CURRENCIES: self.dst.append_text(c)
        self.dst.set_active(4)
        grid.attach(self.dst, 1, 2, 1, 1)
        btn = Gtk.Button(label='Convert')
        btn.connect('clicked', self.convert)
        grid.attach(btn, 0, 3, 3, 1)
        self.result = Gtk.Label(label='', xalign=0)
        self.result.set_markup('<span size="x-large">Result: —</span>')
        grid.attach(self.result, 0, 4, 3, 1)
    def convert(self, *_):
        try:
            amt = float(self.amount.get_text())
            src = CURRENCIES[self.src.get_active()]
            dst = CURRENCIES[self.dst.get_active()]
            usd = amt / RATES[src]
            res = usd * RATES[dst]
            self.result.set_markup(f'<span size="x-large"><b>{amt:.2f} {src} = {res:.4f} {dst}</b></span>')
        except Exception as e:
            self.result.set_text(f'Error: {e}')

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