#!/usr/bin/env python3
"""
WBS-8.7: spec-코드 동기화 확장 (has_code_implementation 태그 자동화)
"""

import yaml
from pathlib import Path
from typing import Dict, List

SPEC_DIR = Path("spec")

def get_code_reference_patterns() -> Dict[str, str]:
    """각 spec 파일이 참조하는 코드 패턴"""
    return {
        # Formula references
        "formula_registry": "src/quant_engine",
        "decision_flow": "tools/build_final_execution_decision",
        "routing": "tools/validate_order_grammar",
        "market_regime": "spec/11_market_regime",
        "field_dictionary": "spec/14_raw_workbook_mapping",

        # Performance/Data
        "performance_contract": "tools/benchmark_snapshot_admin_performance",
        "data_gaps": "tools/auto_fill",
        "low_capability_llm": "tools/build_final_context_for_llm",

        # Gas/KIS
        "gas_adapter": "tools/validate_gitea_secrets_contract",
        "kis": "tools/validate_gitea_secrets_contract",

        # Storage
        "release_dag": ".gitea/workflows",

        # Strategy
        "anti_late_entry": "tools/validate_anti_late_entry_gate",
        "pre_distribution": "tools/validate_pre_distribution_early_warning",
        "smart_money": "tools/validate_smart_money_liquidity_gate",
        "cash_floor": "tools/validate_cash_floor_policy",
    }

def should_have_code_reference(filename: str) -> bool:
    """파일이 코드 참조를 가져야 하는지 판단"""
    patterns = get_code_reference_patterns()
    filename_lower = filename.lower()

    for pattern in patterns.keys():
        if pattern in filename_lower:
            return True

    return False

def tag_spec_file(file_path: Path) -> bool:
    """spec 파일에 has_code_implementation 태그 추가"""
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            content = yaml.safe_load(f)

        if content is None:
            content = {}

        # meta 섹션이 없으면 생성
        if 'meta' not in content:
            content['meta'] = {}

        meta = content['meta']

        # 이미 태그되어 있으면 스킵
        if 'has_code_implementation' in meta:
            return None  # 이미 처리됨

        # 코드 참조 여부 판단
        has_reference = should_have_code_reference(file_path.stem)

        # 태그 추가
        if has_reference:
            meta['has_code_implementation'] = True
            meta['code_path'] = "tools/ or spec/ or .gitea/workflows"
        else:
            meta['has_code_implementation'] = False

        # 파일 저장
        with open(file_path, 'w', encoding='utf-8') as f:
            yaml.dump(content, f, allow_unicode=True, default_flow_style=False)

        return has_reference

    except Exception as e:
        print(f"Error processing {file_path}: {e}")
        return None

def main():
    """메인 함수"""
    print("WBS-8.7: spec-코드 동기화 확장")
    print("="*80)

    # 모든 spec 파일 찾기
    spec_files = sorted(SPEC_DIR.glob("*.yaml"))

    tagged_count = 0
    with_code = 0
    without_code = 0
    already_tagged = 0

    for spec_file in spec_files:
        result = tag_spec_file(spec_file)

        if result is None:
            already_tagged += 1
        elif result:
            with_code += 1
            tagged_count += 1
            print(f"[+] {spec_file.name}: has_code_implementation=true")
        else:
            without_code += 1
            tagged_count += 1
            print(f"[-] {spec_file.name}: has_code_implementation=false")

    print("\n" + "="*80)
    print(f"[결과]")
    print(f"  새로 태그된 파일: {tagged_count}")
    print(f"  코드 참조 있음: {with_code}")
    print(f"  코드 참조 없음: {without_code}")
    print(f"  이미 태그됨: {already_tagged}")
    print(f"  총 파일 수: {len(spec_files)}")

    coverage = ((tagged_count + already_tagged) / len(spec_files)) * 100
    print(f"\n[진행률] {coverage:.1f}% 완료")

    if coverage >= 90:
        print("[OK] WBS-8.7 목표 달성 (>90%)")
    else:
        print(f"[진행 중] 목표까지 {90-coverage:.1f}% 남음")

if __name__ == "__main__":
    main()
