"""네이버 블로그 규칙 자동 주입 테스트"""
import re
import sys
from pathlib import Path

WORKSPACE = Path("/home/jay/workspace")

def _inject_platform_rules(task_desc: str):
    """dispatch.py의 _inject_platform_rules 로직 복사 (독립 테스트용)"""
    task_lower = task_desc.lower()

    naver_blog_detected = False
    if "네이버 블로그" in task_desc or "blog-publish-naver" in task_lower:
        naver_blog_detected = True
    elif re.search(r"naver.*블로그", task_desc, re.IGNORECASE):
        naver_blog_detected = True
    elif re.search(r"네이버.*발행", task_desc):
        naver_blog_detected = True

    if not naver_blog_detected:
        return None

    rules_path = WORKSPACE / "config" / "naver-blog-rules.md"
    if not rules_path.exists():
        return None

    try:
        rules_content = rules_path.read_text(encoding="utf-8")
        return rules_content
    except OSError:
        return None

def test_keyword_detection():
    """키워드 감지 테스트"""
    results = []

    # 감지 O 케이스
    positive_cases = [
        ("네이버 블로그에 보험 설명 글 작성", "네이버 블로그"),
        ("blog-publish-naver 스킬로 발행", "blog-publish-naver"),
        ("Blog-Publish-Naver 대소문자", "Blog-Publish-Naver (대소문자)"),
        ("naver 플랫폼에 블로그 글 올리기", "naver.*블로그"),
        ("Naver에서 블로그 포스팅", "Naver.*블로그 (대문자)"),
        ("네이버에 글 발행하기", "네이버.*발행"),
    ]

    for desc, label in positive_cases:
        result = _inject_platform_rules(desc)
        passed = result is not None
        results.append((label, passed, "감지O"))

    # 감지 X 케이스
    negative_cases = [
        ("티스토리 블로그에 글 작성", "티스토리 블로그"),
        ("워드프레스 블로그 포스팅", "워드프레스"),
        ("API 서버 개발", "무관 키워드"),
        ("네이버 카페에 글 올리기", "네이버 카페 (블로그 아님)"),
        ("블로그 글 작성 (네이버 아님)", "블로그만 단독"),
    ]

    for desc, label in negative_cases:
        result = _inject_platform_rules(desc)
        passed = result is None
        results.append((label, passed, "감지X"))

    return results

def test_rules_content():
    """규칙 파일 내용 검증"""
    results = []

    rules_path = WORKSPACE / "config" / "naver-blog-rules.md"

    # 파일 존재 확인
    results.append(("규칙 파일 존재", rules_path.exists(), "파일"))

    if rules_path.exists():
        content = rules_path.read_text(encoding="utf-8")
        # 필수 규칙 포함 확인
        checks = [
            ("이모지 금지 규칙", "이모지 절대 금지" in content),
            ("빈줄 삽입 규칙", "빈줄 삽입 필수" in content),
            ("SE 에디터 인용구", "quotation_line" in content),
            ("HTML 사용 금지", "SE 에디터에서 깨짐" in content),
            ("잔여수수료 금지", "잔여수수료" in content),
            ("여러분 호칭 금지", "여러분" in content),
        ]
        results.extend([(label, passed, "내용") for label, passed in checks])

    return results

def test_injection_into_prompt():
    """프롬프트에 주입 시 형식 검증"""
    results = []

    fake_prompt = "기존 프롬프트 내용..."
    rules = _inject_platform_rules("네이버 블로그 글 작성")

    if rules:
        combined = fake_prompt + f"\n\n{rules}"
        # 기존 프롬프트 보존 확인
        results.append(("기존 프롬프트 보존", combined.startswith("기존 프롬프트"), "주입"))
        # 규칙 포함 확인
        results.append(("규칙 내용 포함", "이모지 절대 금지" in combined, "주입"))
        # 구분 공백 확인
        results.append(("빈줄로 구분", "\n\n##" in combined, "주입"))
    else:
        results.append(("규칙 주입 실패", False, "주입"))

    return results

def test_dispatch_integration():
    """dispatch.py 문법 및 함수 존재 검증"""
    results = []

    dispatch_path = WORKSPACE / "dispatch.py"
    content = dispatch_path.read_text(encoding="utf-8")

    # 함수 존재 확인
    results.append(("_inject_platform_rules 함수 존재", "def _inject_platform_rules" in content, "통합"))

    # dispatch() 내 호출 존재 확인
    results.append(("dispatch()에서 호출", "platform_rules = _inject_platform_rules(task_desc)" in content, "통합"))

    # prompt += 주입 코드 확인
    results.append(("prompt += 주입", 'prompt += f"\\n\\n{platform_rules}"' in content, "통합"))

    # 문법 검증
    import ast
    try:
        ast.parse(content)
        results.append(("Python 문법 유효", True, "통합"))
    except SyntaxError as e:
        results.append((f"Python 문법 에러: {e}", False, "통합"))

    return results

def test_constants_json():
    """constants.json에 platform_rules 등록 확인"""
    import json
    results = []

    path = WORKSPACE / "config" / "constants.json"
    with open(path) as f:
        data = json.load(f)

    results.append(("platform_rules 키 존재", "platform_rules" in data, "설정"))

    if "platform_rules" in data:
        pr = data["platform_rules"]
        results.append(("naver_blog 항목", "naver_blog" in pr, "설정"))
        if "naver_blog" in pr:
            nb = pr["naver_blog"]
            results.append(("rules_file 경로", nb.get("rules_file") == "config/naver-blog-rules.md", "설정"))
            results.append(("keywords 존재", len(nb.get("keywords", [])) > 0, "설정"))

    return results

if __name__ == "__main__":
    all_results = []

    print("=" * 60)
    print("네이버 블로그 규칙 자동 주입 테스트")
    print("=" * 60)

    tests = [
        ("키워드 감지", test_keyword_detection),
        ("규칙 파일 내용", test_rules_content),
        ("프롬프트 주입", test_injection_into_prompt),
        ("dispatch.py 통합", test_dispatch_integration),
        ("constants.json", test_constants_json),
    ]

    total_pass = 0
    total_fail = 0

    for section, test_fn in tests:
        print(f"\n--- {section} ---")
        results = test_fn()
        for label, passed, category in results:
            status = "PASS" if passed else "FAIL"
            if passed:
                total_pass += 1
            else:
                total_fail += 1
            print(f"  [{status}] [{category}] {label}")
        all_results.extend(results)

    print(f"\n{'=' * 60}")
    print(f"결과: {total_pass} PASS / {total_fail} FAIL (총 {total_pass + total_fail}건)")
    print(f"{'=' * 60}")

    sys.exit(0 if total_fail == 0 else 1)
