"""Composition-time chart spec. No chart_definition Cloud record."""

from __future__ import annotations

from typing import Literal

from pydantic import BaseModel, ConfigDict, Field

from src.domain.datasets.contract import DatasetContract

CHART_TYPES_V1 = ("bar", "line", "pie", "area")
ChartType = Literal["bar", "line", "pie", "area"]

STARTER_BY_CHART_TYPE: dict[str, str] = {
    "bar": "chart.bar",
    "line": "chart.line",
    "pie": "chart.pie",
    "area": "chart.area",
}


class ChartEncoding(BaseModel):
    model_config = ConfigDict(extra="forbid")
    x: str
    y: str
    series: str | None = None


class ChartSpec(BaseModel):
    """Installed product composition, not a staff-authored saved chart."""

    model_config = ConfigDict(extra="forbid")
    schema_version: Literal[1] = 1
    id: str = Field(min_length=1)
    variant: ChartType = "bar"
    dataset: DatasetContract | str
    encoding: ChartEncoding
    title: str | None = None

    @property
    def starter_contract(self) -> str:
        return STARTER_BY_CHART_TYPE[self.variant]


def dataset_ref_or_inline(dataset: DatasetContract | str) -> str:
    if isinstance(dataset, str):
        return dataset
    return dataset.id
