from __future__ import annotations

from datetime import datetime
from typing import Any, Optional
from uuid import UUID

from pydantic import BaseModel, Field


class CodegenProviderResponse(BaseModel):
    id: UUID; slug: str; display_name: str; adapter_key: str; executable: str
    enabled: bool; available_p2hs: bool; available_byok: bool; install_strategy_key: str
    metadata_json: dict[str, Any]; created_at: datetime; updated_at: datetime
    model_config = {"from_attributes": True}


class CodegenModelResponse(BaseModel):
    id: UUID; provider_id: UUID; model_key: str; display_name: str; cli_model_value: str
    enabled: bool; available_p2hs: bool; available_byok: bool; is_default: bool; is_recommended: bool
    context_window: Optional[int]; capabilities_json: dict[str, Any]
    model_config = {"from_attributes": True}


class CodegenProviderCreate(BaseModel):
    slug: str = Field(min_length=1, max_length=64); display_name: str = Field(min_length=1, max_length=120)
    adapter_key: str; executable: str; install_strategy_key: str
    enabled: bool = True; available_p2hs: bool = True; available_byok: bool = True; metadata_json: dict[str, Any] = Field(default_factory=dict)


class CodegenProviderUpdate(BaseModel):
    display_name: Optional[str] = None; adapter_key: Optional[str] = None; executable: Optional[str] = None
    install_strategy_key: Optional[str] = None; enabled: Optional[bool] = None; available_p2hs: Optional[bool] = None; available_byok: Optional[bool] = None; metadata_json: Optional[dict[str, Any]] = None


class CodegenModelCreate(BaseModel):
    model_key: str; display_name: str; cli_model_value: str; enabled: bool = True; available_p2hs: bool = True; available_byok: bool = True; is_default: bool = False; is_recommended: bool = False; context_window: Optional[int] = None; capabilities_json: dict[str, Any] = Field(default_factory=dict)


class CodegenModelUpdate(BaseModel):
    model_key: Optional[str] = None; display_name: Optional[str] = None; cli_model_value: Optional[str] = None; enabled: Optional[bool] = None; available_p2hs: Optional[bool] = None; available_byok: Optional[bool] = None; is_default: Optional[bool] = None; is_recommended: Optional[bool] = None; context_window: Optional[int] = None; capabilities_json: Optional[dict[str, Any]] = None


class CodegenCredentialResponse(BaseModel):
    id: UUID; workspace_id: UUID; provider_id: UUID; label: str; status: str; last_four: Optional[str]; validation_status: str; validated_at: Optional[datetime]; created_at: datetime; updated_at: datetime
    model_config = {"from_attributes": True}


class CodegenCredentialCreate(BaseModel):
    provider_id: UUID; label: str = Field(min_length=1, max_length=120); api_key: str = Field(min_length=1)


class CodegenConfigResponse(BaseModel):
    provider_id: Optional[UUID] = None; model_id: Optional[UUID] = None; credential_id: Optional[UUID] = None; funding_source: str = "p2hs"


class CodegenConfigUpdate(BaseModel):
    provider_id: Optional[UUID] = None; model_id: Optional[UUID] = None; credential_id: Optional[UUID] = None; funding_source: str = "p2hs"
