"""project_storage domain — Pydantic request/response schemas."""
from __future__ import annotations

from datetime import datetime
from typing import List, Literal, Optional
from uuid import UUID

from pydantic import BaseModel, Field, field_validator

from src.domain.project_storage.models import BucketAccessPolicy

AccessPolicy = Literal["public", "private", "authenticated"]


class CreateBucketRequest(BaseModel):
    name: str = Field(
        ...,
        min_length=1,
        max_length=64,
        pattern=r"^[a-z][a-z0-9-]*$",
        description="Slug, e.g. 'avatars'. Lowercase letters, digits, hyphens.",
    )
    access_policy: AccessPolicy = "private"
    rls_enabled: bool = False
    cdn_enabled: bool = False
    cdn_custom_domain: Optional[str] = Field(None, max_length=253)
    allowed_mime_types: Optional[List[str]] = Field(
        None, description="Null means all types allowed"
    )
    max_file_size_bytes: Optional[int] = Field(None, ge=1)


class UpdateBucketRequest(BaseModel):
    access_policy: Optional[AccessPolicy] = None
    rls_enabled: Optional[bool] = None
    cdn_enabled: Optional[bool] = None
    cdn_custom_domain: Optional[str] = Field(None, max_length=253)
    allowed_mime_types: Optional[List[str]] = None
    max_file_size_bytes: Optional[int] = Field(None, ge=1)
    is_active: Optional[bool] = None


class BucketResponse(BaseModel):
    id: UUID
    project_id: UUID
    name: str
    access_policy: str
    rls_enabled: bool
    cdn_enabled: bool
    cdn_custom_domain: Optional[str] = None
    allowed_mime_types: Optional[List[str]] = None
    max_file_size_bytes: Optional[int] = None
    is_active: bool
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}


class StorageUsageResponse(BaseModel):
    project_id: UUID
    total_bytes: int
    total_files: int
    last_updated_at: Optional[datetime] = None


# ---------------------------------------------------------------------------
# Cloud → Core usage reporting
# ---------------------------------------------------------------------------


class StorageUsageReportRequest(BaseModel):
    """Payload sent by Cloud after a confirmed file upload or delete."""

    project_id: str
    workspace_id: str
    delta_bytes: int = Field(..., description="Positive for upload, negative for delete")
    delta_files: int = Field(..., description="+1 for upload, -1 for delete")
    event: Literal["upload", "delete"]
    file_id: Optional[str] = None
    bucket_name: Optional[str] = None


class StorageUsageAckResponse(BaseModel):
    ok: bool
    total_bytes: int
    total_files: int
