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

ELEMENTS = [
 (1,'H','Hydrogen',1.008,'1s¹','Nonmetal'),(2,'He','Helium',4.003,'1s²','Noble Gas'),
 (3,'Li','Lithium',6.941,'[He]2s¹','Alkali Metal'),(4,'Be','Beryllium',9.012,'[He]2s²','Alkaline Earth'),
 (5,'B','Boron',10.811,'[He]2s²2p¹','Metalloid'),(6,'C','Carbon',12.011,'[He]2s²2p²','Nonmetal'),
 (7,'N','Nitrogen',14.007,'[He]2s²2p³','Nonmetal'),(8,'O','Oxygen',15.999,'[He]2s²2p⁴','Nonmetal'),
 (9,'F','Fluorine',18.998,'[He]2s²2p⁵','Halogen'),(10,'Ne','Neon',20.180,'[He]2s²2p⁶','Noble Gas'),
 (11,'Na','Sodium',22.990,'[Ne]3s¹','Alkali Metal'),(12,'Mg','Magnesium',24.305,'[Ne]3s²','Alkaline Earth'),
 (13,'Al','Aluminum',26.982,'[Ne]3s²3p¹','Post-transition Metal'),(14,'Si','Silicon',28.086,'[Ne]3s²3p²','Metalloid'),
 (15,'P','Phosphorus',30.974,'[Ne]3s²3p³','Nonmetal'),(16,'S','Sulfur',32.065,'[Ne]3s²3p⁴','Nonmetal'),
 (17,'Cl','Chlorine',35.453,'[Ne]3s²3p⁵','Halogen'),(18,'Ar','Argon',39.948,'[Ne]3s²3p⁶','Noble Gas'),
 (19,'K','Potassium',39.098,'[Ar]4s¹','Alkali Metal'),(20,'Ca','Calcium',40.078,'[Ar]4s²','Alkaline Earth'),
 (26,'Fe','Iron',55.845,'[Ar]3d⁶4s²','Transition Metal'),(29,'Cu','Copper',63.546,'[Ar]3d¹⁰4s¹','Transition Metal'),
 (30,'Zn','Zinc',65.38,'[Ar]3d¹⁰4s²','Transition Metal'),(35,'Br','Bromine',79.904,'[Ar]3d¹⁰4s²4p⁵','Halogen'),
 (36,'Kr','Krypton',83.798,'[Ar]3d¹⁰4s²4p⁶','Noble Gas'),(47,'Ag','Silver',107.868,'[Kr]4d¹⁰5s¹','Transition Metal'),
 (50,'Sn','Tin',118.71,'[Kr]4d¹⁰5s²5p²','Post-transition Metal'),(53,'I','Iodine',126.904,'[Kr]4d¹⁰5s²5p⁵','Halogen'),
 (54,'Xe','Xenon',131.293,'[Kr]4d¹⁰5s²5p⁶','Noble Gas'),(79,'Au','Gold',196.967,'[Xe]4f¹⁴5d¹⁰6s¹','Transition Metal'),
 (80,'Hg','Mercury',200.59,'[Xe]4f¹⁴5d¹⁰6s²','Transition Metal'),(82,'Pb','Lead',207.2,'[Xe]4f¹⁴5d¹⁰6s²6p²','Post-transition Metal'),
 (86,'Rn','Radon',222,'[Xe]4f¹⁴5d¹⁰6s²6p⁶','Noble Gas'),(92,'U','Uranium',238.029,'[Rn]5f³6d¹7s²','Actinide'),
]

CAT_COLORS = {
 'Alkali Metal':'#ff6b6b','Alkaline Earth':'#ffa07a','Transition Metal':'#ffd700',
 'Post-transition Metal':'#98fb98','Metalloid':'#87ceeb','Nonmetal':'#98ff98',
 'Halogen':'#da70d6','Noble Gas':'#add8e6','Lanthanide':'#ffb6c1','Actinide':'#dda0dd',
}

class App(Gtk.Window):
    def __init__(self):
        super().__init__(title='Periodic Table')
        self.set_default_size(820, 560)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        vbox.set_margin_top(6); vbox.set_margin_bottom(6)
        vbox.set_margin_start(6); vbox.set_margin_end(6)
        self.add(vbox)
        sw = Gtk.ScrolledWindow()
        flow = Gtk.FlowBox()
        flow.set_max_children_per_line(10)
        flow.set_selection_mode(Gtk.SelectionMode.NONE)
        for an, sym, name, mass, config, cat in ELEMENTS:
            btn = Gtk.Button()
            col = CAT_COLORS.get(cat, '#ffffff')
            lbl_text = f'<span size="x-small">{an}</span>\n<span size="large" weight="bold">{sym}</span>'
            lbl = Gtk.Label(); lbl.set_markup(lbl_text)
            btn.add(lbl)
            btn.set_size_request(70, 60)
            btn.set_tooltip_text(f'{name}\n{mass} u\n{cat}')
            btn.connect('clicked', self.show_element, (an, sym, name, mass, config, cat))
            css = f'button {{ background-color: {col}; }}'
            prov = Gtk.CssProvider(); prov.load_from_data(css.encode())
            btn.get_style_context().add_provider(prov, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
            flow.add(btn)
        sw.add(flow)
        vbox.pack_start(sw, True, True, 0)
        self.info_frame = Gtk.Frame(label='Element Info')
        info_grid = Gtk.Grid(column_spacing=12, row_spacing=4)
        info_grid.set_margin_top(8); info_grid.set_margin_bottom(8)
        info_grid.set_margin_start(8); info_grid.set_margin_end(8)
        self.info_labels = {}
        for i, key in enumerate(['Name','Symbol','Atomic #','Mass','Config','Category']):
            info_grid.attach(Gtk.Label(label=f'{key}:', xalign=0), 0, i, 1, 1)
            lbl = Gtk.Label(label='—', xalign=0)
            lbl.override_font(Pango.FontDescription('Bold'))
            info_grid.attach(lbl, 1, i, 1, 1)
            self.info_labels[key] = lbl
        self.info_frame.add(info_grid)
        vbox.pack_start(self.info_frame, False, False, 0)
    def show_element(self, _, data):
        an, sym, name, mass, config, cat = data
        self.info_labels['Name'].set_text(name)
        self.info_labels['Symbol'].set_text(sym)
        self.info_labels['Atomic #'].set_text(str(an))
        self.info_labels['Mass'].set_text(f'{mass} u')
        self.info_labels['Config'].set_text(config)
        self.info_labels['Category'].set_text(cat)

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