﻿from pypos.core.base_controller import BaseController


class PrinterController(BaseController):
    def __init__(self, model, view):
        super().__init__()
        self.model = model
        self.view = view

        # isi list printer saat pertama kali buka
        self.load_printers()

        # sambungkan tombol
        self.view.btn_tambah.clicked.connect(self.tambah_printer)
        self.view.btn_simpan.clicked.connect(self.simpan_printer)
        self.view.btn_hapus.clicked.connect(self.hapus_printer)
        self.view.btn_set_default.clicked.connect(self.set_default_printer)
        self.view.btn_test.clicked.connect(self.test_printer)

        # kalau klik item list, isi form detail
        self.view.list_printer.itemClicked.connect(self.fill_form_from_list)

    def load_printers(self):
        self.view.list_printer.clear()
        printers = self.model.get_all()
        for p in printers:
            self.view.list_printer.addItem(f"{p['id']} - {p['nama']}")

    def fill_form_from_list(self, item):
        """Ketika user klik list, isi form detail"""
        text = item.text()
        printer_id = int(text.split(" - ")[0])
        printers = self.model.get_all()
        printer = next((p for p in printers if p["id"] == printer_id), None)
        if printer:
            self.view.input_nama.setText(printer["nama"])
            self.view.combo_koneksi.setCurrentText(printer["koneksi"])
            self.view.input_address.setText(printer.get("address") or "")
            self.view.combo_kertas.setCurrentText(str(printer["lebar_kertas"]))
            self.view.spin_margin.setValue(int(printer.get("margin", 0)))
            self.view.current_printer_id = printer_id
        else:
            self.view.current_printer_id = None

    def tambah_printer(self):
        data = {
            "nama": self.view.input_nama.text(),
            "koneksi": self.view.combo_koneksi.currentText(),
            "address": self.view.input_address.text(),
            "lebar_kertas": self.view.combo_kertas.currentText(),
            "margin": self.view.spin_margin.value(),
        }
        self.model.add_printer(data)
        self.show_info("Tambah", "Printer berhasil ditambahkan")
        self.load_printers()

    def simpan_printer(self):
        if not hasattr(self.view, "current_printer_id") or not self.view.current_printer_id:
            self.show_warning("Simpan", "Pilih printer dulu dari list!")
            return

        data = {
            "nama": self.view.input_nama.text(),
            "koneksi": self.view.combo_koneksi.currentText(),
            "address": self.view.input_address.text(),
            "lebar_kertas": self.view.combo_kertas.currentText(),
            "margin": self.view.spin_margin.value(),
        }
        self.model.update_printer(self.view.current_printer_id, data)
        self.show_info("Simpan", "Printer berhasil diperbarui")
        self.load_printers()

    def hapus_printer(self):
        if not hasattr(self.view, "current_printer_id") or not self.view.current_printer_id:
            self.show_warning("Hapus", "Pilih printer dulu dari list!")
            return

        self.model.delete_printer(self.view.current_printer_id)
        self.show_info("Hapus", "Printer berhasil dihapus")
        self.load_printers()
        self.view.current_printer_id = None

    def set_default_printer(self):
        if not hasattr(self.view, "current_printer_id") or not self.view.current_printer_id:
            self.show_warning("Set Default", "Pilih printer dulu dari list!")
            return

        self.model.set_default(self.view.current_printer_id)
        self.show_info("Default", "Printer berhasil dijadikan default")

    def test_printer(self):
        koneksi = self.view.combo_koneksi.currentText()
        address = self.view.input_address.text()

        success, msg = self.model.test_connection(koneksi, address)
        if success:
            self.show_info("Test Print", msg)
        else:
            self.show_warning("Test Print", msg)