import qrcode
import sqlite3
import socketserver
from datetime import datetime
from PIL import Image, ImageDraw, ImageFont

qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4,
)

conn = sqlite3.connect("MUEB_register.db")
c = conn.cursor()

# create mueb table
try:
    c.execute('''
    CREATE TABLE mueb (
        mueb_id INTEGER     PRIMARY KEY,
        mac     STRING (17) UNIQUE
                            NOT NULL
    );
    ''')
except:
    pass

print("Listening for MUEB DHCP discover")
print("{:<8} {:<17} {:<5}".format("scan", "MAC", "MUEB id"))

prev_MAC = None


class UDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        global prev_MAC
        data = self.request[0].strip()
        CHADDR = list(data[28:34])  # CHWADDR
        if(hex(CHADDR[0]) != '0x54' or hex(CHADDR[1]) != '0x10' or hex(CHADDR[2]) != '0xec'):
            return

        MAC = ':'.join(["{0:02X}".format(i) for i in CHADDR])

        # handle multiple requests from the same device
        if prev_MAC != MAC:
            # save to DB
            c.execute("INSERT OR IGNORE INTO mueb(mac) VALUES('{}')".format(MAC))
            conn.commit()

            c.execute("SELECT mueb_id FROM mueb WHERE mac='{}'".format(MAC))
            mueb_id = c.fetchall()[0][0]

            print("{:<8} {:<17} {:<5}".format(
                datetime.now().strftime('%H:%M:%S'), MAC, mueb_id))
            qr.add_data(MAC)
            qr.make(fit=True)

            img = qr.make_image(fill_color="black", back_color="white")
            W, H = img.size

            font = ImageFont.truetype("arial.ttf", 30)
            w, h = font.getsize(MAC)
            caption = MAC+"\n\n{}".format(str(mueb_id).center(32))

            finalImg = Image.new(
                'RGBA', (W+w+qr.border*qr.box_size, H), 'white')
            finalImg.paste(img)

            draw = ImageDraw.Draw(finalImg)
            draw.text((W, (H-(qr.border*qr.box_size))/2),
                      caption, "black", font)

            finalImg.show()
            finalImg.save("{}.png".format(mueb_id))
            qr.clear()

        prev_MAC = MAC


def main():
    with socketserver.UDPServer(('', 67), UDPHandler) as server:
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            conn.close()


if __name__ == '__main__':
    main()