"""Unified prompt loader — API + CSV/JSON + inline defaults."""
from __future__ import annotations


from openai import OpenAI

from crystallise.openai_resources.prompts import (
    fetch_prompt_details,
    load_prompts,
)


def resolve_prompt(
    *,
    client: OpenAI | None = None,
    request_override: str | None = None,
    config_prompt_id: str | None = None,
    config_prompt_version: str | None = None,
    inline_default: str | None = None,
) -> str | None:
    """
    Resolve a prompt from multiple sources in priority order:
    1. Request override (explicit per-request)
    2. OpenAI Prompts API (via config prompt_id)
    3. Local CSV/JSON file
    4. Inline default (hardcoded in service)
    """
    if request_override:
        return request_override

    if config_prompt_id and client:
        try:
            details = fetch_prompt_details(
                client, config_prompt_id, config_prompt_version
            )
            if details.get("system_message"):
                return details["system_message"]
        except Exception:
            pass

    # Try local prompts file
    prompts_df = load_prompts()
    if prompts_df is not None and not prompts_df.empty and config_prompt_id:
        row = prompts_df[prompts_df.get("PromptID", prompts_df.get("api_id", "")) == config_prompt_id]
        if not row.empty:
            for col in ("SystemMessage", "system_message"):
                if col in row.columns:
                    val = row.iloc[0][col]
                    if val and str(val) != "nan":
                        return str(val)

    return inline_default
