from datetime import UTC, datetime
from enum import StrEnum
from typing import NewType, Self
from uuid import UUID

from uuid_utils.compat import uuid7

from template_project.application.common.entity import Entity, to_entity
from template_project.application.user.entity import UserId

AuthIdentityId = NewType("AuthIdentityId", UUID)


class AuthMethod(StrEnum):
    EMAIL = "email"
    YANDEX = "yandex"


@to_entity
class AuthIdentity(Entity[AuthIdentityId]):
    user_id: UserId
    method: AuthMethod
    identifier: str
    secret_key: str | None

    @classmethod
    def factory(
        cls,
        user_id: UserId,
        method: AuthMethod,
        identifier: str,
        secret_key: str | None = None,
    ) -> Self:
        return cls(
            id=AuthIdentityId(uuid7()),
            user_id=user_id,
            method=method,
            identifier=identifier,
            secret_key=secret_key,
            created_at=datetime.now(tz=UTC),
        )
