"""Pydantic request/response models for the HTTP layer."""

from __future__ import annotations

from datetime import datetime
from decimal import Decimal
from enum import Enum
from typing import Optional

from pydantic import BaseModel, ConfigDict, EmailStr, Field


class TierName(str, Enum):
    lite = "lite"
    core = "core"
    pro = "pro"
    enterprise = "enterprise"


class MintRequest(BaseModel):
    name: str = Field(min_length=1, max_length=200)
    email: EmailStr
    tier: TierName
    years: int = Field(default=1, ge=1, le=10)
    source: str = Field(default="manual", min_length=1, max_length=40)
    source_order_id: Optional[str] = Field(default=None, max_length=120)
    promotion: Optional[str] = Field(default=None, max_length=60)
    amount_paid: Optional[Decimal] = Field(default=None, ge=0, decimal_places=2)
    currency: Optional[str] = Field(default="USD", min_length=3, max_length=3)
    notes: Optional[str] = Field(default=None, max_length=2000)


class RevokeRequest(BaseModel):
    license_key: str = Field(min_length=1, max_length=120)
    reason: Optional[str] = Field(default=None, max_length=500)


class LicenseResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    license_key: str
    name: str
    email: str
    tier: str
    issued_at: datetime
    expires_at: datetime
    blob: str
    source: str
    source_order_id: Optional[str]
    promotion: Optional[str]
    amount_paid: Optional[Decimal]
    currency: Optional[str]
    revoked_at: Optional[datetime]
    notes: Optional[str]
