from typing import Dict

# edited by glg


class DeviceRegistrationResponseMapper:
    @staticmethod
    def extract_status_code(result):
        if not isinstance(result, dict):
            return None
        raw_status = result.get("status")
        try:
            return int(raw_status)
        except (TypeError, ValueError):
            return raw_status

    @staticmethod
    def extract_data_reg(result):
        if not isinstance(result, dict):
            return {}
        data_reg = result.get("dataReg")
        if isinstance(data_reg, dict):
            return dict(data_reg)
        data_alt = result.get("data")
        if isinstance(data_alt, dict):
            return dict(data_alt)
        return {}

    @staticmethod
    def is_registration_success_status(status) -> bool:
        status_text = str(status).strip().lower()
        return (
            status is True
            or status in (1, 200)
            or status_text in {"1", "200", "true", "success", "ok", "berhasil"}
        )

    @staticmethod
    def build_existing_registered_result(cabang_server: str = "", auto_close: bool = False) -> Dict:
        message = "Device sudah terdaftar dan disetujui. Aplikasi akan lanjut ke login."
        cabang_text = str(cabang_server or "").strip()
        if cabang_text:
            message = f"Device sudah terdaftar di cabang '{cabang_text}'. Aplikasi akan lanjut ke login."
        payload = {
            "ok": True,
            "level": "information",
            "already_registered": True,
            "message": message,
        }
        if bool(auto_close):
            payload["auto_close"] = True
        return payload

    @staticmethod
    def build_pending_approval_result(auto_close: bool = False) -> Dict:
        payload = {
            "ok": True,
            "level": "information",
            "pending_approval": True,
            "message": "Device sudah terdaftar tetapi masih menunggu approval pusat.",
        }
        if bool(auto_close):
            payload["auto_close"] = True
        return payload

    @staticmethod
    def extract_failure_reason(result) -> str:
        if isinstance(result, dict):
            return str(result.get("message") or result.get("reason") or str(result))
        return str(result)

    @staticmethod
    def is_conflict_cabang_reason(reason: str) -> bool:
        return "conflict_cabang_id" in str(reason or "").lower()
