"""Dropbox import test API — enqueue Cloud jobs and list stored assets."""
from __future__ import annotations

from typing import Optional

from pydantic import BaseModel, Field, field_validator


DROPBOX_IMPORT_BUCKET = "dropbox-imports"


class StartDropboxImportRequest(BaseModel):
    dropbox_url: str = Field(..., min_length=8, max_length=2048)
    bucket_name: str = Field(default=DROPBOX_IMPORT_BUCKET, pattern=r"^[a-z][a-z0-9-]*$")
    extract_archive: bool = False
    idempotency_key: Optional[str] = Field(None, max_length=128)

    @field_validator("dropbox_url", mode="before")
    @classmethod
    def normalize_dropbox_url(cls, value: object) -> str:
        raw = str(value or "").strip()
        if not raw:
            raise ValueError("dropbox_url is required")
        if not raw.startswith(("http://", "https://")):
            raw = f"https://{raw}"
        if "dropbox.com" not in raw.lower():
            raise ValueError("dropbox_url must be a dropbox.com shared link")
        return raw


class DropboxImportJobResponse(BaseModel):
    job_id: str
    status: str
    poll_url: Optional[str] = None


class StartArchiveExtractRequest(BaseModel):
    bucket_name: str = Field(default=DROPBOX_IMPORT_BUCKET, pattern=r"^[a-z][a-z0-9-]*$")
    idempotency_key: Optional[str] = Field(None, max_length=128)
    entry_offset: int = Field(default=0, ge=0)


class ArchiveExtractJobResponse(BaseModel):
    job_id: str
    status: str
    poll_url: Optional[str] = None
    source_file_id: str


class StorageAssetResponse(BaseModel):
    id: str
    filename: str
    content_type: Optional[str] = None
    size_bytes: Optional[int] = None
    status: str
    created_at: Optional[str] = None
    is_archive: bool = False
    public_url: Optional[str] = None


class StorageAssetsListResponse(BaseModel):
    bucket_name: str
    files: list[StorageAssetResponse]
    next_cursor: Optional[str] = None
    access_policy: str = "private"
    cdn_base_url: Optional[str] = None
    public_urls_enabled: bool = False


class AssetAccessUrlResponse(BaseModel):
    file_id: str
    url: str
    url_type: str  # "cdn" | "presigned"
    expires_in: Optional[int] = None


class DropboxBucketSettingsResponse(BaseModel):
    bucket_name: str
    access_policy: str
    cdn_enabled: bool
    cdn_base_url: Optional[str] = None
    public_urls_enabled: bool = False


class UpdateDropboxBucketSettingsRequest(BaseModel):
    bucket_name: str = Field(default=DROPBOX_IMPORT_BUCKET, pattern=r"^[a-z][a-z0-9-]*$")
    public_urls_enabled: bool = False
    cdn_base_url: Optional[str] = Field(None, max_length=512)

    @field_validator("cdn_base_url", mode="before")
    @classmethod
    def normalize_cdn_base(cls, value: object) -> Optional[str]:
        if value is None or value == "":
            return None
        raw = str(value).strip().rstrip("/")
        if not raw:
            return None
        if not raw.startswith(("http://", "https://")):
            raw = f"https://{raw}"
        return raw


class DeleteStorageAssetResponse(BaseModel):
    ok: bool = True
    file_id: str
