# SPDX-FileCopyrightText: 2025 QinHan
# SPDX-License-Identifier: MPL-2.0
"""
三语术语表（中文/English/Bahasa）与单向 {src: dst} 字典的互转，
以及与 CSV 的导入/导出。

列约定：zh / en / id
"""
import csv
import io
from typing import Any

# 目标语言 -> 列名 的映射（小写匹配）
_LANG_ALIASES = {
    # 中文（简/繁）
    "zh": "zh",
    "zh-cn": "zh",
    "zh-hans": "zh",
    "zh-hant": "zh",
    "chinese": "zh",
    "simplified chinese": "zh",
    "traditional chinese": "zh",
    "中文": "zh",
    "简体中文": "zh",
    "繁体中文": "zh",
    "汉语": "zh",
    # 英文
    "en": "en",
    "en-us": "en",
    "en-gb": "en",
    "english": "en",
    "英文": "en",
    "英语": "en",
    # 印尼语
    "id": "id",
    "id-id": "id",
    "indonesian": "id",
    "bahasa indonesia": "id",
    "印尼文": "id",
    "印尼语": "id",
    "印度尼西亚语": "id",
}

_COLS = ("zh", "en", "id")


def lang_to_col(to_lang: str | None) -> str | None:
    """目标语言字符串 -> 列名 'zh'|'en'|'id'，无法识别返回 None。"""
    if not to_lang:
        return None
    key = str(to_lang).strip().lower()
    return _LANG_ALIASES.get(key)


def build_glossary_dict(rows: list[dict], to_lang: str | None) -> dict[str, str] | None:
    """
    将三列 rows 编译为单向 {src: dst} 字典。

    规则：目标列作为 dst，其它两列作为 src，覆盖任意源语言命中文本。
    返回 None 表示目标语言不受支持（不注入术语表，安全降级）。
    """
    target_col = lang_to_col(to_lang)
    if target_col is None or not rows:
        return None
    result: dict[str, str] = {}
    for raw in rows:
        if not isinstance(raw, dict):
            continue
        target = str(raw.get(target_col, "") or "").strip()
        if not target:
            continue
        for col in _COLS:
            if col == target_col:
                continue
            src = str(raw.get(col, "") or "").strip()
            if src and src not in result:
                result[src] = target
    return result or None


def rows_to_csv(rows: list[dict]) -> str:
    """三列 rows -> CSV 字符串（含 BOM，表头 zh,en,id）。"""
    buf = io.StringIO()
    buf.write("﻿")  # UTF-8 BOM，便于 Excel 正确识别
    writer = csv.writer(buf)
    writer.writerow(["zh", "en", "id"])
    for raw in rows:
        if not isinstance(raw, dict):
            continue
        writer.writerow([str(raw.get(c, "") or "") for c in _COLS])
    return buf.getvalue()


def csv_to_rows(parsed: list[dict] | list[list]) -> list[dict]:
    """
    解析后的 CSV（PapaParse 结果）-> rows。

    支持三种格式：
    - 3 列表头 zh/en/id
    - 旧 2 列表头 src/dst
    - 无表头的 2/3 列数组（兜底按 [zh,en] 或 [zh,en,id] 处理）
    """
    rows: list[dict] = []
    for item in parsed:
        if isinstance(item, dict):
            # 有表头
            if any(c in item for c in _COLS):
                rows.append({c: str(item.get(c, "") or "").strip() for c in _COLS})
            elif "src" in item and "dst" in item:
                # 旧 2 列格式：无法判断语言，放入 en 列作 src、zh 列作 dst（最常见的英译中场景）
                rows.append({"zh": str(item.get("dst", "") or "").strip(),
                             "en": str(item.get("src", "") or "").strip(),
                             "id": ""})
            else:
                continue
        elif isinstance(item, list):
            cells = [str(x or "").strip() for x in item]
            if len(cells) >= 3:
                rows.append({"zh": cells[0], "en": cells[1], "id": cells[2]})
            elif len(cells) == 2:
                rows.append({"zh": cells[0], "en": cells[1], "id": ""})
    # 过滤全空行
    return [r for r in rows if any(r[c] for c in _COLS)]
