from PySide6.QtPrintSupport import QPrinterInfo

from pypos.modules.printer.config.print_profile_config import (
    DEFAULT_PRINT_MODE,
    PRINT_MODE_OPTIONS,
    SETTLEMENT_LAYOUT_DEFAULTS,
)
from pypos.modules.printer.config.printer_config import DEFAULT_PAPER_SIZE


class PrintProfileService:
    # edited by glg
    def _resolve_layout_flag(self, printer_settings_controller, option_key: str, default: bool) -> bool:
        try:
            return bool(
                printer_settings_controller.get_settlement_print_option(
                    option_key,
                    default=default,
                )
            )
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError):
            return bool(default)

    def resolve_mode(self, printer_settings_controller):
        try:
            mode = str(printer_settings_controller.get_print_mode() or "").strip().lower()
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError):
            mode = DEFAULT_PRINT_MODE
        if mode not in PRINT_MODE_OPTIONS:
            return DEFAULT_PRINT_MODE
        return mode

    def resolve_printer_config(self, printer_settings_controller, index_printer=None):
        printers = printer_settings_controller.model.load_printers() or []
        if index_printer is not None and 0 <= index_printer < len(printers):
            return dict(printers[index_printer] or {})

        for record in printers:
            if bool((record or {}).get("default")):
                return dict(record or {})

        fallback = printer_settings_controller.get_default_printer() or {}
        if fallback:
            return dict(fallback or {})

        try:
            sys_default = QPrinterInfo.defaultPrinter()
            if sys_default and not sys_default.isNull():
                return {
                    "name": str(sys_default.printerName() or "").strip(),
                    "paper_size": DEFAULT_PAPER_SIZE,
                    "default": True,
                }
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError):
            return {"name": "", "paper_size": DEFAULT_PAPER_SIZE, "default": True}
        return {"name": "", "paper_size": DEFAULT_PAPER_SIZE, "default": True}

    def resolve_receipt_setting(self, printer_settings_controller, cabang_id=None):
        try:
            setting = printer_settings_controller.get_receipt_setting(cabang_id=cabang_id) or {}
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError):
            setting = {}
        payload = {
            "header1": str(setting.get("header1") or "").strip(),
            "header2": str(setting.get("header2") or "").strip(),
            "header3": str(setting.get("header3") or "").strip(),
            "footer1": str(setting.get("footer1") or "").strip(),
            "footer2": str(setting.get("footer2") or "").strip(),
            "footer3": str(setting.get("footer3") or "").strip(),
            "logo": str(setting.get("logo") or "").strip(),
        }
        return payload

    def resolve_settlement_layout(self, printer_settings_controller):
        base = dict(SETTLEMENT_LAYOUT_DEFAULTS)
        try:
            setting = self.resolve_receipt_setting(printer_settings_controller)
            if setting.get("header1"):
                base["title"] = setting["header1"]
        except (TypeError, ValueError, KeyError, AttributeError, RuntimeError, OSError, LookupError, ArithmeticError, ImportError):
            pass
        base["show_cash_recap"] = self._resolve_layout_flag(
            printer_settings_controller,
            option_key="show_cash_recap",
            default=bool(SETTLEMENT_LAYOUT_DEFAULTS.get("show_cash_recap", True)),
        )
        base["show_transaction_list"] = self._resolve_layout_flag(
            printer_settings_controller,
            option_key="show_transaction_list",
            default=bool(SETTLEMENT_LAYOUT_DEFAULTS.get("show_transaction_list", False)),
        )
        return base

    def resolve_settlement_profile(self, printer_settings_controller, printer_name=None, cabang_id=None):
        printer_cfg = self.resolve_printer_config(printer_settings_controller)
        if printer_name:
            printer_cfg["name"] = str(printer_name).strip()
        return {
            "mode": self.resolve_mode(printer_settings_controller),
            "printer_name": str(printer_cfg.get("name") or "").strip(),
            "paper_size": str(printer_cfg.get("paper_size") or DEFAULT_PAPER_SIZE).strip() or DEFAULT_PAPER_SIZE,
            "layout": self.resolve_settlement_layout(printer_settings_controller),
            "receipt_setting": self.resolve_receipt_setting(printer_settings_controller, cabang_id=cabang_id),
        }
