"""project_storage domain — HTTP routes for bucket management (dashboard / codegen).

Runtime file operations (presign, confirm, download, multipart) live in Cloud pc-gateway.
"""
from __future__ import annotations

from uuid import UUID

from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession

from src.core.database import get_db
from src.core.dependencies import require_active_billing_for_project_id
from src.domain.auth.models import User
from src.domain.auth.router import get_current_user
from src.domain.project_storage.repository import (
    ProjectStorageBucketRepository,
    ProjectStorageUsageRepository,
)
from src.domain.project_storage.schemas import (
    BucketResponse,
    CreateBucketRequest,
    StorageUsageResponse,
    UpdateBucketRequest,
)
from src.domain.project_storage.service import ProjectStorageService
from src.integrations.cloud_control_client import CloudControlClient

router = APIRouter(prefix="/api/projects/{project_id}/storage", tags=["project-storage"])


def _get_service(db: AsyncSession = Depends(get_db)) -> ProjectStorageService:
    return ProjectStorageService(
        bucket_repo=ProjectStorageBucketRepository(db),
        usage_repo=ProjectStorageUsageRepository(db),
        cloud_client=CloudControlClient(),
    )


# ---------------------------------------------------------------------------
# Buckets
# ---------------------------------------------------------------------------


@router.get("/buckets", response_model=list[BucketResponse])
async def list_buckets(
    project_id: UUID = Depends(require_active_billing_for_project_id),
    _: User = Depends(get_current_user),
    svc: ProjectStorageService = Depends(_get_service),
) -> list[BucketResponse]:
    return await svc.list_buckets(project_id)


@router.post("/buckets", response_model=BucketResponse, status_code=201)
async def create_bucket(
    body: CreateBucketRequest,
    project_id: UUID = Depends(require_active_billing_for_project_id),
    _: User = Depends(get_current_user),
    svc: ProjectStorageService = Depends(_get_service),
) -> BucketResponse:
    """Create a named storage bucket. Immediately syncs to Cloud."""
    return await svc.create_bucket(project_id, body)


@router.patch("/buckets/{bucket_name}", response_model=BucketResponse)
async def update_bucket(
    bucket_name: str,
    body: UpdateBucketRequest,
    project_id: UUID = Depends(require_active_billing_for_project_id),
    _: User = Depends(get_current_user),
    svc: ProjectStorageService = Depends(_get_service),
) -> BucketResponse:
    return await svc.update_bucket(project_id, bucket_name, body)


@router.delete("/buckets/{bucket_name}", status_code=204, response_model=None)
async def delete_bucket(
    bucket_name: str,
    project_id: UUID = Depends(require_active_billing_for_project_id),
    _: User = Depends(get_current_user),
    svc: ProjectStorageService = Depends(_get_service),
) -> None:
    """Soft-delete the bucket (marks inactive). Files are not immediately purged."""
    await svc.delete_bucket(project_id, bucket_name)


# ---------------------------------------------------------------------------
# Usage
# ---------------------------------------------------------------------------


@router.get("/usage", response_model=StorageUsageResponse)
async def get_storage_usage(
    project_id: UUID = Depends(require_active_billing_for_project_id),
    _: User = Depends(get_current_user),
    svc: ProjectStorageService = Depends(_get_service),
) -> StorageUsageResponse:
    """Return current storage usage for this project."""
    return await svc.get_usage(project_id)
