"""EX-B2-07: rules are deliberately concentrated in the wrong layer."""

from datetime import date
from typing import Self

from pydantic import BaseModel, model_validator


EXISTING_REFERENCES = {"EXP-100"}  # External state: do not read from validators.


class RecordInput(BaseModel):
    reference: str
    priority: int
    opened_on: date
    closed_on: date | None = None

    @model_validator(mode="after")
    def validate_everything(self) -> Self:
        # TODO: classify and relocate each rule before changing code.
        if not self.reference.startswith("EXP-"):
            raise ValueError("reference prefix")
        self.reference = self.reference.strip().upper()
        if not 1 <= self.priority <= 5:
            raise ValueError("priority range")
        if self.closed_on is not None and self.closed_on < self.opened_on:
            raise ValueError("period order")
        if self.reference in EXISTING_REFERENCES:
            raise ValueError("duplicate reference")
        return self
