import tkinter as tk
from tkinter import ttk, messagebox
import postnl_api
import bol_api
import logging
import sys
import sqlite3
import os
import webbrowser

# Logging
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('gui_orders.log'),
        logging.StreamHandler(sys.stdout)
    ]
)

DB_PATH = "labels.db"

def init_db():
    conn = sqlite3.connect(DB_PATH)
    c = conn.cursor()
    c.execute('''
        CREATE TABLE IF NOT EXISTS labels (
            order_number TEXT,
            label_type TEXT,
            barcode TEXT,
            name TEXT,
            city TEXT,
            pdf_path TEXT
        )
    ''')
    conn.commit()
    conn.close()

class ShippingLabelApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Verzendlabels")

        init_db()

        logging.info("Start GUI en haal orders op...")
        self.orders = bol_api.get_bol_orders()
        logging.info(f"Aantal orders geladen uit API: {len(self.orders)}")

        self.selected_order = tk.StringVar()
        self.shipping_method = tk.StringVar()

        ttk.Label(root, text="Selecteer bestelling:").grid(row=0, column=0, sticky="w")
        self.order_combo = ttk.Combobox(root, textvariable=self.selected_order, state="readonly", width=50)
        self.order_combo.grid(row=0, column=1, padx=5, pady=5)
        self.order_combo.bind("<<ComboboxSelected>>", self.fill_fields)

        ttk.Label(root, text="Selecteer verzendmethode:").grid(row=1, column=0, sticky="w")
        self.shipping_method_combo = ttk.Combobox(
            root,
            textvariable=self.shipping_method,
            state="readonly",
            width=50,
            values=[
                "PostNL brievenbus NL",
                "PostNL pakket NL",
                "PostNL pakket BE",
                "DHL brievenbus NL",
                "DHL pakket NL",
                "DHL pakket BE"
            ]
        )
        self.shipping_method_combo.grid(row=1, column=1, padx=5, pady=5)
        self.shipping_method_combo.current(0)

        self.entries = {}
        fields = [
            ("Voornaam", "firstName"),
            ("Achternaam", "surname"),
            ("Straatnaam", "streetName"),
            ("Huisnummer", "houseNumber"),
            ("Toevoeging", "houseNumberExtension"),
            ("Postcode", "zipCode"),
            ("Plaats", "city"),
            ("Landcode (NL/BE)", "countryCode")
        ]

        for idx, (label_text, key) in enumerate(fields, start=2):
            label = ttk.Label(root, text=label_text)
            label.grid(row=idx, column=0, sticky="w")
            entry = ttk.Entry(root)
            entry.grid(row=idx, column=1, padx=5, pady=5)
            self.entries[key] = entry

        ttk.Button(root, text="Maak verzendlabel", command=self.maak_label).grid(row=len(fields)+2, columnspan=2, pady=10)
        ttk.Button(root, text="Bekijk oude orders", command=self.bekijk_oude_orders).grid(row=len(fields)+3, columnspan=2, pady=5)

        self.load_orders()

    def load_orders(self):
        self.order_map = {}
        for o in self.orders:
            order_id = o.get('orderId', 'unknown')
            status = o.get('status', 'unknown')
            key = f"{order_id} (Status: {status})"
            self.order_map[key] = o
        if not self.order_map:
            self.order_combo['values'] = ["Geen orders beschikbaar"]
            self.order_combo.current(0)
            self.order_combo.config(state="disabled")
            logging.warning("Geen orders beschikbaar om te tonen in GUI.")
        else:
            self.order_combo['values'] = list(self.order_map.keys())
            self.order_combo.config(state="readonly")
            logging.info(f"Orders geladen in combobox: {list(self.order_map.keys())}")

    def fill_fields(self, event):
        selected = self.selected_order.get()
        logging.info(f"Geselecteerde order: {selected}")
        order = self.order_map.get(selected)
        if not order:
            logging.warning(f"Geen order gevonden bij selectie: {selected}")
            for key in self.entries:
                self.entries[key].delete(0, tk.END)
            return

        _, adres = bol_api.find_shipping_address(order)
        if not adres:
            messagebox.showwarning("Geen adres", "Deze order heeft geen verzendadres beschikbaar.")
            for key in self.entries:
                self.entries[key].delete(0, tk.END)
            return

        mapping = {
            "firstName": adres.get("firstName", ""),
            "surname": adres.get("surname", ""),
            "streetName": adres.get("streetName", ""),
            "houseNumber": str(adres.get("houseNumber", "")),
            "houseNumberExtension": adres.get("houseNumberExtension", ""),
            "zipCode": adres.get("zipCode", ""),
            "city": adres.get("city", ""),
            "countryCode": adres.get("countryCode", "NL").upper()
        }
        for key, val in mapping.items():
            self.entries[key].delete(0, tk.END)
            self.entries[key].insert(0, val)

    def maak_label(self):
        ontvanger = {k: e.get() for k, e in self.entries.items()}
        ontvanger['countryCode'] = ontvanger.get('countryCode', 'NL').upper()
        try:
            ontvanger['houseNumber'] = int(ontvanger['houseNumber'])
        except ValueError:
            messagebox.showerror("Fout", "Huisnummer moet een getal zijn.")
            return

        selected = self.selected_order.get()
        order = self.order_map.get(selected)
        if order:
            ontvanger['orderNumber'] = order.get('orderId', 'unknown')
        else:
            ontvanger['orderNumber'] = 'unknown'

        method = self.shipping_method.get()

        if method.startswith("PostNL"):
            is_brievenbuspakje = "brievenbus" in method.lower()
            barcode, pdf_path = postnl_api.create_shipping_label(ontvanger, is_brievenbuspakje, return_barcode=True)
        elif method.startswith("DHL"):
            try:
                import dhl
                is_brievenbuspakje = "brievenbus" in method.lower()
                barcode, pdf_path = dhl.create_shipping_label(ontvanger, is_brievenbuspakje)
            except ImportError:
                messagebox.showerror("Fout", "DHL module nog niet geïmplementeerd.")
                logging.error("DHL module niet gevonden.")
                return
        else:
            messagebox.showerror("Fout", "Onbekende verzendmethode geselecteerd.")
            return

        if barcode:
            self.opslaan_in_db(ontvanger, method, barcode, pdf_path)
            messagebox.showinfo("Gelukt", "Verzendlabel succesvol aangemaakt en opgeslagen.")
        else:
            messagebox.showerror("Mislukt", "Er is iets misgegaan bij het aanmaken van het label.")

    def opslaan_in_db(self, ontvanger, label_type, barcode, pdf_path):
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        naam = f"{ontvanger.get('firstName', '')} {ontvanger.get('surname', '')}".strip()
        c.execute("INSERT INTO labels VALUES (?, ?, ?, ?, ?, ?)", (
            ontvanger.get('orderNumber', 'unknown'),
            label_type,
            barcode,
            naam,
            ontvanger.get('city', ''),
            pdf_path
        ))
        conn.commit()
        conn.close()

    def bekijk_oude_orders(self):
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute("SELECT order_number, label_type, barcode, name, city, pdf_path FROM labels")
        records = c.fetchall()
        conn.close()

        if not records:
            messagebox.showinfo("Info", "Geen oude orders in database.")
            return

        top = tk.Toplevel(self.root)
        top.title("Oude orders")

        tree = ttk.Treeview(top, columns=("order", "type", "barcode", "name", "city", "pdf"), show="headings")
        tree.heading("order", text="Ordernummer")
        tree.heading("type", text="Labeltype")
        tree.heading("barcode", text="Barcode")
        tree.heading("name", text="Naam")
        tree.heading("city", text="Woonplaats")
        tree.heading("pdf", text="PDF pad")

        for r in records:
            tree.insert("", tk.END, values=r)

        tree.pack(fill="both", expand=True)

        def print_label():
            item = tree.selection()
            if item:
                pdf_path = tree.item(item, "values")[5]
                if os.path.exists(pdf_path):
                    webbrowser.open(pdf_path)
                else:
                    messagebox.showerror("Fout", f"Bestand niet gevonden: {pdf_path}")
            else:
                messagebox.showwarning("Selectie", "Selecteer een order om te printen.")

        ttk.Button(top, text="Print geselecteerd label", command=print_label).pack(pady=5)

def main():
    root = tk.Tk()
    app = ShippingLabelApp(root)
    root.mainloop()

if __name__ == '__main__':
    main()
