"""Prompt metadata registry — catalogues all AI prompts for discoverability."""

from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True)
class PromptInfo:
    """Metadata about a single prompt definition."""

    name: str
    service: str
    description: str
    has_variables: bool
    system_or_user: str  # "system" | "user" | "both"


PROMPT_REGISTRY: dict[str, PromptInfo] = {
    # -- Screening --
    "screening.labelling": PromptInfo(
        name="screening.labelling",
        service="screening",
        description="Score papers 1-5 against eligibility criteria (labelling stage)",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.reasoning": PromptInfo(
        name="screening.reasoning",
        service="screening",
        description="Explain why a score was assigned to a paper (reasoning stage)",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.clustering": PromptInfo(
        name="screening.clustering",
        service="screening",
        description="Group similar AI reasoning texts into thematic clusters",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.cluster_selection": PromptInfo(
        name="screening.cluster_selection",
        service="screening",
        description="Assign each paper to one or more reasoning clusters",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.exclusion_generation": PromptInfo(
        name="screening.exclusion_generation",
        service="screening",
        description="Generate exclusion criteria from project context (screening pipeline)",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.inclusion_generation": PromptInfo(
        name="screening.inclusion_generation",
        service="screening",
        description="Generate inclusion criteria from project context (screening pipeline)",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.exclusion_refinement": PromptInfo(
        name="screening.exclusion_refinement",
        service="screening",
        description="Refine exclusion criteria from AI/human discrepancies",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.reasoning_criteria": PromptInfo(
        name="screening.reasoning_criteria",
        service="screening",
        description="Extract criteria from AI reasoning texts",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.reasoning_suggestion": PromptInfo(
        name="screening.reasoning_suggestion",
        service="screening",
        description="Suggest criteria improvements from reasoning analysis",
        has_variables=True,
        system_or_user="system",
    ),
    "screening.inclusion_inversion": PromptInfo(
        name="screening.inclusion_inversion",
        service="screening",
        description="Invert inclusion criteria to generate exclusion criteria",
        has_variables=True,
        system_or_user="system",
    ),
    # -- Criteria AI --
    "criteria.exclusion_generation": PromptInfo(
        name="criteria.exclusion_generation",
        service="criteria",
        description="Generate PICO-based exclusion criteria with structured JSON output",
        has_variables=True,
        system_or_user="both",
    ),
    "criteria.inclusion_generation": PromptInfo(
        name="criteria.inclusion_generation",
        service="criteria",
        description="Generate PICO-based inclusion criteria with structured JSON output",
        has_variables=True,
        system_or_user="both",
    ),
    "criteria.pico_extraction": PromptInfo(
        name="criteria.pico_extraction",
        service="criteria",
        description="Extract PICO(S) elements from project context with gap analysis",
        has_variables=False,
        system_or_user="both",
    ),
    "criteria.refinement": PromptInfo(
        name="criteria.refinement",
        service="criteria",
        description="Refine criteria from reconciliation conflict patterns",
        has_variables=False,
        system_or_user="both",
    ),
    "criteria.conflict_refinement": PromptInfo(
        name="criteria.conflict_refinement",
        service="criteria",
        description="Analyze human/AI conflicts to generate refined criteria",
        has_variables=False,
        system_or_user="both",
    ),
    "criteria.consolidation": PromptInfo(
        name="criteria.consolidation",
        service="criteria",
        description="Detect duplicate/near-duplicate criteria and propose merges",
        has_variables=False,
        system_or_user="both",
    ),
    "criteria.context_refinement": PromptInfo(
        name="criteria.context_refinement",
        service="criteria",
        description="Refine project description and research questions for better screening",
        has_variables=False,
        system_or_user="both",
    ),
    "criteria.question_analysis": PromptInfo(
        name="criteria.question_analysis",
        service="criteria",
        description="Analyse a single research question for PICOS search-readiness",
        has_variables=True,
        system_or_user="both",
    ),
    # -- Indexer --
    "indexer.pipeline": PromptInfo(
        name="indexer.pipeline",
        service="indexer",
        description="Extract structured fields from paper title/abstract via function calling",
        has_variables=False,
        system_or_user="both",
    ),
    "indexer.refinement": PromptInfo(
        name="indexer.refinement",
        service="indexer",
        description="Review and suggest improvements to extraction field definitions",
        has_variables=False,
        system_or_user="system",
    ),
    "indexer.grouping": PromptInfo(
        name="indexer.grouping",
        service="indexer",
        description="Group extracted tag values into meaningful categories",
        has_variables=False,
        system_or_user="system",
    ),
    "indexer.field_suggestion": PromptInfo(
        name="indexer.field_suggestion",
        service="indexer",
        description="Suggest structured extraction fields based on project context",
        has_variables=False,
        system_or_user="system",
    ),
}


def list_prompts() -> list[dict]:
    """Return all prompt metadata as a list of dicts (for API serialisation)."""
    return [
        {
            "name": info.name,
            "service": info.service,
            "description": info.description,
            "has_variables": info.has_variables,
            "system_or_user": info.system_or_user,
        }
        for info in PROMPT_REGISTRY.values()
    ]
