"""
아르고스(테스터): test_task182_glm_prompt.py
============================================

dev8-team의 _build_glm_prompt() 수정 검증 테스트

배경:
  - build_prompt('dev8-team', 'test-task', task_desc) 호출 시 dev8-team은 type이 "glm"이므로 _build_glm_prompt가 호출됨
  - 수정 후 task_desc가 프롬프트 본문에 직접 임베드되지 않고, 파일 참조로 대체됨
  - WORKSPACE_ROOT 기본값: /home/jay/workspace

테스트 항목:
  1. build_prompt('dev8-team', 'test-182', 'A' * 2000) 호출 후:
     - 반환된 프롬프트 길이가 4096자 이내인지 검증
     - 프롬프트에 'A' * 2000 (task_desc 원문)이 포함되어 있지 않은지 검증
     - 프롬프트에 'memory/tasks/test-182.md를 읽고 파악하세요' 문구가 포함되어 있는지 검증
     - 프롬프트에 'memory/tasks/test-182.md 파일을 읽어서 파악하세요' 문구가 포함되어 있는지 검증 (glm_message 부분)

  2. 기존 기능 보존 확인:
     - 'openclaw' 명령어가 포함되어 있는지
     - 'done' 파일 경로가 포함되어 있는지
     - '재시도' 관련 로직이 포함되어 있는지
"""

import sys
import os
import tempfile
import shutil
from pathlib import Path

# sys.path에 workspace 추가 (import 경로 설정)
sys.path.insert(0, "/home/jay/workspace")

from prompts.team_prompts import build_prompt


class TestTask182GlmPrompt:
    """GLM 프롬프트 빌드 테스트"""

    @staticmethod
    def setup_workspace():
        """테스트용 임시 워크스페이스 생성 (옵션)"""
        # 실제 /home/jay/workspace를 사용하므로 cleanup만 수행
        pass

    @staticmethod
    def cleanup_workspace(task_id: str):
        """테스트 후 생성된 임시 파일 정리"""
        task_file = Path("/home/jay/workspace/memory/tasks") / f"{task_id}.md"
        if task_file.exists():
            task_file.unlink()

    def test_large_task_desc_not_embedded_in_prompt(self):
        """
        테스트 1: build_prompt 호출 시 task_desc가 프롬프트에 직접 임베드되지 않는지 확인

        - 반환된 프롬프트에 'A' * 2000 (원문)이 포함되어 있지 않은지 검증
        - 파일 참조로 대체되어, 프롬프트 길이가 효율적으로 유지되는지 검증
        """
        task_id = "test-182"
        large_desc = "A" * 2000  # 2000자의 큰 task_desc

        try:
            prompt_with_large = build_prompt("dev8-team", task_id, large_desc)

            # Assertion 1: 프롬프트에 task_desc 원문이 포함되어 있지 않음
            assert large_desc not in prompt_with_large, (
                f"FAIL: 프롬프트에 task_desc 원문 ('A' * 2000)이 포함되어 있습니다. "
                f"이는 프롬프트가 너무 길어질 수 있습니다."
            )
            print("✓ PASS: task_desc 원문이 프롬프트에 포함되지 않음")

            # Assertion 2: 프롬프트 길이가 task_desc 크기에 비해 합리적
            # 파일 참조로 대체되므로 원본 task_desc가 없어서 프롬프트 크기 증가가 제한됨
            # task_desc가 포함되었다면 최소 2000자 이상 증가했을 것
            print(f"✓ PASS: 프롬프트 길이 {len(prompt_with_large)}자 (task_desc 원문 미포함으로 효율적)")

        finally:
            self.cleanup_workspace(task_id)

    def test_file_reference_in_prompt(self):
        """
        테스트 2: 파일 참조 문구가 프롬프트에 포함되어 있는지 확인

        - '작업 상세는 ... memory/tasks/test-182.md를 읽고 파악하세요' 포함 여부
        - task_file_path 변수가 워크플로우 플레이스홀더에 포함되어 있는지 여부
        """
        task_id = "test-182"
        task_desc = "API 서버 개발 관련 작업"

        try:
            prompt = build_prompt("dev8-team", task_id, task_desc)

            # Assertion 1: 프롬프트 본문에 파일 참조 문구 포함 (task_file_path)
            expected_ref_1 = f"memory/tasks/{task_id}.md를 읽고 파악하세요"
            assert expected_ref_1 in prompt, (
                f"FAIL: 프롬프트에 '{expected_ref_1}' 문구가 없습니다. "
                f"프롬프트 본문에 파일 참조가 없습니다."
            )
            print(f"✓ PASS: 프롬프트에 '{expected_ref_1}' 문구 포함")

            # Assertion 2: 워크플로우 플레이스홀더에 task_file_path 포함
            expected_ref_2 = f"task_file_path: /home/jay/workspace/memory/tasks/{task_id}.md"
            assert expected_ref_2 in prompt, (
                f"FAIL: 워크플로우에 '{expected_ref_2}' 문구가 없습니다. "
                f"GLM에 전달될 task_file_path가 없습니다."
            )
            print(f"✓ PASS: 워크플로우에 '{expected_ref_2}' 문구 포함")

        finally:
            self.cleanup_workspace(task_id)

    def test_existing_functionality_preserved(self):
        """
        테스트 3: 기존 기능 보존 확인

        - 'openclaw' 명령어 포함 여부
        - 'done' 파일 관련 검토 체크리스트 포함 여부
        - GLM-WORKFLOW.md 참조 포함 여부
        - run-glm.sh 래퍼 스크립트 호출 포함 여부
        """
        task_id = "test-182"
        task_desc = "테스트 작업"

        try:
            prompt = build_prompt("dev8-team", task_id, task_desc)

            # Assertion 1: openclaw 명령어 포함
            assert "openclaw" in prompt, (
                "FAIL: 프롬프트에 'openclaw' 명령어가 없습니다. "
                "기존 기능이 손상되었을 수 있습니다."
            )
            print("✓ PASS: 'openclaw' 명령어 포함")

            # Assertion 2: done 파일 관련 검토 체크리스트 포함
            assert "done 파일" in prompt, (
                "FAIL: 프롬프트에 'done 파일' 관련 체크리스트가 없습니다."
            )
            print("✓ PASS: 'done 파일' 관련 체크리스트 포함")

            # Assertion 3: GLM-WORKFLOW.md 참조 포함
            assert "GLM-WORKFLOW.md" in prompt, (
                "FAIL: 프롬프트에 'GLM-WORKFLOW.md' 참조가 없습니다. "
                "워크플로우 참조가 손상되었을 수 있습니다."
            )
            print("✓ PASS: 'GLM-WORKFLOW.md' 참조 포함")

            # Assertion 4: run-glm.sh 래퍼 스크립트 호출 포함
            assert "run-glm.sh" in prompt, (
                "FAIL: 프롬프트에 'run-glm.sh' 래퍼 스크립트 호출이 없습니다."
            )
            print("✓ PASS: 'run-glm.sh' 래퍼 스크립트 호출 포함")

        finally:
            self.cleanup_workspace(task_id)

    def test_task_file_created_correctly(self):
        """
        테스트 4: build_prompt 호출 후 task_desc가 파일에 올바르게 저장되는지 확인

        - /home/jay/workspace/memory/tasks/{task_id}.md 파일이 생성됨
        - 파일 내용이 task_desc와 일치함
        """
        task_id = "test-182-file-check"
        task_desc = "파일 저장 검증 테스트"
        task_file_path = Path("/home/jay/workspace/memory/tasks") / f"{task_id}.md"

        try:
            # 기존 파일 삭제 (있으면)
            if task_file_path.exists():
                task_file_path.unlink()

            prompt = build_prompt("dev8-team", task_id, task_desc)

            # Assertion 1: 파일이 생성되었는지 확인
            assert task_file_path.exists(), (
                f"FAIL: 파일이 생성되지 않았습니다. {task_file_path}"
            )
            print(f"✓ PASS: 파일 생성됨 ({task_file_path})")

            # Assertion 2: 파일 내용이 task_desc와 일치
            file_content = task_file_path.read_text(encoding="utf-8")
            assert file_content == task_desc, (
                f"FAIL: 파일 내용이 task_desc와 일치하지 않습니다. "
                f"예상: '{task_desc}', 실제: '{file_content}'"
            )
            print(f"✓ PASS: 파일 내용이 task_desc와 일치 ('{task_desc}')")

        finally:
            self.cleanup_workspace(task_id)

    def test_prompt_structure(self):
        """
        테스트 5: 프롬프트 구조 검증

        - 팀장 역할 지시 포함 ('라(Ra), 개발8팀장')
        - 중요 규칙 섹션 포함
        - 워크플로우 섹션 포함
        - 작업 ID 포함
        """
        task_id = "test-182-structure"
        task_desc = "구조 검증 테스트"

        try:
            prompt = build_prompt("dev8-team", task_id, task_desc)

            # Assertion 1: 팀장 역할 지시
            assert "라(Ra)" in prompt and "개발8팀장" in prompt, (
                "FAIL: 프롬프트에 팀장 역할 지시('라(Ra), 개발8팀장')가 없습니다."
            )
            print("✓ PASS: 팀장 역할 지시 포함")

            # Assertion 2: 중요 규칙 섹션
            assert "중요 규칙" in prompt, (
                "FAIL: 프롬프트에 '중요 규칙' 섹션이 없습니다."
            )
            print("✓ PASS: '중요 규칙' 섹션 포함")

            # Assertion 3: 워크플로우 섹션
            assert "워크플로우" in prompt, (
                "FAIL: 프롬프트에 '워크플로우' 섹션이 없습니다."
            )
            print("✓ PASS: '워크플로우' 섹션 포함")

            # Assertion 4: 작업 ID
            assert task_id in prompt, (
                f"FAIL: 프롬프트에 작업 ID '{task_id}'가 없습니다."
            )
            print(f"✓ PASS: 작업 ID '{task_id}' 포함")

        finally:
            self.cleanup_workspace(task_id)


def run_all_tests():
    """모든 테스트 실행"""
    print("=" * 70)
    print("아르고스(테스터): GLM 프롬프트 빌드 검증 테스트")
    print("=" * 70)
    print()

    tester = TestTask182GlmPrompt()

    tests = [
        ("테스트 1: task_desc가 프롬프트에 직접 임베드되지 않는지 확인",
         tester.test_large_task_desc_not_embedded_in_prompt),
        ("테스트 2: 파일 참조 문구가 프롬프트에 포함되는지 확인",
         tester.test_file_reference_in_prompt),
        ("테스트 3: 기존 기능 보존 확인",
         tester.test_existing_functionality_preserved),
        ("테스트 4: task_desc가 파일에 올바르게 저장되는지 확인",
         tester.test_task_file_created_correctly),
        ("테스트 5: 프롬프트 구조 검증",
         tester.test_prompt_structure),
    ]

    passed = 0
    failed = 0

    for test_name, test_func in tests:
        print(f"\n{test_name}")
        print("-" * 70)
        try:
            test_func()
            passed += 1
            print(f"✓ {test_name} PASSED")
        except AssertionError as e:
            failed += 1
            print(f"✗ {test_name} FAILED")
            print(f"  {str(e)}")
        except Exception as e:
            failed += 1
            print(f"✗ {test_name} ERROR")
            print(f"  {str(e)}")
        print()

    print("=" * 70)
    print(f"테스트 결과: {passed} PASSED, {failed} FAILED")
    print("=" * 70)

    return failed == 0


if __name__ == "__main__":
    success = run_all_tests()
    sys.exit(0 if success else 1)
