import uuid
from datetime import datetime

from pydantic import AliasChoices, BaseModel, ConfigDict, Field, computed_field


class WorkplanDependencyCreate(BaseModel):
    to_workplan_id: uuid.UUID | None = Field(
        default=None,
        validation_alias=AliasChoices("to_workplan_id", "to_workstream_id"),
    )
    to_task_id: uuid.UUID | None = None
    relationship_type: str = "blocks"
    description: str | None = None


class WorkplanDependencyRead(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: uuid.UUID
    from_workplan_id: uuid.UUID
    to_workplan_id: uuid.UUID | None = None
    to_task_id: uuid.UUID | None = None
    relationship_type: str
    description: str | None = None
    created_at: datetime
    updated_at: datetime


class WorkplanDepStub(BaseModel):
    """Minimal projection of the other end of a dependency edge."""
    dep_id: uuid.UUID
    target_type: str = "workplan"
    relationship_type: str = "blocks"
    workplan_id: uuid.UUID | None = Field(
        default=None,
        validation_alias=AliasChoices("workplan_id", "workstream_id"),
    )
    workplan_slug: str | None = Field(
        default=None,
        validation_alias=AliasChoices("workplan_slug", "workstream_slug"),
    )
    workplan_title: str | None = Field(
        default=None,
        validation_alias=AliasChoices("workplan_title", "workstream_title"),
    )
    task_id: uuid.UUID | None = None
    task_title: str | None = None
    description: str | None = None

    @computed_field  # type: ignore[prop-decorator]
    @property
    def workstream_id(self) -> uuid.UUID | None:
        return self.workplan_id

    @computed_field  # type: ignore[prop-decorator]
    @property
    def workstream_slug(self) -> str | None:
        return self.workplan_slug

    @computed_field  # type: ignore[prop-decorator]
    @property
    def workstream_title(self) -> str | None:
        return self.workplan_title