"""Center configuration versions (append-only; exactly one active per center)."""

from __future__ import annotations

import json
from pathlib import Path

from fastapi import HTTPException
from psycopg import Connection

from .db import Jsonb, fetchone

DEFAULT_CONFIG_PATH = Path(__file__).resolve().parent / "data" / "default-config.json"


def default_config() -> dict:
    return json.loads(DEFAULT_CONFIG_PATH.read_text())


def active_config(conn: Connection, center_id: int) -> dict:
    row = fetchone(
        conn,
        "SELECT id, version, status, config, rationale, approved_at FROM center_configs WHERE center_id = %s AND status = 'active'",
        (center_id,),
    )
    if not row:
        raise HTTPException(409, "This center has no active configuration yet.")
    return row


def config_by_id(conn: Connection, config_id: int) -> dict:
    row = fetchone(conn, "SELECT * FROM center_configs WHERE id = %s", (config_id,))
    if not row:
        raise HTTPException(404, "Config not found")
    return row


def seed_default(conn: Connection, center_id: int, user_id: int | None = None) -> int:
    """Create config version 1 (active) from the shipped default, if none exists."""
    existing = fetchone(conn, "SELECT id FROM center_configs WHERE center_id = %s ORDER BY version LIMIT 1", (center_id,))
    if existing:
        return existing["id"]
    row = fetchone(
        conn,
        """INSERT INTO center_configs (center_id, version, status, config, rationale, created_by, approved_by, approved_at)
           VALUES (%s, 1, 'active', %s, %s, %s, %s, now()) RETURNING id""",
        (
            center_id,
            Jsonb(default_config()),
            "Default configuration seeded from the USDA FS Forecast Guidance and CMAH (Statham et al. 2018).",
            user_id,
            user_id,
        ),
    )
    return row["id"]
