import os
import sys

def main():
    # 1. バンドルルートの特定
    # 引数が指定されていればそれを使用、そうでなければ環境変数 IRIS_BUNDLE_ROOT
    if len(sys.argv) > 1:
        target_dir = sys.argv[1]
    else:
        target_dir = os.environ.get("IRIS_BUNDLE_ROOT")
    
    if not target_dir:
        print("Error: Target directory not specified. Provide it as an argument or set IRIS_BUNDLE_ROOT environment variable.", file=sys.stderr)
        sys.exit(1)
        
    target_dir = os.path.abspath(target_dir).replace("\\", "/")
    
    # target_dir 自体が標準バンドルの場合は、その親を bundle_root とする
    if os.path.isdir(f"{target_dir}/raw_sources") and os.path.isdir(f"{target_dir}/wiki"):
        bundle_root = os.path.dirname(target_dir).replace("\\", "/")
    else:
        bundle_root = target_dir

    if not os.path.exists(bundle_root):
        print(f"Error: Bundle root directory not found at {bundle_root}", file=sys.stderr)
        sys.exit(1)

    # 2. バンドルルート配下のすべての標準バンドルを検出
    # (raw_sources と wiki ディレクトリを持つサブディレクトリ。かつ軽量バンドル（wikiなし）は除外)
    bundles = []
    for item in os.listdir(bundle_root):
        sub_dir = f"{bundle_root}/{item}"
        if os.path.isdir(sub_dir):
            if os.path.isdir(f"{sub_dir}/raw_sources") and os.path.isdir(f"{sub_dir}/wiki"):
                bundles.append((item, sub_dir))
                
    bundles.sort(key=lambda x: x[0])
    
    all_bundle_sources = {}
    
    # 3. 各標準バンドルに対してインデックスを作成・更新
    for bundle_name, bundle_dir in bundles:
        raw_sources_dir = f"{bundle_dir}/raw_sources"
        output_dir = f"{bundle_dir}/.bundle"
        output_file = f"{output_dir}/sources.md"
        
        source_files = []
        for root, dirs, files in os.walk(raw_sources_dir):
            for file in files:
                # .md で終わるファイルのみを対象とする
                if file.endswith(".md"):
                    full_path = os.path.join(root, file).replace("\\", "/")
                    # bundle_dir からの相対パス（例: raw_sources/claude-code.md）
                    rel_path_from_bundle = os.path.relpath(full_path, bundle_dir).replace("\\", "/")
                    # output_file (.bundle/sources.md) からの相対パス
                    rel_path_from_output = os.path.relpath(full_path, output_dir).replace("\\", "/")
                    source_files.append((rel_path_from_bundle, rel_path_from_output))
                    
        source_files.sort(key=lambda x: x[0])
        all_bundle_sources[bundle_name] = source_files
        
        # バンドル個別の sources.md を出力
        os.makedirs(output_dir, exist_ok=True)
        lines = []
        lines.append(f"# Sources ({bundle_name})")
        lines.append("")
        if not source_files:
            lines.append("No source files found.")
        else:
            for rel_bundle, rel_out in source_files:
                lines.append(f"- [{rel_bundle}]({rel_out})")
                
        with open(output_file, "w", encoding="utf-8") as f:
            f.write("\n".join(lines) + "\n")
        print(f"Index successfully generated for {bundle_name}: {output_file}")

    # 4. バンドルルート直下の .bundle/sources.md に、すべてのソースファイルを連結して出力
    root_output_dir = f"{bundle_root}/.bundle"
    root_output_file = f"{root_output_dir}/sources.md"
    os.makedirs(root_output_dir, exist_ok=True)
    
    root_lines = []
    root_lines.append("# Sources (all)")
    root_lines.append("")
    
    for bundle_name, source_files in all_bundle_sources.items():
        root_lines.append(f"## {bundle_name}")
        root_lines.append("")
        if not source_files:
            root_lines.append("No source files found.")
        else:
            for rel_bundle, _ in source_files:
                # バンドルルート直下の .bundle/sources.md から見た相対パス
                rel_path_from_root_output = f"../{bundle_name}/{rel_bundle}"
                root_lines.append(f"- [{rel_bundle}]({rel_path_from_root_output})")
        root_lines.append("")
        
    with open(root_output_file, "w", encoding="utf-8") as f:
        f.write("\n".join(root_lines) + "\n")
        
    print(f"Combined index successfully generated: {root_output_file}")

if __name__ == "__main__":
    main()
