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

from datetime import date, datetime
from decimal import Decimal
from typing import Any, Optional
from uuid import UUID

from pydantic import BaseModel


class UsageMetrics(BaseModel):
    cpu_minutes: float = 0
    db_reads: int = 0
    db_writes: int = 0
    storage_gb: float = 0
    cdn_gb: float = 0
    hosted_app_requests: int = 0
    hosted_app_egress_bytes: int = 0
    auth_users_active: int = 0
    ai_embed_tokens: int = 0
    ai_completion_tokens: int = 0
    ai_searches: int = 0
    job_executions: int = 0
    realtime_minutes: float = 0
    ext_queries: int = 0
    credits_consumed: float = 0


class CurrentUsageResponse(BaseModel):
    """Live usage counters from Redis for the current billing period."""
    workspace_id: UUID
    billing_period_start: date
    billing_period_end: date
    metrics: UsageMetrics
    plan_credits: Optional[float] = None
    credits_used_pct: Optional[float] = None


class UsageSnapshotResponse(BaseModel):
    workspace_id: UUID
    snapshot_date: date
    metrics: UsageMetrics
    created_at: datetime

    model_config = {"from_attributes": True}


class ProjectUsageBreakdownResponse(BaseModel):
    project_id: UUID
    project_name: Optional[str] = None
    credits_consumed: float
    job_executions: int
    ai_completion_tokens: int
    ai_embed_tokens: int
    ext_queries: int


class ProjectHostedAppUsageSnapshotResponse(BaseModel):
    project_id: UUID
    snapshot_date: date
    requests: int
    egress_bytes: int
    created_at: datetime


class ProjectHostedAppUsageHistoryResponse(BaseModel):
    project_id: UUID
    snapshots: list[ProjectHostedAppUsageSnapshotResponse]


class WorkspaceUsageHistoryResponse(BaseModel):
    workspace_id: UUID
    snapshots: list[UsageSnapshotResponse]


# AI usage report from Cloud (POST /v1/cloud/usage/ai)
class AIUsageReportRequest(BaseModel):
    project_id: str
    workspace_id: str
    usage_type: str  # embed_tokens | completion_input_tokens | completion_output_tokens | search_queries
    count: int
    model: Optional[str] = None
    is_byok: bool = False


class AIUsageAckResponse(BaseModel):
    ok: bool
    credits_remaining: Optional[float] = None
