from __future__ import annotations

from datetime import datetime
from typing import Optional
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field, field_validator

from app.domain.enums import DirectServerStatus, LicenceType


class CamelModel(BaseModel):
    model_config = ConfigDict(populate_by_name=True, use_enum_values=True)


class ActivationRequest(CamelModel):
    licence_key: str = Field(alias="licenceKey", min_length=8, max_length=128)
    installation_id: str = Field(alias="installationID", min_length=8, max_length=128)
    application_version: str = Field(alias="applicationVersion", min_length=1, max_length=80)
    platform: str = Field(min_length=1, max_length=40)

    @field_validator("platform")
    @classmethod
    def supported_platform(cls, value: str) -> str:
        if value != "macOS":
            raise ValueError("unsupported platform")
        return value


class ValidationRequest(CamelModel):
    activation_id: UUID = Field(alias="activationID")
    activation_token: str = Field(alias="activationToken", min_length=16, max_length=256)
    installation_id: str = Field(alias="installationID", min_length=8, max_length=128)
    application_version: str = Field(alias="applicationVersion", min_length=1, max_length=80)
    platform: str = Field(min_length=1, max_length=40)

    @field_validator("platform")
    @classmethod
    def supported_platform(cls, value: str) -> str:
        if value != "macOS":
            raise ValueError("unsupported platform")
        return value


class DeactivationRequest(CamelModel):
    activation_id: UUID = Field(alias="activationID")
    activation_token: str = Field(alias="activationToken", min_length=16, max_length=256)
    installation_id: str = Field(alias="installationID", min_length=8, max_length=128)


class EntitlementResponse(CamelModel):
    status: DirectServerStatus
    licence_type: LicenceType = Field(alias="licenceType")
    application_access: bool = Field(alias="applicationAccess")
    updates_allowed: bool = Field(alias="updatesAllowed")
    support_allowed: bool = Field(alias="supportAllowed")
    subscription_expiry_date: Optional[datetime] = Field(default=None, alias="subscriptionExpiryDate")
    update_entitlement_expiry_date: Optional[datetime] = Field(default=None, alias="updateEntitlementExpiryDate")
    support_entitlement_expiry_date: Optional[datetime] = Field(default=None, alias="supportEntitlementExpiryDate")
    server_time: datetime = Field(alias="serverTime")
    grace_period_ends_at: Optional[datetime] = Field(default=None, alias="gracePeriodEndsAt")
    offline_valid_until: Optional[datetime] = Field(default=None, alias="offlineValidUntil")


class ActivationResponse(CamelModel):
    activation_id: UUID = Field(alias="activationID")
    activation_token: str = Field(alias="activationToken")
    entitlements: EntitlementResponse


class ErrorResponse(CamelModel):
    code: str
    message: str


class EmptyResponse(CamelModel):
    ok: bool = True


class ProvisionedLicence(CamelModel):
    licence_id: UUID = Field(alias="licenceID")
    public_licence_identifier: str = Field(alias="publicLicenceIdentifier")
    licence_key: str = Field(alias="licenceKey")
    licence_type: LicenceType = Field(alias="licenceType")
