"""Persisted weekly owner-card field codec."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Final, TypeVar, override

from pydantic import JsonValue, TypeAdapter

from .nutrition_weekly_owner_card import weekly_owner_card_fields_whitelisted


_RecordValue = TypeVar("_RecordValue")
WEEKLY_OWNER_CARD_RECORD_ADAPTER: Final[TypeAdapter[dict[str, JsonValue]]] = TypeAdapter(
    dict[str, JsonValue]
)


@dataclass(frozen=True, slots=True)
class WeeklyOwnerCardRecordError(ValueError):
    @override
    def __str__(self) -> str:
        return "weekly owner card field is malformed"


def weekly_owner_card_from_record(record: dict[str, _RecordValue]) -> str | None:
    value = record.get("owner_card_text")
    return value if isinstance(value, str) else None


def validate_weekly_owner_card_record(record: dict[str, _RecordValue]) -> None:
    if "owner_card_text" not in record:
        return
    value = record["owner_card_text"]
    if not isinstance(value, str) or not weekly_owner_card_fields_whitelisted(value):
        raise WeeklyOwnerCardRecordError()
