from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel, Field
from src.core.utils.enums import ApiKeyEnvironment, ApiKeyScope


class CreateApiKeyRequest(BaseModel):
    display_name: str = Field(..., min_length=1, max_length=100)
    environment: ApiKeyEnvironment = ApiKeyEnvironment.LIVE
    scopes: List[ApiKeyScope] = Field(..., min_length=1)
    allowed_ips: Optional[List[str]] = None
    expires_at: Optional[datetime] = None


class ApiKeyCreatedResponse(BaseModel):
    id: int
    key_id: str
    api_key: str
    key_prefix: str
    environment: ApiKeyEnvironment
    scopes: List[str]
    display_name: str
    created_at: datetime

    class Config:
        from_attributes = True


class ApiKeyResponse(BaseModel):
    id: int
    key_id: str
    key_prefix: str
    environment: ApiKeyEnvironment
    scopes: List[str]
    display_name: str
    is_active: bool
    last_used_at: Optional[datetime] = None
    expires_at: Optional[datetime] = None
    created_at: datetime
    revoked_at: Optional[datetime] = None

    class Config:
        from_attributes = True


class UpdateApiKeyRequest(BaseModel):
    display_name: Optional[str] = Field(None, max_length=100)
    scopes: Optional[List[ApiKeyScope]] = None
    allowed_ips: Optional[List[str]] = None
    expires_at: Optional[datetime] = None
