"""Schemas for AI provider credential CRUD endpoints."""

from __future__ import annotations

from datetime import datetime
from uuid import UUID

from sqlmodel import SQLModel

RUNTIME_ANNOTATION_TYPES = (datetime, UUID)


class ProviderCredentialCreate(SQLModel):
    provider: str
    account_key: str
    display_name: str = ""
    api_key: str | None = None
    session_key: str | None = None   # Claude.ai / ChatGPT session token for subscription usage
    base_url: str | None = None
    active: bool = True


class ProviderCredentialTestRequest(SQLModel):
    provider: str
    account_key: str = "test"
    api_key: str | None = None
    session_key: str | None = None
    base_url: str | None = None


class ProviderCredentialUpdate(SQLModel):
    display_name: str | None = None
    api_key: str | None = None        # None = keep existing; "" = clear it
    session_key: str | None = None    # None = keep existing; "" = clear it
    base_url: str | None = None
    active: bool | None = None


class SubscriptionWindowRead(SQLModel):
    """One subscription-plan usage window from a session/OAuth token."""

    key: str           # "five_hour" | "seven_day" | "seven_day_sonnet" | etc.
    label: str         # "Current session" | "All models" | "Sonnet" | "3h" | "Week"
    pct_used: float    # 0–100
    reset_in_ms: int | None = None
    source: str = "provider_native"
    confidence: str = "high"


class TokenWindowRead(SQLModel):
    limit: int | None = None
    remaining: int | None = None
    used: int | None = None
    pct_used: float | None = None
    reset_at: str | None = None      # ISO 8601 UTC
    reset_in_ms: int | None = None   # ms until reset


class RequestWindowRead(SQLModel):
    limit: int | None = None
    remaining: int | None = None
    reset_at: str | None = None
    reset_in_ms: int | None = None


class ProviderUsageLiveRead(SQLModel):
    """Real-time token usage and rate limit data fetched directly from the provider API."""

    provider: str
    account_key: str
    checked_at: str           # ISO 8601 UTC
    reachable: bool
    source: str  # provider_native | provider_api_rate_limit | local_jsonl_estimate | configured_limit
    confidence: str  # high | medium | low
    error: str | None = None
    tokens: TokenWindowRead
    input_tokens: TokenWindowRead   # Anthropic input-only window
    output_tokens: TokenWindowRead  # Anthropic output-only window
    requests: RequestWindowRead
    # Subscription usage windows — populated when session_key is configured
    subscription_windows: list[SubscriptionWindowRead] = []
    subscription_plan: str | None = None  # e.g. "pro", "plus ($15.00)"
    models: list[str] = []
    sample_model: str | None = None
    sample_input_tokens: int | None = None
    sample_output_tokens: int | None = None
    sample_latency_ms: int | None = None
    # Optional debugging aid: exact rate-limit header names returned by provider.
    debug_rate_limit_headers: list[str] | None = None


class ProviderCredentialRead(SQLModel):
    """Safe read schema — api_key and session_key are never included."""

    id: UUID
    organization_id: UUID
    provider: str
    account_key: str
    display_name: str
    api_key_last_four: str | None
    has_api_key: bool
    session_key_last_four: str | None = None
    has_session_key: bool = False
    base_url: str | None
    active: bool
    created_at: datetime
    updated_at: datetime
