from model import ItemFactory

class ControllerPerpustakaan:
    """
    Controller dalam MVC + Observer.
    Tugasnya hanya memvalidasi input dan memanggil Model.
    Update View terjadi otomatis via Observer pattern.
    """
    def __init__(self, model, view):
        self.model = model
        self.view = view
        
        # Registrasi View sebagai Observer dari Model
        self.model.add_observer(self.view)
        
        # Trigger refresh awal
        self.model.refresh_data()

    def force_refresh(self):
        self.model.refresh_data()

    def add_member(self, nama, alamat):
        if not nama or not alamat:
            self.view.show_message("Error", "Data tidak lengkap", True)
            return
            
        from model import Member
        new_member = Member(nama, alamat)
        self.model.add_member(new_member) # Model akan notify View
        self.view.show_message("Sukses", f"Member {nama} berhasil ditambahkan")
        self.view.clear_forms()

    def add_item(self, tipe, item_id, judul, **kwargs):
        if not item_id or not judul:
            self.view.show_message("Error", "Data item tidak lengkap", True)
            return

        try:
            new_item = ItemFactory.create_item(tipe, item_id, judul, **kwargs)
            self.model.add_item(new_item) # Model akan notify View
            self.view.show_message("Sukses", "Item berhasil ditambahkan")
            self.view.clear_forms()
        except Exception as e:
            self.view.show_message("Error", str(e), True)

    def pinjam_item(self, member_id, item_id):
        if not member_id or not item_id:
            self.view.show_message("Error", "Pilih Member dan Item", True)
            return

        try:
            trx = self.model.create_transaction(member_id, item_id) # Model notify View
            self.view.show_message("Sukses", f"Transaksi {trx.transaksi_id} dibuat")
            self.view.clear_forms()
        except ValueError as e:
            self.view.show_message("Gagal", str(e), True)
        except Exception as e:
            self.view.show_message("Error", str(e), True)

    def kembalikan_item(self, trx_id):
        if not trx_id:
            self.view.show_message("Error", "Pilih Transaksi", True)
            return

        try:
            trx = self.model.return_transaction(trx_id) # Model notify View
            denda = trx.denda
            msg = "Pengembalian Sukses."
            if denda > 0:
                msg += f"\nTotal Denda: Rp{denda:,.2f}"
            
            self.view.show_message("Sukses", msg)
            self.view.clear_forms()
        except ValueError as e:
            self.view.show_message("Gagal", str(e), True)

    def save_and_exit(self):
        try:
            self.model.save_data()
            self.view.show_message("Info", "Data tersimpan. Keluar aplikasi.")
            self.view.root.destroy()
        except Exception as e:
            self.view.show_message("Error", f"Gagal menyimpan: {e}", True)