"""
MCP Prompt Templates.

These prompts guide LLMs in producing consistent, high-quality outputs.
"""

from typing import Any


def get_create_manual_test_prompt(
    feature: str | None = None,
    acceptance_criteria: list[str] | None = None,
) -> dict[str, Any]:
    """
    Get the prompt template for creating manual test cases.

    MCP Prompt Name: create-manual-test
    """
    base_prompt = """Sen bir QA uzmanısın. Verilen feature ve acceptance criteria'ya göre 
kapsamlı test case'ler oluşturman gerekiyor.

## Test Case Oluşturma Kuralları

1. **Başlık**: Neyin test edildiğini açıkça belirt (10-200 karakter)
2. **Açıklama**: Test'in amacını ve kapsamını detaylı anlat
3. **Ön Koşullar**: Test başlamadan önce sağlanması gereken tüm koşulları listele
4. **Adımlar**: Her adım için:
   - Yapılacak işlem (action) - net ve tekrarlanabilir
   - Beklenen sonuç (expected_result) - doğrulanabilir ve spesifik
5. **Test Data**: Kullanılacak verileri açıkça tanımla
6. **Risk ve Öncelik**: Uygun risk_level ve priority değerlerini belirle

## Senaryo Tipleri

- **Pozitif**: Normal, başarılı akış senaryoları
- **Negatif**: Hata durumları, invalid input senaryoları
- **Boundary**: Sınır değer testleri (min, max, limit)
- **Edge Case**: Nadir ama olası durumlar

## Output Format

testcase.generate tool'unu kullanarak test case oluştur. Tool şu parametreleri alır:
- feature: Feature açıklaması
- acceptance_criteria: Kabul kriterleri listesi
- module: Modül adı (opsiyonel)
- risk_level: low/medium/high/critical
- include_negative: true/false
- include_boundary: true/false
"""

    if feature:
        base_prompt += f"\n\n## Mevcut Context\n\nFeature: {feature}"

    if acceptance_criteria:
        base_prompt += "\n\nAcceptance Criteria:\n"
        for idx, ac in enumerate(acceptance_criteria, 1):
            base_prompt += f"{idx}. {ac}\n"

    return {
        "name": "create-manual-test",
        "description": "Xray Manual Test oluşturma rehberi",
        "prompt": base_prompt,
        "arguments": [
            {
                "name": "feature",
                "description": "Test edilecek özellik",
                "required": True,
            },
            {
                "name": "acceptance_criteria",
                "description": "Kabul kriterleri listesi",
                "required": True,
            },
        ],
    }


def get_select_smoke_tests_prompt(
    testcases: list[dict] | None = None,
    max_duration: int = 15,
) -> dict[str, Any]:
    """
    Get the prompt template for selecting smoke tests.

    MCP Prompt Name: select-smoke-tests
    """
    base_prompt = f"""Sen bir QA Lead'sin. Mevcut test case havuzundan Smoke test suite'i 
oluşturman gerekiyor.

## Smoke Test Seçim Kriterleri

1. **Kritik Yol Testleri**: Ana kullanıcı journey'lerini kapsamalı
2. **High-Risk Alanlar**: Critical ve high risk test'ler öncelikli
3. **P0/P1 Öncelik**: En yüksek öncelikli test'ler
4. **Hızlı Çalışma**: Toplam süre maksimum {max_duration} dakika olmalı
5. **Temel Fonksiyonlar**: Login, ana işlemler, kritik entegrasyonlar

## Seçilmemesi Gerekenler

- Uzun süren E2E test'ler
- Edge case ve boundary test'ler (regression için)
- Low priority test'ler
- Detaylı negatif senaryolar

## Smoke Suite Özellikleri

- Maksimum 15-20 test case
- Her kritik modülden en az 1 test
- Toplam süre: {max_duration} dakika

## Output Format

suite.compose tool'unu kullanarak smoke suite oluştur:
- testcases: Tüm test case listesi
- target: "smoke"
- max_duration_minutes: {max_duration}
"""

    return {
        "name": "select-smoke-tests",
        "description": "Smoke test seçimi rehberi",
        "prompt": base_prompt,
        "arguments": [
            {
                "name": "testcases",
                "description": "Mevcut test case havuzu",
                "required": True,
            },
            {
                "name": "max_duration",
                "description": "Maksimum suite süresi (dakika)",
                "required": False,
            },
        ],
    }


def get_generate_negative_scenarios_prompt(
    feature: str | None = None,
    positive_testcases: list[dict] | None = None,
) -> dict[str, Any]:
    """
    Get the prompt template for generating negative test scenarios.

    MCP Prompt Name: generate-negative-scenarios
    """
    base_prompt = """Sen bir QA Security uzmanısın. Pozitif test case'lere karşılık gelen 
negatif senaryoları belirlemelisin.

## Negatif Senaryo Kategorileri

### 1. Input Validation
- Boş input
- Null değer
- Özel karakterler (SQL injection, XSS)
- Maksimum uzunluk aşımı
- Minimum uzunluk ihlali
- Geçersiz format (email, telefon, vb.)

### 2. Authentication & Authorization
- Geçersiz credentials
- Expired session/token
- Yetersiz yetki
- Session hijacking denemeleri

### 3. Boundary Testing
- Minimum değerin 1 altı
- Maksimum değerin 1 üstü
- Zero değeri
- Negatif sayılar

### 4. Error Handling
- Network timeout
- Server error (5xx)
- Resource not found (404)
- Rate limit aşımı
- Database bağlantı hatası

### 5. Concurrency
- Eşzamanlı istekler
- Race condition
- Deadlock senaryoları

## Output Format

Her pozitif senaryo için en az 2 negatif senaryo öner.
testcase.generate tool'unu kullanarak negatif test case'ler oluştur:
- include_negative: true
- scenario_type: negative
"""

    if feature:
        base_prompt += f"\n\n## Mevcut Context\n\nFeature: {feature}"

    return {
        "name": "generate-negative-scenarios",
        "description": "Negatif senaryo üretimi rehberi",
        "prompt": base_prompt,
        "arguments": [
            {
                "name": "feature",
                "description": "Test edilecek özellik",
                "required": True,
            },
            {
                "name": "positive_testcases",
                "description": "Mevcut pozitif test case'ler",
                "required": False,
            },
        ],
    }


def get_review_test_coverage_prompt(
    testcases: list[dict] | None = None,
    requirements: list[str] | None = None,
) -> dict[str, Any]:
    """
    Get the prompt template for reviewing test coverage.

    MCP Prompt Name: review-test-coverage
    """
    base_prompt = """Sen bir QA Manager'sın. Test suite'in kapsamını analiz etmen ve 
eksikleri belirlemelisin.

## Kapsam Analiz Kriterleri

### 1. Gereksinim Kapsamı (Requirement Coverage)
- Her gereksinim için en az 1 test case var mı?
- Kritik gereksinimler daha fazla test ile kapsanıyor mu?

### 2. Modül Kapsamı
- Tüm modüller test ediliyor mu?
- Entegrasyon noktaları test ediliyor mu?

### 3. Senaryo Dağılımı
- Pozitif/Negatif oran makul mü? (önerilen: %70/%30)
- Boundary test'ler var mı?
- Error handling test'leri var mı?

### 4. Risk Dağılımı
- Critical/High risk alanlar yeterince kapsanıyor mu?
- Düşük riskli alanlara gereksiz odaklanma var mı?

### 5. Test Data Kalitesi
- Test data tanımlı mı?
- Boundary değerler kullanılıyor mu?
- Data-driven test yaklaşımı var mı?

## Output Format

suite.coverage_report tool'unu kullanarak analiz yap:
- testcases: Test case listesi
- requirements: Gereksinim listesi (opsiyonel)
- modules: Modül listesi (opsiyonel)
"""

    return {
        "name": "review-test-coverage",
        "description": "Test kapsam analizi rehberi",
        "prompt": base_prompt,
        "arguments": [
            {
                "name": "testcases",
                "description": "Analiz edilecek test case'ler",
                "required": True,
            },
            {
                "name": "requirements",
                "description": "Kontrol edilecek gereksinimler",
                "required": False,
            },
        ],
    }


# Registry of all available prompts
PROMPT_REGISTRY = {
    "create-manual-test": get_create_manual_test_prompt,
    "select-smoke-tests": get_select_smoke_tests_prompt,
    "generate-negative-scenarios": get_generate_negative_scenarios_prompt,
    "review-test-coverage": get_review_test_coverage_prompt,
}
