from pypos.core.base_controller import BaseController
from pypos.modules.printer.services.printer_settings_facade_service import PrinterSettingsFacadeService
from pypos.modules.scanner.controllers.scanner_controller import ScannerController
from pypos.modules.settings.services.history_settings_service import HistorySettingsService
from pypos.modules.settings.services.penjualan_settings_service import PenjualanSettingsService
from pypos.modules.settings.services.printer_settings_service import PrinterSettingsService


class SettingsController(BaseController):
    def __init__(self, scanner_controller=None):
        super().__init__()
        self.printer_facade_service = PrinterSettingsFacadeService()
        self.printer_settings_service = PrinterSettingsService(
            printer_facade_service=self.printer_facade_service
        )
        self.history_settings_service = HistorySettingsService(
            printer_facade_service=self.printer_facade_service
        )
        # edited by glg
        self.penjualan_settings_service = PenjualanSettingsService()
        self.printer_settings_controller = self.printer_settings_service.get_legacy_controller()
        self.scanner_controller = scanner_controller or ScannerController()

    # edited by glg
    def dispose(self):
        scanner = getattr(self, "scanner_controller", None)
        if scanner is None:
            return
        if hasattr(scanner, "dispose"):
            scanner.dispose()

    def get_printers(self):
        return self.printer_settings_service.get_printers()

    def get_default_printer(self):
        return self.printer_settings_service.get_default_printer()

    def add_printer(self, name, paper_size, is_default=False):
        return self.printer_settings_service.add_printer(name, paper_size, is_default)

    def remove_printer(self, index):
        return self.printer_settings_service.remove_printer(index)

    def set_default_printer(self, index):
        return self.printer_settings_service.set_default_printer(index)

    def test_print(self, index):
        return self.printer_settings_service.test_print(index)

    def preview_print(self, index, parent=None):
        return self.printer_settings_service.preview_print(index, parent)

    def run_printer_diagnostic(self):
        return self.printer_settings_service.run_printer_diagnostic()

    def get_print_mode(self):
        return self.printer_settings_service.get_print_mode()

    def set_print_mode(self, mode):
        return self.printer_settings_service.set_print_mode(mode)

    # edited by glg
    def get_settlement_print_option(self, option_key, default=False):
        return self.printer_settings_service.get_settlement_print_option(option_key, default=default)

    # edited by glg
    def set_settlement_print_option(self, option_key, enabled):
        return self.printer_settings_service.set_settlement_print_option(option_key, enabled)

    # edited by glg
    def update_settlement_print_option(self, option_key, enabled, admin_username, admin_password):
        return self.printer_settings_service.update_settlement_print_option(
            option_key,
            enabled,
            admin_username,
            admin_password,
        )

    def get_history_retention_days(self):
        return self.history_settings_service.get_history_retention_days()

    def set_history_retention_days(self, days):
        return self.history_settings_service.set_history_retention_days(days)

    def refresh_company_logo_assets(self, force_refresh=True):
        return self.printer_settings_service.refresh_company_logo_assets(force_refresh=force_refresh)

    def load_scanner_settings(self):
        return self.scanner_controller.load_settings()

    def save_scanner_settings(self, payload):
        return self.scanner_controller.save_settings(payload)

    def set_scanner_runtime_provider(self, provider):
        return None

    def run_scanner_diagnostic(self):
        return self.scanner_controller.run_diagnostic()

    def get_scanner_discovered_devices(self):
        return self.scanner_controller.get_discovered_devices()

    def pair_scanner_device(self, selected_device, replace=False):
        saved = self.scanner_controller.pair_device(selected_device, replace=replace)
        return saved or {}

    # edited by glg
    def get_penjualan_ppn_settings(self):
        return self.penjualan_settings_service.get_ppn_settings()

    # edited by glg
    def update_penjualan_ppn_mode(self, mode, admin_username, admin_password):
        return self.penjualan_settings_service.update_ppn_mode(
            mode,
            admin_username,
            admin_password,
        )
