from __future__ import annotations
from datetime import datetime
from typing import Optional, Literal
from uuid import UUID
from pydantic import BaseModel, Field


class DomainConnectRequest(BaseModel):
    domain: str = Field(min_length=3, max_length=255)

class DomainSearchResponse(BaseModel):
    result: dict

class DomainCheckRequest(BaseModel):
    domain: str = Field(min_length=3, max_length=255)

class DomainCheckoutRequest(BaseModel):
    domain: str = Field(min_length=3, max_length=255)
    registrant: dict
    years: int = Field(default=1, ge=1, le=10)
    auto_renew: bool = True
    idempotency_key: Optional[str] = None


class DomainAssignmentCreate(BaseModel):
    project_id: UUID
    hostname: Optional[str] = None
    subdomain: Optional[str] = None
    environment: Literal["production", "preview", "staging"] = "production"


class DomainAssignmentResponse(BaseModel):
    id: UUID
    domain_id: UUID
    project_id: UUID
    hostname: str
    environment: str
    assignment_status: str
    dns_status: str
    tls_status: str
    created_at: datetime
    model_config = {"from_attributes": True}


class WorkspaceDomainResponse(BaseModel):
    id: UUID
    workspace_id: UUID
    domain_name: str
    domain_type: str
    registrar_provider: Optional[str]
    dns_provider: Optional[str]
    registration_status: str
    transfer_status: str
    verification_status: str
    expires_at: Optional[datetime]
    auto_renew: Optional[bool]
    nameserver_status: str
    verification_record: Optional[dict] = None
    renewal_authorized: bool = False
    assignments: list[DomainAssignmentResponse] = []
    model_config = {"from_attributes": True}


class DomainCapabilitiesResponse(BaseModel):
    registration: bool
    transfer_in: bool
    renewal: bool
    dns_management: bool
    reason: Optional[str] = None
