from __future__ import annotations

from datetime import datetime

from uuid import UUID

from sqlalchemy.orm import Session

from app.core.security import generate_licence_key
from app.domain.enums import LicenceEventType, LicenceStatus, LicenceType
from app.models.entities import Licence
from app.repositories.licensing import LicensingRepository
from app.schemas.licensing import ProvisionedLicence


class ProvisioningService:
    def __init__(self, session: Session):
        self.session = session
        self.repository = LicensingRepository(session)

    def create_licence(
        self,
        licence_type: LicenceType,
        activation_limit: int = 1,
        subscription_expiry: datetime | None = None,
        update_entitlement_expiry: datetime | None = None,
        support_entitlement_expiry: datetime | None = None,
        customer_id: UUID | None = None,
    ) -> ProvisionedLicence:
        generated = generate_licence_key()
        licence = Licence(
            public_licence_identifier=generated.public_identifier,
            licence_key_suffix=generated.suffix,
            licence_key_hash=generated.hashed,
            licence_type=licence_type,
            status=LicenceStatus.ACTIVE,
            activation_limit=activation_limit,
            customer_id=customer_id,
            subscription_expiry=subscription_expiry,
            update_entitlement_expiry=update_entitlement_expiry,
            support_entitlement_expiry=support_entitlement_expiry,
        )
        self.repository.add_licence(licence)
        self.repository.add_event(
            event_type=LicenceEventType.LICENCE_CREATED,
            result="succeeded",
            licence=licence,
        )
        self.session.commit()
        return ProvisionedLicence(
            licence_id=licence.id,
            public_licence_identifier=licence.public_licence_identifier,
            licence_key=generated.plaintext,
            licence_type=licence.licence_type,
        )
