from PySide6.QtCore import Qt
from PySide6.QtWidgets import (
    QAbstractItemView,
    QDialog,
    QHBoxLayout,
    QHeaderView,
    QLabel,
    QLineEdit,
    QMessageBox,
    QPushButton,
    QSizePolicy,
    QTableWidget,
    QTableWidgetItem,
    QVBoxLayout,
)


class SettlementDetailView:
    def __init__(self, parent):
        self.parent = parent

    def _format_rupiah(self, nilai):
        try:
            return f"{float(nilai):,.0f}"
        except Exception:
            return "0"

    def show_transaksi_detail(self, tanggal, kasir, detail_list, on_select_transaksi=None):
        dialog = QDialog(self.parent)
        dialog.setWindowTitle(f"Detail Transaksi - {tanggal} ({kasir})")
        dialog.setMinimumWidth(980)
        dialog.setMinimumHeight(520)

        layout = QVBoxLayout()
        header_label = QLabel(
            f"<b>Tanggal:</b> {tanggal}<br><b>Kasir:</b> {kasir}<br><b>Total Transaksi:</b> {len(detail_list)}"
        )
        header_label.setStyleSheet("padding: 10px; background: #f0f0f0; border-radius: 5px;")
        layout.addWidget(header_label)

        table = QTableWidget()
        table.setColumnCount(7)
        table.setHorizontalHeaderLabels(["ID", "Nomor", "Waktu", "Kasir", "Customer", "Total", "Metode"])
        table.setRowCount(len(detail_list))
        table.setEditTriggers(QTableWidget.NoEditTriggers)
        table.setSelectionBehavior(QTableWidget.SelectRows)
        table.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        table.setWordWrap(False)
        table.setTextElideMode(Qt.ElideNone)
        table.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
        table.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        header = table.horizontalHeader()
        header.setSectionResizeMode(QHeaderView.Stretch)
        header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(2, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(6, QHeaderView.ResizeToContents)
        header.setStretchLastSection(True)

        transaksi_id_map = {}
        for row, detail in enumerate(detail_list):
            transaksi_id = str(detail.get("id", "") or "")
            transaksi_id_map[row] = transaksi_id
            table.setItem(row, 0, QTableWidgetItem(transaksi_id))
            table.setItem(row, 1, QTableWidgetItem(str(detail.get("nomer", ""))))
            table.setItem(row, 2, QTableWidgetItem(str(detail.get("waktu", ""))))
            table.setItem(row, 3, QTableWidgetItem(str(detail.get("kasir", "-"))))
            table.setItem(row, 4, QTableWidgetItem(str(detail.get("customer", "Tunai"))))
            table.setItem(row, 5, QTableWidgetItem(self._format_rupiah(detail.get("total", 0))))
            table.setItem(row, 6, QTableWidgetItem(str(detail.get("metode", "Tunai"))))

        if callable(on_select_transaksi):
            def handle_row_click(row_idx, _col):
                transaksi_id = transaksi_id_map.get(row_idx)
                if not transaksi_id:
                    return
                try:
                    on_select_transaksi(int(transaksi_id))
                except Exception:
                    return

            table.cellClicked.connect(handle_row_click)

        layout.addWidget(table)

        close_button = QPushButton("Tutup")
        close_button.clicked.connect(dialog.close)
        layout.addWidget(close_button)
        dialog.setLayout(layout)
        dialog.exec()

    def show_transaksi_item_detail(self, transaksi_id, detail_list):
        dialog = QDialog(self.parent)
        dialog.setWindowTitle(f"Detail Item Transaksi - ID {transaksi_id}")
        dialog.setMinimumWidth(900)
        dialog.setMinimumHeight(520)
        layout = QVBoxLayout()
        header_label = QLabel(f"<b>ID Transaksi:</b> {transaksi_id}<br><b>Total Item:</b> {len(detail_list)}")
        header_label.setStyleSheet("padding: 10px; background: #f0f0f0; border-radius: 5px;")
        layout.addWidget(header_label)

        table = QTableWidget()
        table.setColumnCount(3)
        table.setHorizontalHeaderLabels(["Produk", "Qty", "Total"])
        table.setRowCount(len(detail_list))
        table.setEditTriggers(QTableWidget.NoEditTriggers)
        table.setSelectionBehavior(QTableWidget.SelectRows)
        table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        for row, detail in enumerate(detail_list):
            table.setItem(row, 0, QTableWidgetItem(str(detail.get("nama", "-"))))
            table.setItem(row, 1, QTableWidgetItem(str(detail.get("jumlah", 0))))
            table.setItem(row, 2, QTableWidgetItem(self._format_rupiah(detail.get("total", 0))))
        layout.addWidget(table)

        close_button = QPushButton("Tutup")
        close_button.clicked.connect(dialog.close)
        layout.addWidget(close_button)
        dialog.setLayout(layout)
        dialog.exec()

    def show_history_detail(self, history_data, detail_list):
        dialog = QDialog(self.parent)
        dialog.setWindowTitle("Detail Settlement")
        dialog.setMinimumWidth(980)
        dialog.setMinimumHeight(560)
        layout = QVBoxLayout()

        header_text = (
            f"<b>Tanggal:</b> {history_data.get('tanggal', '-')}"
            f"<br><b>Admin:</b> {history_data.get('admin', '-')}"
            f"<br><b>Kasir:</b> {history_data.get('kasir', '-')}"
            f"<br><b>Jumlah Transaksi:</b> {len(detail_list)}"
            f"<br><b>Disetor (Tunai):</b> Rp {self._format_rupiah(history_data.get('total_disetor', 0))}"
            f"<br><b>Non Tunai:</b> Rp {self._format_rupiah(history_data.get('total_non_tunai', 0))}"
        )
        header_label = QLabel(header_text)
        header_label.setStyleSheet("padding: 10px; background: #f0f0f0; border-radius: 5px;")
        layout.addWidget(header_label)

        table = QTableWidget()
        table.setColumnCount(6)
        table.setHorizontalHeaderLabels(["ID", "Nomor", "Waktu", "Kasir", "Total", "Metode"])
        table.setRowCount(len(detail_list))
        table.setEditTriggers(QTableWidget.NoEditTriggers)
        table.setSelectionBehavior(QTableWidget.SelectRows)
        table.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        table.setWordWrap(False)
        table.setTextElideMode(Qt.ElideNone)
        table.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
        table.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        header = table.horizontalHeader()
        header.setSectionResizeMode(QHeaderView.Stretch)
        header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(2, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(5, QHeaderView.ResizeToContents)
        header.setStretchLastSection(True)

        for row, detail in enumerate(detail_list):
            table.setItem(row, 0, QTableWidgetItem(str(detail.get("id", ""))))
            table.setItem(row, 1, QTableWidgetItem(str(detail.get("nomer", ""))))
            table.setItem(row, 2, QTableWidgetItem(str(detail.get("dtime", ""))))
            table.setItem(row, 3, QTableWidgetItem(str(detail.get("oleh_nama", ""))))
            table.setItem(row, 4, QTableWidgetItem(self._format_rupiah(detail.get("transaksi_nilai", 0))))
            table.setItem(row, 5, QTableWidgetItem(str(detail.get("bank_nama", "Tunai"))))
        layout.addWidget(table)

        close_button = QPushButton("Tutup")
        close_button.clicked.connect(dialog.close)
        layout.addWidget(close_button)
        dialog.setLayout(layout)
        dialog.exec()

    def ask_settlement_preview(self, total_disetor, total_non_tunai):
        dialog = QDialog(self.parent)
        dialog.setWindowTitle("Preview Settlement")
        layout = QVBoxLayout()
        label = QLabel(
            "<b>Konfirmasi Settlement</b><br>"
            f"Tunai disetor: Rp {self._format_rupiah(total_disetor)}<br>"
            f"Non tunai: Rp {self._format_rupiah(total_non_tunai)}"
        )
        label.setTextFormat(Qt.RichText)
        layout.addWidget(label)
        button_layout = QHBoxLayout()
        cancel_button = QPushButton("BATAL")
        lanjut_button = QPushButton("LANJUTKAN")
        button_layout.addStretch()
        button_layout.addWidget(cancel_button)
        button_layout.addWidget(lanjut_button)
        layout.addLayout(button_layout)
        dialog.setLayout(layout)
        cancel_button.clicked.connect(dialog.reject)
        lanjut_button.clicked.connect(dialog.accept)
        return dialog.exec() == QDialog.Accepted

    def ask_admin_verification(self, validate_admin_callback):
        dialog = QDialog(self.parent)
        dialog.setWindowTitle("Verifikasi Admin")
        layout = QVBoxLayout()
        layout.addWidget(QLabel("Admin:"))
        admin_input = QLineEdit()
        admin_input.setPlaceholderText("Masukkan username admin (nama_login)")
        layout.addWidget(admin_input)
        layout.addWidget(QLabel("Password:"))
        password_input = QLineEdit()
        password_input.setEchoMode(QLineEdit.Password)
        password_input.setPlaceholderText("Masukkan password admin")
        layout.addWidget(password_input)
        button_layout = QHBoxLayout()
        cancel_button = QPushButton("BATAL")
        lanjut_button = QPushButton("LANJUTKAN")
        button_layout.addStretch()
        button_layout.addWidget(cancel_button)
        button_layout.addWidget(lanjut_button)
        layout.addLayout(button_layout)
        dialog.setLayout(layout)
        cancel_button.clicked.connect(dialog.reject)

        def handle_lanjutkan():
            admin_name = admin_input.text().strip()
            password = password_input.text()
            ok, message = validate_admin_callback(admin_name, password)
            if not ok:
                QMessageBox.warning(dialog, "Validasi", message)
                return
            dialog.accept()

        lanjut_button.clicked.connect(handle_lanjutkan)
        lanjut_button.setDefault(True)
        lanjut_button.setAutoDefault(True)
        if dialog.exec() == QDialog.Accepted:
            return admin_input.text().strip()
        return None
