# =============================================================================
#  license_server/schemas.py — Pydantic v2 request/response schemas
# =============================================================================

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field


# ---------------------------------------------------------------------------
#  Activation
# ---------------------------------------------------------------------------

class ActivationRequest(BaseModel):
    serial:       str = Field(..., pattern=r"^AR-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}$")
    hardware_id:  str = Field(..., min_length=16, max_length=64)
    app_version:  str = Field(default="", max_length=20)
    platform:     str = Field(default="", max_length=20)
    hostname:     str = Field(default="", max_length=120)


class ActivationResponse(BaseModel):
    activation_id: str
    vessel_slot:   int
    licensed_to:   str
    activated_at:  datetime
    expires_at:    Optional[datetime] = None


# ---------------------------------------------------------------------------
#  Validation
# ---------------------------------------------------------------------------

class ValidateResponse(BaseModel):
    serial:        str
    active:        bool
    hardware_id:   str
    activation_id: str
    vessel_slot:   int
    licensed_to:   str
    activated_at:  datetime
    last_seen_at:  datetime


# ---------------------------------------------------------------------------
#  Admin list
# ---------------------------------------------------------------------------

class LicenseAdminRecord(BaseModel):
    serial:       str
    vessel:       str
    issued_at:    datetime
    is_active:    bool
    activations:  int


class ActivationAdminRecord(BaseModel):
    activation_id: str
    serial:        str
    hardware_id:   str
    app_version:   str
    platform:      str
    hostname:      str
    activated_at:  datetime
    last_seen_at:  datetime
    vessel_slot:   int
    revoked:       bool
    licensed_to:   str
