# edited by glg
from PySide6.QtCore import Qt
from PySide6.QtGui import QKeySequence, QShortcut
from PySide6.QtWidgets import (
    QLabel,
    QPushButton,
    QSizePolicy,
    QStackedWidget,
    QVBoxLayout,
    QWidget,
)


class DashboardLayoutBuilderService:
    @staticmethod
    def setup_sidebar(
        window,
        *,
        sidebar_btn_height: int,
        sidebar_spacing: int,
        sidebar_margin: int,
        sidebar_width: int,
    ):
        window.menu_buttons = {
            "Beranda": QPushButton("\U0001F3E0 Beranda"),
            "Penjualan": QPushButton("\U0001F4B0 Penjualan"),
            "Sinkronkan Data": QPushButton("\U0001F504 Sinkronisasi"),
            "Setting Printer": QPushButton("\u2699\ufe0f Pengaturan"),
            "Logout": QPushButton("\U0001F6AA Logout"),
        }

        sidebar_layout = QVBoxLayout()
        for btn in window.menu_buttons.values():
            # edited by glg
            # Gunakan minimum height agar sidebar responsif saat resolusi berubah.
            btn.setMinimumHeight(sidebar_btn_height)
            btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
            btn.setStyleSheet(
                """
                QPushButton {
                    background-color: #1D8348;
                    color: white;
                    font-weight: bold;
                    border: none;
                    text-align: left;
                    padding: 8px 12px;
                }
                QPushButton:hover {
                    background-color: #239B56;
                }
                """
            )
            sidebar_layout.addWidget(btn)

        sidebar_layout.setSpacing(sidebar_spacing)
        sidebar_layout.setContentsMargins(
            sidebar_margin,
            sidebar_margin,
            sidebar_margin,
            sidebar_margin,
        )
        sidebar_layout.setAlignment(Qt.AlignTop)
        sidebar_layout.addStretch()

        sidebar_widget = QWidget()
        sidebar_widget.setLayout(sidebar_layout)
        # edited by glg
        # Lebar sidebar wajib cukup lebar (berdasarkan config) agar teks/menu tidak terasa sempit.
        resolved_sidebar_width = max(
            int(sidebar_width or 0),
            int(sidebar_widget.sizeHint().width()) + 8,
        )
        sidebar_widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
        sidebar_widget.setFixedWidth(resolved_sidebar_width)
        sidebar_widget.setStyleSheet("background-color: #145A32;")
        window.sidebar_widget = sidebar_widget
        return sidebar_widget

    @staticmethod
    def setup_content_area(window):
        window.content_area = QStackedWidget()

        window.welcome_label = QLabel("")
        window.content_area.addWidget(window.welcome_label)

        window.dashboard_info = window.dashboard_controller.create_dashboard_info_controller()
        window.content_area.addWidget(window.dashboard_info.get_view())

        if hasattr(window, "build_customer_setup_widget"):
            window.customer_setup_widget = window.build_customer_setup_widget()
        else:
            window.customer_setup_widget = None

        if hasattr(window, "build_barang_setup_widget"):
            (
                window.barang_setup_controller,
                window.barang_setup_widget,
            ) = window.build_barang_setup_widget()
        else:
            window.barang_setup_controller = None
            window.barang_setup_widget = None

        # edited by glg
        # Lazy-init: modul transaksi dimuat saat pertama kali menu Penjualan dibuka.
        window.transaksi_controller = None
        window.transaksi_view = None

        window.content_area.setCurrentWidget(window.dashboard_info.get_view())
        return window.content_area

    @staticmethod
    def bind_menu_actions(window):
        window.menu_buttons["Beranda"].clicked.connect(lambda: window.navigate_to_page("beranda"))
        window.menu_buttons["Penjualan"].clicked.connect(window.buka_penjualan)
        window.menu_buttons["Sinkronkan Data"].clicked.connect(window.buka_menu_sinkron_data)
        window.menu_buttons["Setting Printer"].clicked.connect(window.buka_pengaturan_printer)
        window.menu_buttons["Logout"].clicked.connect(window.logout)

    @staticmethod
    def bind_shortcuts(window):
        QShortcut(QKeySequence("Ctrl+F"), window).activated.connect(window.buka_penjualan)

        shortcut_home = QShortcut(QKeySequence("F12"), window)
        shortcut_home.setContext(Qt.ApplicationShortcut)
        shortcut_home.activated.connect(window.buka_penjualan)

        QShortcut(QKeySequence("Ctrl+B"), window).activated.connect(
            lambda: window.navigate_to_page("beranda")
        )
        QShortcut(QKeySequence("Ctrl+L"), window).activated.connect(window.logout)
