import uuid
from datetime import datetime
from typing import Literal

from pydantic import BaseModel, ConfigDict, Field

AppItemType = Literal["master", "form", "workflow", "task", "page", "dashboard", "menu"]


class AppItemRef(BaseModel):
    type: AppItemType
    id: uuid.UUID


class AppCreate(BaseModel):
    name: str = Field(min_length=1, max_length=200)
    description: str | None = Field(default=None, max_length=1000)
    items: list[AppItemRef] = []


class AppUpdate(BaseModel):
    name: str | None = Field(default=None, min_length=1, max_length=200)
    description: str | None = Field(default=None, max_length=1000)
    items: list[AppItemRef] | None = None


class AppRead(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: uuid.UUID
    tenant_id: uuid.UUID
    name: str
    description: str | None
    items: list[AppItemRef]
    created_by: uuid.UUID | None
    created_at: datetime
    updated_at: datetime


class AppImportResult(BaseModel):
    """Returned after POST /apps/import — created counts per entity type plus
    any references that couldn't be carried over (see crud/app_bundle.py's
    remap rules: connector_id is always cleared, an out-of-bundle reference
    is always left pointing at its old id)."""

    created: dict[str, int]
    # Items an earlier import of the same source environment had created,
    # updated in place of new copies (see crud/app_bundle.py::import_bundle).
    updated: dict[str, int] = {}
    warnings: list[str]
