"""AutoIndexer field suggestion based on project context."""

from __future__ import annotations

import json
import logging
from typing import Any

from crystallise.prompts.indexer import SUGGEST_FIELDS_SYSTEM_PROMPT

logger = logging.getLogger(__name__)


async def suggest_fields(
    project_description: str = "",
    research_questions: list[str] | None = None,
    pico: dict | None = None,
    sample_records: list[dict[str, Any]] | None = None,
    existing_fields: list[str] | None = None,
    model: str = "gpt-4.1",
) -> tuple[list[dict], list[dict]]:
    """Suggest indexing fields based on project context."""
    from crystallise.llm.client import async_chat_completion

    parts = []
    if existing_fields:
        parts.append(f"Fields to describe: {json.dumps(existing_fields)}")
    if project_description:
        parts.append(f"Project description: {project_description}")
    if research_questions:
        parts.append(f"Research questions: {'; '.join(research_questions)}")
    if pico:
        parts.append(f"PICO elements: {json.dumps(pico)}")
    if sample_records:
        sample = sample_records[:3]
        parts.append(
            f"Sample records ({len(sample_records)} total, showing first {len(sample)}):\n{json.dumps(sample, indent=2)}"
        )

    user_prompt = "\n\n".join(parts) if parts else "Suggest standard systematic review extraction fields."

    if existing_fields:
        from crystallise.prompts.indexer import DESCRIBE_FIELDS_SYSTEM_PROMPT

        system_prompt = DESCRIBE_FIELDS_SYSTEM_PROMPT
    else:
        system_prompt = SUGGEST_FIELDS_SYSTEM_PROMPT

    content = await async_chat_completion(
        system_message=system_prompt,
        prompt=user_prompt,
        model=model,
        max_completion_tokens=4096,
    )

    if not content:
        return [], []

    # Parse response using shared utility
    from crystallise.common.json_utils import parse_llm_json, LLMParseError

    try:
        data = parse_llm_json(content)
    except LLMParseError:
        logger.warning("Failed to parse field suggestions as JSON")
        return [], []

    if isinstance(data, dict) and "fields" in data:
        return data["fields"], data.get("warnings", [])
    if isinstance(data, list):
        return data, []
    return [], []
