import uuid
from datetime import datetime
from typing import Literal

from pydantic import BaseModel, Field

from app.crud.secrets import NAME_PATTERN


class SecretCreate(BaseModel):
    # Used as {{secret.NAME}} — letters, digits and underscores, not starting
    # with a digit. Can't be changed later (references would break).
    name: str = Field(pattern=NAME_PATTERN)
    description: str | None = Field(default=None, max_length=500)
    value: str = Field(min_length=1, max_length=20_000)


class SecretUpdate(BaseModel):
    description: str | None = Field(default=None, max_length=500)
    # Omitted = keep the current value. There is no way to read it back.
    value: str | None = Field(default=None, min_length=1, max_length=20_000)


class SecretUsage(BaseModel):
    kind: Literal["task", "connector", "data_query"]
    id: uuid.UUID
    name: str


class SecretRead(BaseModel):
    """Everything about a secret except its value — which no endpoint returns."""

    id: uuid.UUID
    name: str
    description: str | None
    created_at: datetime
    updated_at: datetime
    updated_by_name: str | None = None
    used_by: list[SecretUsage] = []
