"""Workspaces domain - Pydantic schemas."""
from __future__ import annotations
from datetime import datetime
from typing import Optional
from uuid import UUID

from pydantic import BaseModel, EmailStr


class WorkspaceCreate(BaseModel):
    """Create workspace. Plan selection required - without active subscription, app usage is blocked."""

    name: str
    plan_slug: str  # Required: subscription_plans.slug (e.g. free, basic, pro)


class WorkspaceUpdate(BaseModel):
    """Update workspace."""

    name: Optional[str] = None
    selected_plan_slug: Optional[str] = None  # Change plan before checkout


class WorkspaceResponse(BaseModel):
    """Workspace response."""

    id: UUID
    slug: str
    name: str
    owner_id: Optional[UUID]
    created_at: datetime

    model_config = {"from_attributes": True}


class MemberResponse(BaseModel):
    """Workspace member response."""

    user_id: UUID
    email: str
    name: Optional[str] = None
    avatar_url: Optional[str] = None
    gravatar_url: Optional[str] = None
    role_id: Optional[UUID]
    role_name: Optional[str]
    joined_at: datetime


class PendingInviteResponse(BaseModel):
    """Outstanding workspace invite (no token exposed)."""

    id: UUID
    email: str
    role_name: Optional[str] = None
    invited_by: Optional[UUID] = None
    invited_by_display: Optional[str] = None
    created_at: datetime
    expires_at: datetime


class InviteCreate(BaseModel):
    """Create invite."""

    email: EmailStr
    role: str = "editor"


class InviteCreatedResponse(BaseModel):
    """Invite created; token for manual sharing; email_sent when provider configured."""

    token: str
    email: EmailStr
    expires_in_days: int = 7
    email_sent: bool


class InviteAccept(BaseModel):
    """Accept invite (token in path)."""

    pass


class InvitePreviewResponse(BaseModel):
    """Safe invite metadata available to the unauthenticated invite landing page."""

    email: EmailStr
    role_name: Optional[str] = None


class LocalExecutionUpdate(BaseModel):
    enabled: bool


class LocalExecutionResponse(BaseModel):
    workspace_id: UUID
    enabled: bool
