from __future__ import annotations

import json


DEFAULT_ICON_COLOR = "qing-orange"
SUPPORTED_EX_ICONS = {
    "ex-alert-outlined",
    "ex-clock-outlined",
    "ex-folder-outlined",
    "ex-form-outlined",
    "ex-home-outlined",
    "ex-user-outlined",
}

ICON_ALIAS_MAP = {
    "archive-box": "ex-form-outlined",
    "beaker": "ex-form-outlined",
    "briefcase": "ex-folder-outlined",
    "building-office": "ex-form-outlined",
    "calendar": "ex-clock-outlined",
    "chat": "ex-clock-outlined",
    "chat-bubble-left-right": "ex-clock-outlined",
    "chart-bar": "ex-form-outlined",
    "chart-square-bar": "ex-form-outlined",
    "check-badge": "ex-alert-outlined",
    "check-circle": "ex-alert-outlined",
    "clipboard-check": "ex-form-outlined",
    "clock": "ex-clock-outlined",
    "cube": "ex-form-outlined",
    "document-text": "ex-form-outlined",
    "folder": "ex-folder-outlined",
    "home": "ex-home-outlined",
    "office-building": "ex-form-outlined",
    "shield-check": "ex-alert-outlined",
    "template": "ex-form-outlined",
    "user": "ex-user-outlined",
    "user-group": "ex-user-outlined",
    "users": "ex-user-outlined",
    "view-grid": "ex-home-outlined",
    "warning": "ex-alert-outlined",
}


def encode_workspace_icon(
    *,
    icon: str | None,
    color: str | None,
    title: str,
    fallback_icon_name: str | None = None,
) -> str:
    if icon and _looks_like_icon_json(icon):
        return icon
    normalized_icon_name = normalize_workspace_icon_name(icon or fallback_icon_name)
    if normalized_icon_name and normalized_icon_name.startswith("ex-") and not color:
        return normalized_icon_name
    icon_name = normalized_icon_name
    icon_color = color or DEFAULT_ICON_COLOR
    if icon_name:
        return json.dumps(
            {
                "icon": None,
                "iconColor": icon_color,
                "iconName": icon_name,
                "iconText": None,
            },
            ensure_ascii=False,
            separators=(",", ":"),
        )
    icon_text = (title or "未")[:1]
    return json.dumps(
        {
            "iconColor": icon_color,
            "iconText": icon_text,
        },
        ensure_ascii=False,
        separators=(",", ":"),
    )


def normalize_workspace_icon_name(icon: str | None) -> str | None:
    if not icon:
        return None
    if _looks_like_icon_json(icon):
        try:
            payload = json.loads(icon)
        except Exception:
            return "ex-form-outlined"
        return normalize_workspace_icon_name(payload.get("iconName")) or "ex-form-outlined"
    if icon in SUPPORTED_EX_ICONS:
        return icon
    normalized = icon.strip().lower()
    if normalized in ICON_ALIAS_MAP:
        return ICON_ALIAS_MAP[normalized]
    for token in normalized.replace("_", "-").split("-"):
        if token in ICON_ALIAS_MAP:
            return ICON_ALIAS_MAP[token]
    if "folder" in normalized or "package" in normalized:
        return "ex-folder-outlined"
    if "home" in normalized or "portal" in normalized or "dashboard" in normalized:
        return "ex-home-outlined"
    if "user" in normalized or "member" in normalized or "contact" in normalized:
        return "ex-user-outlined"
    if "clock" in normalized or "time" in normalized or "schedule" in normalized or "log" in normalized:
        return "ex-clock-outlined"
    if "risk" in normalized or "alert" in normalized or "warn" in normalized or "safety" in normalized:
        return "ex-alert-outlined"
    return "ex-form-outlined"


def _looks_like_icon_json(value: str) -> bool:
    stripped = value.strip()
    return stripped.startswith("{") and stripped.endswith("}")
