from __future__ import annotations

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

from pydantic import Field

from app.domain.enums import ActivationStatus, DirectServerStatus, LicenceStatus, LicenceType
from app.schemas.licensing import CamelModel, EntitlementResponse


class JoomlaCustomerRequest(CamelModel):
    joomla_user_id: str = Field(alias="joomlaUserID", min_length=1, max_length=200)
    email: Optional[str] = Field(default=None, min_length=3, max_length=320)


class JoomlaCustomerResponse(CamelModel):
    customer_id: UUID = Field(alias="customerID")
    external_source: str = Field(alias="externalSource")
    external_customer_id: str = Field(alias="externalCustomerID")
    email: Optional[str] = None


class JoomlaProvisionLicenceRequest(CamelModel):
    joomla_user_id: str = Field(alias="joomlaUserID", min_length=1, max_length=200)
    idempotency_key: str = Field(alias="idempotencyKey", min_length=8, max_length=120)
    licence_type: LicenceType = Field(alias="licenceType")
    activation_limit: int = Field(default=1, alias="activationLimit", ge=1, le=20)
    subscription_expiry: Optional[datetime] = Field(default=None, alias="subscriptionExpiry")
    update_entitlement_expiry: Optional[datetime] = Field(default=None, alias="updateEntitlementExpiry")
    support_entitlement_expiry: Optional[datetime] = Field(default=None, alias="supportEntitlementExpiry")


class JoomlaLicenceSummary(CamelModel):
    licence_id: UUID = Field(alias="licenceID")
    public_licence_identifier: str = Field(alias="publicLicenceIdentifier")
    redacted_licence_key: str = Field(alias="redactedLicenceKey")
    licence_type: LicenceType = Field(alias="licenceType")
    status: LicenceStatus
    activation_limit: int = Field(alias="activationLimit")
    active_activation_count: int = Field(alias="activeActivationCount")
    subscription_expiry: Optional[datetime] = Field(default=None, alias="subscriptionExpiry")
    update_entitlement_expiry: Optional[datetime] = Field(default=None, alias="updateEntitlementExpiry")
    support_entitlement_expiry: Optional[datetime] = Field(default=None, alias="supportEntitlementExpiry")
    entitlements: EntitlementResponse


class JoomlaProvisionLicenceResponse(CamelModel):
    created: bool
    plaintext_licence_key: Optional[str] = Field(default=None, alias="plaintextLicenceKey")
    licence: JoomlaLicenceSummary


class JoomlaLicenceListResponse(CamelModel):
    customer: JoomlaCustomerResponse
    licences: list[JoomlaLicenceSummary]


class JoomlaActivationSummary(CamelModel):
    activation_id: UUID = Field(alias="activationID")
    installation_reference: str = Field(alias="installationReference")
    status: ActivationStatus
    activated_at: datetime = Field(alias="activatedAt")
    last_validated_at: Optional[datetime] = Field(default=None, alias="lastValidatedAt")
    deactivated_at: Optional[datetime] = Field(default=None, alias="deactivatedAt")


class JoomlaLicenceDetailResponse(CamelModel):
    licence: JoomlaLicenceSummary
    activations: list[JoomlaActivationSummary]


class JoomlaRemoteDeactivateRequest(CamelModel):
    joomla_user_id: str = Field(alias="joomlaUserID", min_length=1, max_length=200)
    activation_id: UUID = Field(alias="activationID")


class JoomlaRemoteDeactivateResponse(CamelModel):
    ok: bool = True
    entitlement_status: DirectServerStatus = Field(alias="entitlementStatus")
