"""Pydantic schemas for TestTemplate endpoints."""

import uuid
from datetime import datetime

from pydantic import BaseModel, ConfigDict


# ── Full output ─────────────────────────────────────────────────────


class TestTemplateOut(BaseModel):
    """Complete representation of a test template."""

    id: uuid.UUID
    mitre_technique_id: str
    name: str
    description: str | None = None
    source: str
    source_url: str | None = None
    attack_procedure: str | None = None
    expected_detection: str | None = None
    platform: str | None = None
    tool_suggested: str | None = None
    severity: str | None = None
    atomic_test_id: str | None = None
    suggested_remediation: str | None = None
    is_active: bool = True
    created_at: datetime | None = None

    model_config = ConfigDict(from_attributes=True)


# ── Create ──────────────────────────────────────────────────────────


class TestTemplateCreate(BaseModel):
    """Payload for creating a custom test template."""

    mitre_technique_id: str
    name: str
    description: str | None = None
    source: str = "custom"
    source_url: str | None = None
    attack_procedure: str | None = None
    expected_detection: str | None = None
    platform: str | None = None
    tool_suggested: str | None = None
    severity: str | None = None
    atomic_test_id: str | None = None
    suggested_remediation: str | None = None


# ── Summary (for listings) ─────────────────────────────────────────


class TestTemplateSummary(BaseModel):
    """Lightweight representation for listing templates."""

    id: uuid.UUID
    mitre_technique_id: str
    name: str
    source: str
    platform: str | None = None
    severity: str | None = None
    is_active: bool = True

    model_config = ConfigDict(from_attributes=True)


# ── Instantiate (create a real Test from a template) ────────────────


class TestTemplateInstantiate(BaseModel):
    """Payload to create a real test from an existing template.

    Optional override fields take precedence over the template values when provided.
    """

    template_id: uuid.UUID
    technique_id: str  # accepts both UUID and MITRE ID (e.g. "T1059.001")

    # User-editable overrides (if omitted the template value is used)
    name: str | None = None
    description: str | None = None
    platform: str | None = None
    procedure_text: str | None = None
    tool_used: str | None = None
