class PembayaranStateService:
    def __init__(self):
        self.form_state = {
            "tunai": {"diskon_source": "percent"},
            "credit": {"diskon_source": "percent"},
            "debit": {"diskon_source": "percent"},
        }
        self.voucher_updating = False
        self.diskon_admin_verified = False
        self.diskon_admin_value = 0
        # edited by glg
        # Guard sinkronisasi widget diskon agar perubahan programatik
        # tidak dianggap input manual user.
        self.diskon_field_syncing = False

    def is_voucher_updating(self):
        return bool(self.voucher_updating)

    def set_voucher_updating(self, value):
        self.voucher_updating = bool(value)

    def reset_diskon_admin(self):
        self.diskon_admin_verified = False
        self.diskon_admin_value = 0

    def should_verify_diskon_admin(self, diskon_value):
        return not self.diskon_admin_verified or self.diskon_admin_value != int(diskon_value or 0)

    def mark_diskon_admin_verified(self, diskon_value):
        self.diskon_admin_verified = True
        self.diskon_admin_value = int(diskon_value or 0)

    # edited by glg
    def set_diskon_field_syncing(self, value):
        self.diskon_field_syncing = bool(value)

    # edited by glg
    def is_diskon_field_syncing(self):
        return bool(self.diskon_field_syncing)

    # edited by glg
    def set_diskon_source(self, mode, source):
        mode_key = str(mode or "").strip().lower()
        if mode_key not in self.form_state:
            return
        source_key = "nominal" if str(source or "").strip().lower() == "nominal" else "percent"
        self.form_state.setdefault(mode_key, {})
        self.form_state[mode_key]["diskon_source"] = source_key

    # edited by glg
    def get_diskon_source(self, mode, default="percent"):
        mode_key = str(mode or "").strip().lower()
        source = str(
            (self.form_state.get(mode_key) or {}).get("diskon_source") or default
        ).strip().lower()
        return "nominal" if source == "nominal" else "percent"
