﻿from PySide6.QtWidgets import QHBoxLayout, QWidget, QTableWidgetItem

from pypos.core.base_controller import BaseController
from pypos.modules.penjualan.models.barang_model import BarangModel
from pypos.modules.penjualan.services.barang_service import BarangService
from pypos.modules.penjualan.views.barang_view import BarangView


class BarangController(BaseController):
    def __init__(self):
        super().__init__()
        self.model = BarangModel()
        self.service = BarangService(self.model)
        self.view = BarangView()
        self.bind_view(self.view)

        self.current_page = 0
        self.rows_per_page = 100
        self.current_edit_id = None

        self.view.submit_button.clicked.connect(self.save_barang)
        self.view.search_button.clicked.connect(self.search)
        self.view.prev_button.clicked.connect(self.prev_page)
        self.view.next_button.clicked.connect(self.next_page)

        self.load_data()

    def get_view(self):
        return self.view

    def search(self):
        self.current_page = 0
        self.load_data(self.view.search_input.text())

    def prev_page(self):
        if self.current_page > 0:
            self.current_page -= 1
            self.load_data(self.view.search_input.text())

    def next_page(self):
        self.current_page += 1
        self.load_data(self.view.search_input.text())

    def load_data(self, search_term=None):
        page_data = self.service.get_page(self.current_page, self.rows_per_page, search_term)
        self.current_page = page_data["page"]

        rows = page_data["rows"]
        self.view.table.setRowCount(0)

        for row_idx, row in enumerate(rows):
            self.view.table.insertRow(row_idx)
            for col_idx, val in enumerate(row):
                self.view.table.setItem(row_idx, col_idx, QTableWidgetItem(str(val)))

            edit_btn = self.view.create_action_button("Edit", lambda _, pid=row[0]: self.load_for_edit(pid))
            del_btn = self.view.create_action_button("Hapus", lambda _, pid=row[0]: self.delete_barang(pid))

            action_widget = QWidget()
            action_layout = QHBoxLayout(action_widget)
            action_layout.addWidget(edit_btn)
            action_layout.addWidget(del_btn)
            action_layout.setContentsMargins(0, 0, 0, 0)
            self.view.table.setCellWidget(row_idx, 6, action_widget)

    def load_for_edit(self, produk_id):
        data = self.service.get_barang_by_id(produk_id)
        if not data:
            return

        self.view.nama_input.setText(data[1])
        self.view.hpp_input.setText(str(data[2]))
        self.view.harga_jual_input.setText(str(data[3]))
        self.view.deskripsi_input.setText(data[4])
        self.view.diskon_input.setText(str(data[5]))
        self.current_edit_id = produk_id
        self.view.submit_button.setText("Simpan Perubahan")

    def delete_barang(self, produk_id):
        if not self.view.show_confirm("Konfirmasi", "Yakin ingin menghapus barang ini?"):
            return

        try:
            self.service.delete_barang(produk_id)
            self.show_info("Sukses", "Barang berhasil dihapus.", view=self.view)
            self.load_data(self.view.search_input.text())
        except Exception:
            self.show_error("Gagal", "Gagal menghapus barang. Silakan coba lagi.", view=self.view)

    def save_barang(self):
        nama = self.view.nama_input.text()
        hpp = self.view.hpp_input.text()
        harga_jual = self.view.harga_jual_input.text()
        deskripsi = self.view.deskripsi_input.text()
        diskon = self.view.diskon_input.text() or "0"

        try:
            result = self.service.save_barang(
                self.current_edit_id,
                nama,
                hpp,
                harga_jual,
                deskripsi,
                diskon,
            )
            self.current_edit_id = result.get("next_edit_id")
            self.clear_form()
            self.show_info("Berhasil", result.get("message", "Berhasil menyimpan data barang."), view=self.view)
            self.load_data(self.view.search_input.text())
        except ValueError as exc:
            self.show_warning("Validasi", str(exc), view=self.view)
        except Exception:
            self.show_error("Gagal", "Terjadi kesalahan saat menyimpan data barang.", view=self.view)

    def clear_form(self):
        self.view.nama_input.clear()
        self.view.hpp_input.clear()
        self.view.harga_jual_input.clear()
        self.view.deskripsi_input.clear()
        self.view.diskon_input.clear()
        self.current_edit_id = None
        self.view.submit_button.setText("Tambah Barang")
