#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import json
import os.path
from pathlib import Path
from typing import Dict, List

import unicodedata
from pilot.job.impl.base_job import BaseJob


class GetRelationCblIpo(BaseJob):

    _target_file = ''
    @staticmethod
    def extract_key(filename: str, split_key:str) -> str:
        """
        从文件名中提取业务编号（不区分全/半角）。
        例如：
            "E9000-ERR.cob"            -> "E9000"
            "Ｅ９０００−エラー処理.ipo" -> "Ｅ９０００"
        """
        return filename.split(split_key)[0]

    @staticmethod
    def zenkaku_to_hankaku(text: str) -> str:
        """
        将字符串中的全角英文字母、数字以及常见标点全部转换为半角。

        参数
        -----
        text : str
            任意包含全角字符的 Unicode 字符串。

        返回
        -----
        str
            已经把全角字符映射为半角的字符串。
        """
        # NFKC 会把兼容等价字符（包括全角）分解并重新组合为标准的半角形式
        return unicodedata.normalize('NFKC', text)

    def pair_cob_ipo(self, folder: Path) -> List[Dict[str, str]]:
        """
        参数
        -----
        folder : Path
            包含 *.cob* 与 *.ipo* 文件的目录（可以是相对或绝对路径）。

        返回
        -----
        List[Dict[str,str]]
            每个元素形如 {"cob":"E9000-ERR.cob","ipo":"Ｅ９０００−エラー処理.ipo"}
        """
        cob_map: Dict[str, str] = {}
        ipo_map: Dict[str, str] = {}


        allowed = {'.cob', '.ipo'}

        # 读取目录下的所有文件（不递归）
        for entry in folder.iterdir():
            # if entry.is_file() and entry.suffix.lower() in allowed:              # 跳过子目录
            #     yield entry

            if entry.suffix not in allowed:
                continue
            name = entry.name

            split_key = ''
            if name.lower().endswith('.cob'):
                split_key = '-'
            elif name.lower().endswith('.ipo'):
                split_key = '−'

            key = self.extract_key(name,split_key)

            if not key:
                # 没法识别业务编号的文件直接忽略（或自行决定如何处理）
                continue

            if name.lower().endswith('.cob'):
                cob_map[key] = name
            elif name.lower().endswith('.ipo'):
                ipo_map[key] = name

        # 配对
        pairs: List[Dict[str, str]] = []
        for key, ipo_name in ipo_map.items():
            cob_name = cob_map.get(self.zenkaku_to_hankaku(key))
            if ipo_name:                     # 同一编号同时拥有 .cob 与 .ipo
                pairs.append({"cob": cob_name, "ipo": ipo_name})
        return pairs

    def run(self):

        target_folder = Path(self.file_path).parent

        target_file_name = target_folder.parent.name + '_relation.json'
        target_file = target_folder / target_file_name
        self._target_file = target_file
        if not os.path.exists(target_file):
            relation_result = self.pair_cob_ipo(target_folder)

            json_data = json.dumps(relation_result, ensure_ascii=False, indent=2)

            target_file.write_text(json_data, encoding="utf-8")

        super().run()

