import os
import re

current_dir = os.path.dirname(os.path.abspath(__file__))
files = [f for f in os.listdir(current_dir) if f.startswith("IDS-") and f.endswith(".txt")]

print(f"発見したCHISEデータファイル: {len(files)}個")

database = []
seen_chars = set()

# 構造演算子（⿱や⿰など）を除去するための正規表現
ids_operators = r"[⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻\s]"

# 1段階分解された部品から、さらに構成部品を再帰的にすべて抽出する補助関数
def extract_all_deep_components(char, raw_data_dict, visited=None):
    if visited is None:
        visited = set()
    if char in visited:
        return set()
    visited.add(char)
    
    results = {char}
    if char in raw_data_dict:
        raw_ids = raw_data_dict[char]
        # 構造演算子を除去して純粋な文字パーツだけにする
        clean = re.sub(ids_operators, "", raw_ids)
        for part in clean:
            if part.strip():
                results.update(extract_all_deep_components(part, raw_data_dict, visited))
    return results

# まず全ファイルを下読みして、文字と生のIDS文の対応マップを作る
raw_data_dict = {}
lines_to_process = []

for file_name in files:
    file_path = os.path.join(current_dir, file_name)
    with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith(";"):
                continue
            parts = line.split("\t")
            if len(parts) < 3:
                continue
            code, char, ids_str = parts[0], parts[1], parts[2]
            raw_data_dict[char] = ids_str
            lines_to_process.append((code, char, ids_str))

print("部品の再帰的ネスト分解（ディープ・パーシング）を開始します...")

# 2回目のループで、すべての文字の部品を一番細かいところまでバラして登録する
for code, char, ids_str in lines_to_process:
    if char in seen_chars:
        continue
        
    # 「貢」があれば「貢」「工」「貝」すべてを包含部品リストとして抽出する
    all_deep_parts = extract_all_deep_components(char, raw_data_dict)
    
    # 検索用文字列に直接含まれる文字も安全のため追加
    clean_surface = re.sub(ids_operators, "", ids_str)
    for p in clean_surface:
        all_deep_parts.add(p)
        
    all_deep_parts.add(char)
    component_list = list(set([p for p in all_deep_parts if p.strip()]))
    
    gw_code = code.replace("U+", "u").lower()
    
    database.append({
        "char": char,
        "gwCode": gw_code,
        "parts": component_list
    })
    seen_chars.add(char)

print(f"解析完了！ 合計 {len(database)} 文字のディープデータベースを構築しました。")

# database.js の書き出し
output_path = os.path.join(current_dir, "database.js")
with open(output_path, "w", encoding="utf-8") as out:
    out.write("// CHISE IDS 再帰分解生成データベース\n")
    out.write("const chiseDatabase = [\n")
    for i, item in enumerate(database):
        parts_json = ", ".join([f'"{p}"' for p in item["parts"]])
        line_str = f'    {{ char: "{item["char"]}", gwCode: "{item["gwCode"]}", parts: [{parts_json}] }}'
        if i < len(database) - 1:
            line_str += ",\n"
        else:
            line_str += "\n"
        out.write(line_str)
    out.write("];\n")

print("『database.js』の高度な書き換えに成功しました！")
