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

def make_qr_art(text):
    # deterministic visual pattern based on text content
    h = hashlib.sha256(text.encode()).digest()
    size = 21  # 21x21 like QR version 1
    lines = []
    # top finder pattern
    rows = []
    for row in range(size):
        row_bits = []
        for col in range(size):
            # finder patterns (corners)
            def in_finder(r, c, tr, tc):
                r -= tr; c -= tc
                return 0<=r<=6 and 0<=c<=6 and (r in (0,6) or c in (0,6) or (2<=r<=4 and 2<=c<=4))
            if in_finder(row,col,0,0) or in_finder(row,col,0,14) or in_finder(row,col,14,0):
                row_bits.append(True)
            elif row < 8 and col < 8 or row < 8 and col > 12 or row > 12 and col < 8:
                row_bits.append(False)
            else:
                # data area: use hash bytes
                byte_idx = (row * size + col) % len(h)
                bit_idx = (row * size + col) % 8
                row_bits.append(bool(h[byte_idx] & (1 << bit_idx)))
        rows.append(row_bits)
    for row in rows:
        line = ''.join('█' if b else '░' for b in row)
        lines.append(line)
    return '\n'.join(['  ' + l + '  ' for l in lines])

class App(Gtk.Window):
    def __init__(self):
        super().__init__(title='QR Code Generator')
        self.set_default_size(500, 420)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=8)
        vbox.set_margin_top(10); vbox.set_margin_bottom(10)
        vbox.set_margin_start(10); vbox.set_margin_end(10)
        self.add(vbox)
        hb = Gtk.Box(spacing=6)
        self.entry = Gtk.Entry()
        self.entry.set_placeholder_text('Enter text or URL...')
        self.entry.connect('changed', self.generate)
        hb.pack_start(self.entry, True, True, 0)
        btn = Gtk.Button(label='Generate')
        btn.connect('clicked', self.generate)
        hb.pack_start(btn, False, False, 0)
        vbox.pack_start(hb, False, False, 0)
        sw = Gtk.ScrolledWindow()
        self.tv = Gtk.TextView(); self.tv.set_editable(False)
        self.tv.override_font(Pango.FontDescription('Monospace 10'))
        sw.add(self.tv)
        vbox.pack_start(sw, True, True, 0)
        self.info = Gtk.Label(label='Visual QR pattern (decorative — use zbar/libqrencode for real QR)', xalign=0)
        self.info.set_line_wrap(True)
        vbox.pack_start(self.info, False, False, 0)
        self.entry.set_text('https://example.com')
    def generate(self, *_):
        text = self.entry.get_text()
        if text:
            self.tv.get_buffer().set_text(make_qr_art(text))

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