﻿from pypos.core.base_view import BaseView
from PySide6.QtWidgets import (
    QDialog, QVBoxLayout, QHBoxLayout, QPushButton,
    QTableWidget, QTableWidgetItem, QLabel, QMessageBox, QDateEdit, QComboBox, QTextBrowser
)
from PySide6.QtCore import QDate, Qt, Signal
import logging

LOGGER = logging.getLogger(__name__)

# upgraded: inherit base class
class LoadTransaksiView(BaseView, QDialog):
    # edited by glg
    # Signal lintas-thread untuk payload daftar transaksi/preorder.
    list_payload_ready = Signal(int, object)
    # edited by glg
    # Signal lintas-thread untuk mengirim payload preview ke UI thread.
    preview_payload_ready = Signal(int, object)

    def __init__(self, controller):
        super().__init__()
        self.controller = controller
        self._list_payload_handler = None
        self._preview_payload_handler = None
        self.list_payload_ready.connect(self._on_list_payload_ready, Qt.QueuedConnection)
        self.preview_payload_ready.connect(self._on_preview_payload_ready, Qt.QueuedConnection)
        # edited by glg
        self.setWindowTitle("Load Transaksi / PreOrder")
        from pypos.core.utils.window_size_helper import set_window_size_by_screen
        set_window_size_by_screen(self, percent=0.7, min_size=(800, 520))

        self.layout = QVBoxLayout()


        self.table = QTableWidget(0, 5)
        self.table.setHorizontalHeaderLabels(["ID", "Nomer", "Tanggal","Customer", "Total Harga"])
        self.table.cellClicked.connect(self.controller.transaksi_diklik)
        from PySide6.QtWidgets import QHeaderView
        header = self.table.horizontalHeader()
        header.setSectionResizeMode(QHeaderView.Stretch)
        self.table.setProperty("class", "load-transaksi")
        self.layout.addWidget(self.table)
        self.preview_label = QLabel("\U0001F4DD Preview Detail Transaksi:")
        self.layout.addWidget(self.preview_label)
        self.info_transaksi_label = QTextBrowser()
        self.info_transaksi_label.setHtml("<p style='text-align:center; color:#999;'>Pilih transaksi untuk melihat detail</p>")
        self.info_transaksi_label.setReadOnly(True)
        self.info_transaksi_label.setOpenExternalLinks(False)
        self.info_transaksi_label.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.info_transaksi_label.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.info_transaksi_label.setLineWrapMode(QTextBrowser.WidgetWidth)
        self.info_transaksi_label.setTextInteractionFlags(Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard)
        self.info_transaksi_label.document().setDocumentMargin(0)
        self.info_transaksi_label.setMinimumHeight(150)
        self.info_transaksi_label.setMaximumHeight(250)
        self.info_transaksi_label.setStyleSheet("""
            QTextBrowser {
                border: 2px solid #28a745;
                border-radius: 5px;
                padding: 8px;
                background-color: white;
            }
            QTextBrowser QScrollBar:vertical {
                border: none;
                background: #f8f9fa;
                width: 8px;
                margin: 0px;
            }
            QTextBrowser QScrollBar::handle:vertical {
                background: #28a745;
                min-height: 20px;
                border-radius: 4px;
            }
            QTextBrowser QScrollBar::handle:vertical:hover {
                background: #218838;
            }
            QTextBrowser QScrollBar::add-line:vertical,
            QTextBrowser QScrollBar::sub-line:vertical {
                height: 0px;
            }
            QTextBrowser QScrollBar::add-page:vertical,
            QTextBrowser QScrollBar::sub-page:vertical {
                background: none;
            }
        """)
        self.layout.addWidget(self.info_transaksi_label)

        self.button_layout = QHBoxLayout()
        self.btn_load = QPushButton("\u2705 Load Transaksi")
        self.btn_load.setProperty("class", "load-action")
        self.btn_load.clicked.connect(self.controller.load_dipilih)
        self.btn_delete = QPushButton("Hapus Transaksi")
        self.btn_delete.setProperty("class", "load-delete")
        self.btn_delete.clicked.connect(self.controller.hapus_dipilih)
        self.btn_close = QPushButton("\U0001F6AA Close (ESC)")
        self.btn_close.setProperty("class", "load-close")
        self.btn_close.clicked.connect(self.reject)
        self.btn_close.setShortcut("Esc")
        self.button_layout.addWidget(self.btn_load)
        self.button_layout.addWidget(self.btn_delete)
        self.button_layout.addStretch()
        self.button_layout.addWidget(self.btn_close)

        self.layout.addLayout(self.button_layout)
        self.setLayout(self.layout)

    # edited by glg
    def set_list_payload_handler(self, handler):
        self._list_payload_handler = handler

    # edited by glg
    def emit_list_payload(self, request_id, payload):
        try:
            self.list_payload_ready.emit(int(request_id), payload)
        except Exception:
            return

    # edited by glg
    def _on_list_payload_ready(self, request_id, payload):
        if callable(self._list_payload_handler):
            self._list_payload_handler(int(request_id), payload)

    # edited by glg
    def set_preview_payload_handler(self, handler):
        self._preview_payload_handler = handler

    # edited by glg
    def emit_preview_payload(self, request_id, payload):
        try:
            self.preview_payload_ready.emit(int(request_id), payload)
        except Exception:
            return

    # edited by glg
    def _on_preview_payload_ready(self, request_id, payload):
        if callable(self._preview_payload_handler):
            self._preview_payload_handler(int(request_id), payload)

    def render_transaksi_list(self, rows):
        """Render daftar transaksi tersimpan/history ke tabel utama."""
        safe_rows = list(rows or [])
        # edited by glg
        # Render batch agar pembukaan dialog load transaksi lebih ringan untuk data besar.
        self.table.setUpdatesEnabled(False)
        self.table.blockSignals(True)
        self.table.setRowCount(len(safe_rows))
        try:
            for row, row_data in enumerate(safe_rows):
                values = row_data[:5] if isinstance(row_data, (list, tuple)) else []
                for col, val in enumerate(values):
                    self.table.setItem(row, col, QTableWidgetItem(str(val)))
        finally:
            self.table.blockSignals(False)
            self.table.setUpdatesEnabled(True)

    def warn_pilih_transaksi(self):
        QMessageBox.warning(self, "Pilih Transaksi", "Pilih transaksi untuk diload.")

    def reset_preview(self):
        self.info_transaksi_label.setHtml("<p style='text-align:center; color:#999;'>Pilih transaksi untuk melihat detail</p>")

    def tampilkan_preview_detail(self, detail_rows):
        """PATCH[FrontEndAgent|PreOrderPreview]: Tampilkan preview detail barang pre-order"""
        if not detail_rows:
            self.info_transaksi_label.setHtml("<p style='text-align:center; color:red;'>\u274C Tidak ada detail barang</p>")
            return

        def fmt_rp(nilai):
            if nilai is None:
                return "Rp 0,00"
            return f"Rp {float(nilai):,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")

        def fmt_qty(qty):
            q = float(qty)
            return str(int(q)) if q == int(q) else f"{q:.2f}"

        items_html = ""
        total_qty = 0
        total_nilai = 0

        for idx, item in enumerate(detail_rows, 1):
            try:
                kode = str(item[0])
                nama = str(item[1])
                harga = float(item[2])
                jumlah = float(item[3])
                # edited by glg
                # Legacy payload bisa menyimpan diskon item sebagai persen.
                # Jika <=100, interpretasi sebagai persen dari gross line.
                diskon_raw = float(item[4]) if item[4] else 0
                gross = harga * jumlah
                if 0 < diskon_raw <= 100 and gross > 0:
                    diskon_item = gross * (diskon_raw / 100.0)
                else:
                    diskon_item = diskon_raw
                subtotal = (harga * jumlah) - diskon_item
                satuan = item[5] if len(item) > 5 else ""

                total_qty += jumlah
                total_nilai += subtotal

                items_html += f"""
                <tr style='border-bottom: 1px solid #e9ecef;'>
                    <td style='padding: 6px 4px;'>{idx}</td>
                    <td style='padding: 6px 4px;'><b style='color: #004085;'>{kode}</b></td>
                    <td style='padding: 6px 4px;'>{nama}</td>
                    <td style='padding: 6px 4px;' align='right'>{fmt_rp(harga)}</td>
                    <td style='padding: 6px 4px;' align='center'><b>{fmt_qty(jumlah)}</b> {satuan}</td>
                    <td style='padding: 6px 4px;' align='right'>{fmt_rp(diskon_item) if diskon_item > 0 else '-'}</td>
                    <td style='padding: 6px 4px; background-color: #fff8dc;' align='right'><b style='color: #dc3545;'>{fmt_rp(subtotal)}</b></td>
                </tr>
                """
            except Exception as e:
                LOGGER.warning("Gagal parsing detail item ke-%s pada load transaksi: %s", idx, e)

        detail_html = f"""
        <div style='font-family: Segoe UI, Arial; font-size: 9pt;'>
            <div style='background-color: #d4edda; border: 2px solid #28a745; border-radius: 5px; padding: 10px; margin-bottom: 8px;'>
                <b style='color: #28a745; font-size: 10.5pt;'>\U0001F4E6 DAFTAR BARANG ({len(detail_rows)} item)</b>
                <span style='float: right; font-size: 9.5pt;'>
                    Total Qty: <b>{fmt_qty(total_qty)}</b> |
                    Total Nilai: <b style='color: #dc3545;'>{fmt_rp(total_nilai)}</b>
                </span>
            </div>
            <table width='100%' cellspacing='0' style='font-size: 9pt; table-layout: fixed; border-collapse: collapse; border: 2px solid #28a745;'>
                <thead>
                    <tr style='background-color: #28a745; color: white;'>
                        <th style='padding: 8px 4px; text-align: left; width: 5%;'>No</th>
                        <th style='padding: 8px 4px; text-align: left; width: 12%;'>Kode</th>
                        <th style='padding: 8px 4px; text-align: left; width: 33%;'>Nama Barang</th>
                        <th style='padding: 8px 4px; text-align: right; width: 13%;'>Harga</th>
                        <th style='padding: 8px 4px; text-align: center; width: 10%;'>Qty</th>
                        <th style='padding: 8px 4px; text-align: right; width: 12%;'>Diskon</th>
                        <th style='padding: 8px 4px; text-align: right; width: 15%;'>Subtotal</th>
                    </tr>
                </thead>
                <tbody style='background-color: white;'>
                    {items_html}
                </tbody>
            </table>
            <div style='background-color: #f8f9fa; border: 1px solid #dee2e6; border-radius: 5px; padding: 8px; margin-top: 8px;'>
                <table width='100%' style='font-size: 9pt;'>
                    <tr>
                        <td width='50%'><b>\U0001F4CA Total Item:</b></td>
                        <td width='50%' align='right'><b>{len(detail_rows)}</b></td>
                    </tr>
                    <tr>
                        <td><b>\U0001F4E6 Total Qty:</b></td>
                        <td align='right'><b>{fmt_qty(total_qty)}</b></td>
                    </tr>
                    <tr style='border-top: 2px solid #28a745;'>
                        <td style='padding-top: 4px;'><b style='font-size: 10pt;'>\U0001F4B0 TOTAL NILAI:</b></td>
                        <td align='right' style='padding-top: 4px;'><b style='font-size: 10pt; color: #dc3545;'>{fmt_rp(total_nilai)}</b></td>
                    </tr>
                </table>
            </div>
        </div>
        """

        self.info_transaksi_label.setHtml(detail_html)

    # edited by glg
    def tampilkan_preview_preorder_summary(self, preorder_item):
        data = preorder_item if isinstance(preorder_item, dict) else {}
        preorder_id = str(data.get("id") or "-")
        prefaktur = str(data.get("prefaktur") or f"PO-{preorder_id}")
        dtime_order = str(data.get("dtime_order") or "-")
        customer_nama = str(data.get("customer_nama") or "Tunai")
        sales_nama = str(data.get("sales_nama") or "-")
        nilai_transaksi = float(data.get("nilai_transaksi") or 0)
        otp_raw = str(data.get("otp") or "")
        otp_masked = "*" * max(0, len(otp_raw) - 2) + otp_raw[-2:] if otp_raw else "-"

        def fmt_rp(nilai):
            return f"Rp {float(nilai):,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")

        html = f"""
        <div style='font-family: Segoe UI, Arial; font-size: 9pt;'>
            <div style='background:#e7f1ff; border:1px solid #b6d4fe; border-radius:6px; padding:10px;'>
                <b style='font-size:10.5pt; color:#084298;'>PreOrder API Terpilih</b>
                <hr style='border:none; border-top:1px solid #cfe2ff; margin:8px 0;' />
                <table width='100%' style='font-size:9pt;'>
                    <tr><td width='35%'><b>ID PreOrder</b></td><td>: {preorder_id}</td></tr>
                    <tr><td><b>Prefaktur</b></td><td>: {prefaktur}</td></tr>
                    <tr><td><b>Tanggal Order</b></td><td>: {dtime_order}</td></tr>
                    <tr><td><b>Customer</b></td><td>: {customer_nama}</td></tr>
                    <tr><td><b>Sales</b></td><td>: {sales_nama}</td></tr>
                    <tr><td><b>OTP</b></td><td>: {otp_masked}</td></tr>
                    <tr><td><b>Nilai Transaksi</b></td><td>: <b style='color:#dc3545;'>{fmt_rp(nilai_transaksi)}</b></td></tr>
                </table>
                <p style='margin-top:8px; color:#495057;'>
                    Klik <b>Load Transaksi</b> untuk memproses pre-order ini melalui endpoint <code>use_preorder</code>.
                </p>
            </div>
        </div>
        """
        self.info_transaksi_label.setHtml(html)
