from pypos.modules.printer.services.printer_settings_facade_service import PrinterSettingsFacadeService
from pypos.modules.auth.services.offline_admin_auth_service import OfflineAdminAuthService
import logging


LOGGER = logging.getLogger(__name__)


class PrinterSettingsService:
    def __init__(self, printer_facade_service=None, admin_auth_service=None):
        self.printer_facade_service = printer_facade_service or PrinterSettingsFacadeService()
        self.admin_auth_service = admin_auth_service or OfflineAdminAuthService()

    # edited by glg
    @staticmethod
    def _to_bool(value, default=False):
        if value is None:
            return bool(default)
        if isinstance(value, bool):
            return value
        text = str(value).strip().lower()
        if text in {"1", "true", "yes", "on"}:
            return True
        if text in {"0", "false", "no", "off"}:
            return False
        try:
            return int(float(value)) > 0
        except (TypeError, ValueError):
            return bool(default)

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

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

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

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

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

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

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

    def run_printer_diagnostic(self, timeout_seconds=2.0, output_path=""):
        return self.printer_facade_service.run_printer_diagnostic(
            timeout_seconds=timeout_seconds,
            output_path=output_path,
        )

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

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

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

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

    # edited by glg
    def update_settlement_print_option(self, option_key, enabled, admin_username, admin_password):
        key = str(option_key or "").strip()
        if key not in {"show_cash_recap", "show_transaction_list"}:
            return False, "Opsi cetak settlement tidak valid.", {}

        ok_auth, auth_message, admin_data = self.admin_auth_service.validate_admin_credentials(
            admin_username,
            admin_password,
        )
        if not ok_auth:
            return False, auth_message or "Otorisasi admin gagal.", {}

        enabled_bool = self._to_bool(enabled, default=False)
        self.printer_facade_service.set_settlement_print_option(key, enabled_bool)
        admin_login = str((admin_data or {}).get("nama_login") or "").strip() or "-"
        LOGGER.info(
            "[Settings][Printer] Settlement option diubah: %s=%s by admin=%s",
            key,
            1 if enabled_bool else 0,
            admin_login,
        )
        return True, "Pengaturan cetak settlement berhasil diperbarui.", {
            "option_key": key,
            "enabled": enabled_bool,
            "authorized_by": admin_login,
            "changed": True,
        }

    def get_legacy_controller(self):
        return self.printer_facade_service.get_legacy_controller()

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