﻿from PySide6.QtWidgets import (
    QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButton, QComboBox,
    QFormLayout, QTextEdit, QHBoxLayout, QSpacerItem, QSizePolicy, QProgressDialog, QSystemTrayIcon, QApplication
)
from PySide6.QtGui import QFont, QIcon, QIntValidator
from PySide6.QtCore import Qt, QTimer

from pypos.core.base_view import BaseView
from pypos.modules.auth.config.auth_config import get_auth_dialog_config
from pypos.modules.auth.controllers.device_registration_controller import DeviceRegistrationController


class DeviceRegistrationDialog(BaseView, QDialog):
    def __init__(self, parent=None, cabang_list=None):
        super().__init__(parent)
        self.controller = DeviceRegistrationController(self)
        # edited by glg
        self.result_payload = {}
        self.setWindowTitle("Registrasi Device")
        cfg = get_auth_dialog_config()
        min_w = int(cfg.get("device_reg_min_width") or 480)
        max_w = int(cfg.get("device_reg_max_width") or 800)
        self.setMinimumWidth(min_w)
        self.setMaximumWidth(max_w)
        self.setModal(True)

        base_font = QFont("Segoe UI", 9)
        self.setFont(base_font)
        self.setStyleSheet(
            "QDialog { background: #f7f9fb; }"
            "QLabel { color: #333; }"
            "QLineEdit, QTextEdit, QComboBox {"
            "border: 1px solid #cfd8e3;"
            "border-radius: 6px;"
            "padding: 6px;"
            "background: #ffffff;"
            "}"
            "QPushButton {"
            "padding: 6px 12px;"
            "border-radius: 6px;"
            "}"
            "QPushButton#submit {"
            "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #4caf50, stop:1 #43a047);"
            "color: white;"
            "}"
            "QPushButton#search_store {"
            "background: #1976d2;"
            "color: white;"
            "}"
            "QPushButton#cancel {"
            "background: #e0e6ef;"
            "}"
        )

        main_layout = QVBoxLayout(self)
        form = QFormLayout()
        form.setLabelAlignment(Qt.AlignLeft)
        form.setFormAlignment(Qt.AlignTop)

        self.input_web_admin = QLineEdit()
        self.input_web_admin.setPlaceholderText("Contoh: https://demo.mayagrahakencana.com")
        self.input_web_admin.setText("")
        self.input_web_admin.setToolTip("Alamat Web Admin untuk koneksi API pusat.")
        form.addRow(QLabel("Web Admin *"), self.input_web_admin)

        self.input_toko_id = QLineEdit()
        self.input_toko_id.setPlaceholderText("Contoh: 1")
        self.input_toko_id.setValidator(QIntValidator(1, 2147483647, self))
        self.input_toko_id.setText("")
        self.input_toko_id.setToolTip("ID toko dari Web Admin.")
        form.addRow(QLabel("Toko ID *"), self.input_toko_id)

        self.btn_search_store = QPushButton("Cari Toko")
        self.btn_search_store.setObjectName("search_store")
        self.btn_search_store.clicked.connect(self.cari_toko)
        form.addRow(QLabel(""), self.btn_search_store)

        self.input_alias = QLineEdit()
        self.input_alias.setPlaceholderText("Contoh: KASIR 1 / KASIR A")
        self.input_alias.setMaxLength(64)
        self.input_alias.setToolTip("Nama alias untuk device ini, tampil di daftar device.")
        self.lbl_alias = QLabel("Alias *")
        form.addRow(self.lbl_alias, self.input_alias)

        self.input_nama = QLineEdit()
        self.input_nama.setPlaceholderText("Nama pengguna device (opsional)")
        self.input_nama.setMaxLength(128)
        self.lbl_nama = QLabel("Nama Pengguna")
        form.addRow(self.lbl_nama, self.input_nama)

        self.input_ket = QTextEdit()
        self.input_ket.setPlaceholderText("Keterangan singkat / lokasi / catatan")
        ket_h = int(cfg.get("device_reg_ket_height") or 80)
        # edited by glg
        # Hindari fixed-height agar text area tetap adaptif saat DPI/font berubah.
        self.input_ket.setMinimumHeight(ket_h)
        self.input_ket.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.MinimumExpanding)
        self.input_ket.setToolTip("Deskripsi singkat tentang device atau posisi di toko.")
        self.lbl_ket = QLabel("Keterangan *")
        form.addRow(self.lbl_ket, self.input_ket)

        self.combo_cabang = QComboBox()
        self.combo_cabang.setToolTip("Pilih cabang tempat device terpasang")
        self.combo_cabang.addItem("Klik 'Cari Toko' untuk memuat cabang", "")
        self.combo_cabang.setEnabled(False)
        self.lbl_cabang = QLabel("Cabang *")
        form.addRow(self.lbl_cabang, self.combo_cabang)

        self.info_device = QLineEdit()
        self.info_device.setReadOnly(True)
        self.info_device.setText(self.controller.get_device_summary())
        self.lbl_info_device = QLabel("Info Device")
        form.addRow(self.lbl_info_device, self.info_device)

        main_layout.addLayout(form)

        btn_layout = QHBoxLayout()
        btn_layout.setContentsMargins(0, 6, 0, 0)
        btn_layout.addItem(QSpacerItem(10, 10, QSizePolicy.Expanding, QSizePolicy.Minimum))

        self.btn_cancel = QPushButton("Batal")
        self.btn_cancel.setObjectName("cancel")
        self.btn_cancel.clicked.connect(self.reject)

        self.btn_submit = QPushButton("Kirim Registrasi")
        self.btn_submit.setObjectName("submit")
        self.btn_submit.clicked.connect(self.kirim_registrasi)

        btn_layout.addWidget(self.btn_cancel)
        btn_layout.addWidget(self.btn_submit)
        main_layout.addLayout(btn_layout)

        self.status_label = QLabel("")
        self.status_label.setStyleSheet("color: #666; font-size: 11px;")
        main_layout.addWidget(self.status_label)

        self.setLayout(main_layout)
        self._set_registration_fields_enabled(False)
        self._set_registration_fields_visible(False)
        self.input_web_admin.setFocus()

    def _set_registration_fields_enabled(self, enabled):
        self.input_alias.setEnabled(enabled)
        self.input_nama.setEnabled(enabled)
        self.input_ket.setEnabled(enabled)
        self.combo_cabang.setEnabled(enabled)
        self.btn_submit.setEnabled(enabled)

    def _set_registration_fields_visible(self, visible):
        self.lbl_alias.setVisible(visible)
        self.input_alias.setVisible(visible)
        self.lbl_nama.setVisible(visible)
        self.input_nama.setVisible(visible)
        self.lbl_ket.setVisible(visible)
        self.input_ket.setVisible(visible)
        self.lbl_cabang.setVisible(visible)
        self.combo_cabang.setVisible(visible)
        self.lbl_info_device.setVisible(visible)
        self.info_device.setVisible(visible)
        self.btn_submit.setVisible(visible)

    def _set_lookup_controls_enabled(self, enabled):
        self.input_web_admin.setEnabled(enabled)
        self.input_toko_id.setEnabled(enabled)
        self.btn_search_store.setEnabled(enabled)

    # edited by glg
    def load_branches(self, toko_id, branches=None):
        self.combo_cabang.clear()
        branch_options = branches
        if not isinstance(branch_options, list):
            branch_options = self.controller.load_branches(toko_id=toko_id)

        if branch_options:
            self.combo_cabang.addItem("Pilih Cabang", "")
            for name, branch_id in branch_options:
                self.combo_cabang.addItem(str(name), str(branch_id))
        else:
            self.combo_cabang.addItem("Tidak ada Cabang", "")

        self.combo_cabang.setEnabled(True)

    def cari_toko(self):
        web_admin_url = self.input_web_admin.text().strip()
        toko_id = self.input_toko_id.text().strip()

        self._set_lookup_controls_enabled(False)
        progress = QProgressDialog("Mencari cabang toko...", None, 0, 0, parent=self)
        progress.setWindowModality(Qt.WindowModal)
        progress.setCancelButton(None)
        progress.setMinimumDuration(150)
        progress.show()
        self.status_label.setText("Mengambil daftar cabang...")
        QApplication.processEvents()

        try:
            result = self.controller.search_store_branches(
                web_admin_url=web_admin_url,
                toko_id=toko_id,
            )
        finally:
            progress.close()
            self._set_lookup_controls_enabled(True)
            self.status_label.setText("")

        if result.get("ok"):
            if bool(result.get("auto_close")):
                self.result_payload = dict(result)
                title = "Status Device"
                if result.get("already_registered"):
                    title = "Device Sudah Terdaftar"
                elif result.get("pending_approval"):
                    title = "Menunggu Approval"
                self.show_info(title, str(result.get("message") or "Status device berhasil dicek."))
                self.accept()
                return

            self.load_branches(
                toko_id=toko_id,
                branches=result.get("branches"),
            )
            self._set_registration_fields_visible(True)
            self._set_registration_fields_enabled(True)
            self.input_alias.setFocus()
            info_text = str(result.get("message") or "Cabang berhasil dimuat.")
            self.show_info("Cari Toko", info_text)
            return

        self._set_registration_fields_visible(False)
        self._set_registration_fields_enabled(False)
        level = str(result.get("level") or "warning").lower()
        message = str(result.get("message") or "Cari toko gagal.")
        if level == "critical":
            self.show_error(message, title="Cari Toko Gagal")
            return
        self.show_warning("Cari Toko", message)

    def kirim_registrasi(self):
        alias = self.input_alias.text().strip()
        keterangan = self.input_ket.toPlainText().strip()
        cabang_nama = self.combo_cabang.currentText()
        cabang_id = self.combo_cabang.currentData()
        nama_pengguna = self.input_nama.text().strip()
        web_admin_url = self.input_web_admin.text().strip()
        toko_id = self.input_toko_id.text().strip()

        self.btn_submit.setEnabled(False)
        progress = QProgressDialog("Mengirim registrasi...", None, 0, 0, parent=self)
        progress.setWindowModality(Qt.WindowModal)
        progress.setCancelButton(None)
        progress.setMinimumDuration(150)
        progress.show()
        self.status_label.setText("Mengirim data ke server...")
        QApplication.processEvents()

        try:
            result = self.controller.submit_registration(
                alias=alias,
                keterangan=keterangan,
                cabang_nama=cabang_nama,
                cabang_id=cabang_id,
                nama_pengguna=nama_pengguna,
                web_admin_url=web_admin_url,
                toko_id=toko_id,
            )
        finally:
            progress.close()
            self.btn_submit.setEnabled(True)
            self.status_label.setText("")

        if result.get("ok"):
            self.result_payload = dict(result)
            title = "Sukses"
            if result.get("already_registered"):
                title = "Device Sudah Terdaftar"
            elif result.get("pending_approval"):
                title = "Menunggu Approval"
            self.show_info(title, result.get("message", "Registrasi berhasil."))
            try:
                self._show_notification("Registrasi Device", result.get("message", "Registrasi berhasil."))
            except (RuntimeError, TypeError, OSError):
                pass
            self.accept()
            return

        level = str(result.get("level") or "warning").lower()
        message = str(result.get("message") or "Registrasi gagal.")
        if level == "critical":
            self.show_error(message, title="Gagal")
            return
        self.show_warning("Input Kurang", message)

    def _show_notification(self, title: str, message: str, timeout: int = None):
        cfg = get_auth_dialog_config()
        if timeout is None:
            timeout = int(cfg.get("device_reg_notify_timeout") or 5000)

        if not QSystemTrayIcon.isSystemTrayAvailable():
            return

        tray = QSystemTrayIcon(self)
        try:
            icon = self.windowIcon() if not self.windowIcon().isNull() else QIcon()
        except (RuntimeError, TypeError):
            icon = QIcon()
        tray.setIcon(icon)
        tray.setVisible(True)
        tray.showMessage(title, message, icon, timeout)

        extra_delay = int(cfg.get("device_reg_notify_extra_delay") or 500)
        # edited by glg
        # Cleanup tray dipisah agar tidak mengandalkan return tuple dari lambda.
        def _cleanup_tray_icon():
            tray.hide()
            tray.deleteLater()

        QTimer.singleShot(timeout + extra_delay, _cleanup_tray_icon)
