"""Experience foundation DTOs — Phase 11.0.""" from __future__ import annotations from datetime import datetime from uuid import UUID from pydantic import BaseModel, ConfigDict, Field from app.models.types import ( LifecycleStatus, ProviderKind, ProviderStatus, RenderEngineStatus, ) from app.schemas.common import ORMBase _FORBID = ConfigDict(extra="forbid") class ExperienceWorkspaceCreate(BaseModel): model_config = _FORBID code: str = Field(max_length=50) name: str = Field(max_length=255) description: str | None = None status: LifecycleStatus = LifecycleStatus.DRAFT legal_name: str | None = Field(default=None, max_length=255) timezone: str = Field(default="Asia/Tehran", max_length=64) language: str = Field(default="fa", max_length=16) currency_code: str = Field(default="IRR", max_length=3) settings: dict | None = None class ExperienceWorkspaceUpdate(BaseModel): model_config = _FORBID name: str | None = Field(default=None, max_length=255) description: str | None = None status: LifecycleStatus | None = None legal_name: str | None = Field(default=None, max_length=255) timezone: str | None = Field(default=None, max_length=64) language: str | None = Field(default=None, max_length=16) currency_code: str | None = Field(default=None, max_length=3) settings: dict | None = None version: int = Field(ge=1) class ExperienceWorkspaceRead(ORMBase): id: UUID tenant_id: UUID code: str name: str description: str | None status: LifecycleStatus legal_name: str | None timezone: str language: str currency_code: str settings: dict | None version: int is_deleted: bool created_by: str | None updated_by: str | None created_at: datetime updated_at: datetime class ExperienceLocaleProfileCreate(BaseModel): model_config = _FORBID workspace_id: UUID code: str = Field(max_length=50) name: str = Field(max_length=255) description: str | None = None status: LifecycleStatus = LifecycleStatus.ACTIVE language: str = Field(default="fa", max_length=16) text_direction: str = Field(default="rtl", max_length=3, pattern="^(rtl|ltr)$") timezone: str | None = Field(default=None, max_length=64) metadata_json: dict | None = None class ExperienceLocaleProfileUpdate(BaseModel): model_config = _FORBID name: str | None = Field(default=None, max_length=255) description: str | None = None status: LifecycleStatus | None = None language: str | None = Field(default=None, max_length=16) text_direction: str | None = Field(default=None, max_length=3, pattern="^(rtl|ltr)$") timezone: str | None = Field(default=None, max_length=64) metadata_json: dict | None = None class ExperienceLocaleProfileRead(ORMBase): id: UUID tenant_id: UUID workspace_id: UUID code: str name: str description: str | None status: LifecycleStatus language: str text_direction: str timezone: str | None metadata_json: dict | None is_deleted: bool created_by: str | None updated_by: str | None created_at: datetime updated_at: datetime class ExternalProviderConfigCreate(BaseModel): model_config = _FORBID workspace_id: UUID | None = None code: str = Field(max_length=50) name: str = Field(max_length=255) provider_kind: ProviderKind = ProviderKind.CUSTOM adapter_key: str = Field(max_length=100) status: ProviderStatus = ProviderStatus.REGISTERED priority: int = Field(default=100, ge=0) credentials_ref: str | None = Field(default=None, max_length=255) config: dict | None = None capabilities: dict | None = None class ExternalProviderConfigUpdate(BaseModel): model_config = _FORBID name: str | None = Field(default=None, max_length=255) provider_kind: ProviderKind | None = None adapter_key: str | None = Field(default=None, max_length=100) status: ProviderStatus | None = None priority: int | None = Field(default=None, ge=0) credentials_ref: str | None = Field(default=None, max_length=255) config: dict | None = None capabilities: dict | None = None version: int = Field(ge=1) class ExternalProviderConfigRead(ORMBase): id: UUID tenant_id: UUID workspace_id: UUID | None code: str name: str provider_kind: ProviderKind adapter_key: str status: ProviderStatus priority: int credentials_ref: str | None config: dict | None capabilities: dict | None version: int is_deleted: bool created_by: str | None updated_by: str | None created_at: datetime updated_at: datetime class RenderEngineRegistrationCreate(BaseModel): model_config = _FORBID workspace_id: UUID | None = None code: str = Field(max_length=50) name: str = Field(max_length=255) adapter_key: str = Field(max_length=100) status: RenderEngineStatus = RenderEngineStatus.REGISTERED is_default: bool = False config: dict | None = None capabilities: dict | None = None class RenderEngineRegistrationUpdate(BaseModel): model_config = _FORBID name: str | None = Field(default=None, max_length=255) adapter_key: str | None = Field(default=None, max_length=100) status: RenderEngineStatus | None = None is_default: bool | None = None config: dict | None = None capabilities: dict | None = None version: int = Field(ge=1) class RenderEngineRegistrationRead(ORMBase): id: UUID tenant_id: UUID workspace_id: UUID | None code: str name: str adapter_key: str status: RenderEngineStatus is_default: bool config: dict | None capabilities: dict | None version: int is_deleted: bool created_by: str | None updated_by: str | None created_at: datetime updated_at: datetime class ExperienceConfigurationCreate(BaseModel): model_config = _FORBID workspace_id: UUID locale_profile_id: UUID | None = None code: str = Field(max_length=50) working_hours: dict | None = None publish_policies: dict | None = None seo_policies: dict | None = None analytics_policies: dict | None = None custom_fields: dict | None = None timezone: str = Field(default="Asia/Tehran", max_length=64) language: str = Field(default="fa", max_length=16) currency_code: str = Field(default="IRR", max_length=3) class ExperienceConfigurationUpdate(BaseModel): model_config = _FORBID locale_profile_id: UUID | None = None working_hours: dict | None = None publish_policies: dict | None = None seo_policies: dict | None = None analytics_policies: dict | None = None custom_fields: dict | None = None timezone: str | None = Field(default=None, max_length=64) language: str | None = Field(default=None, max_length=16) currency_code: str | None = Field(default=None, max_length=3) version: int = Field(ge=1) class ExperienceConfigurationRead(ORMBase): id: UUID tenant_id: UUID workspace_id: UUID locale_profile_id: UUID | None code: str working_hours: dict | None publish_policies: dict | None seo_policies: dict | None analytics_policies: dict | None custom_fields: dict | None timezone: str language: str currency_code: str version: int is_deleted: bool created_by: str | None updated_by: str | None created_at: datetime updated_at: datetime class ExperienceSettingUpsert(BaseModel): model_config = _FORBID workspace_id: UUID | None = None locale_profile_id: UUID | None = None key: str = Field(max_length=100) value: dict | None = None description: str | None = None class ExperienceSettingRead(ORMBase): id: UUID tenant_id: UUID workspace_id: UUID | None locale_profile_id: UUID | None key: str value: dict | None description: str | None is_deleted: bool created_by: str | None updated_by: str | None created_at: datetime updated_at: datetime class ExperienceAuditLogRead(ORMBase): id: UUID tenant_id: UUID entity_type: str entity_id: UUID action: str actor_user_id: str | None changes: dict | None message: str | None created_at: datetime