from pydantic import BaseModel, EmailStr
from typing import Optional
from datetime import datetime


class ContactRequest(BaseModel):
    name: str
    email: EmailStr
    company: Optional[str] = None
    message: str
    website: Optional[str] = ""  # honeypot: si viene relleno, es un bot


class TokenRequest(BaseModel):
    api_key: str


class TokenResponse(BaseModel):
    access_token: str
    token_type: str = "bearer"
    expires_in: int = 900
    client_id: str


class ConvertOptions(BaseModel):
    include_metadata: bool = False
    validate_output: bool = True


class ConvertRequest(BaseModel):
    message: str
    format: str = "MT940"
    options: ConvertOptions = ConvertOptions()


class ClientCreate(BaseModel):
    name: str
    email: EmailStr
    rate_limit_per_min: int = 100
    scopes: list[str] = ["convert"]


class ClientResponse(BaseModel):
    id: str
    name: str
    email: str
    rate_limit_per_min: int
    scopes: str
    active: bool
    created_at: datetime
    credits_remaining: Optional[int] = None
    credits_expire_at: Optional[datetime] = None

    class Config:
        from_attributes = True


class ClientCreateResponse(ClientResponse):
    api_key: str


class PackageGrant(BaseModel):
    credits: int
    days_valid: int = 90


class MeResponse(BaseModel):
    client_id: str
    name: str
    credits_remaining: Optional[int] = None
    credits_expire_at: Optional[datetime] = None


class AuditLogResponse(BaseModel):
    id: str
    request_id: str
    client_id: str
    timestamp: datetime
    format_in: str
    status: str
    error_detail: Optional[str]
    duration_ms: int
    ip_address: str

    class Config:
        from_attributes = True


class HealthResponse(BaseModel):
    status: str
    version: str
    db: str
    uptime_s: int


class ErrorResponse(BaseModel):
    error: str
    detail: str
    request_id: str
