"""API access status"""

# pylint: disable=too-few-public-methods
import datetime
import typing
import strawberry

from strawberry.types import Info
from selfprivacy_api.actions.api_tokens import (
    get_api_tokens_with_caller_flag,
    get_api_recovery_token_status,
)
from selfprivacy_api.graphql import IsAuthenticated
from selfprivacy_api.dependencies import get_api_version as get_api_version_dependency


def get_api_version() -> str:
    """Get API version"""
    return get_api_version_dependency()


@strawberry.type
class ApiDevice:
    """A single device with SelfPrivacy app installed"""

    name: str
    creation_date: datetime.datetime
    is_caller: bool


@strawberry.type
class ApiRecoveryKeyStatus:
    """Recovery key status"""

    exists: bool
    valid: bool
    creation_date: typing.Optional[datetime.datetime]
    expiration_date: typing.Optional[datetime.datetime]
    uses_left: typing.Optional[int]


def get_recovery_key_status() -> ApiRecoveryKeyStatus:
    """Get recovery key status, times are timezone-aware"""
    status = get_api_recovery_token_status()
    if status is None or not status.exists:
        return ApiRecoveryKeyStatus(
            exists=False,
            valid=False,
            creation_date=None,
            expiration_date=None,
            uses_left=None,
        )
    return ApiRecoveryKeyStatus(
        exists=True,
        valid=status.valid,
        creation_date=status.date,
        expiration_date=status.expiration,
        uses_left=status.uses_left,
    )


@strawberry.type
class Api:
    """API access status"""

    version: str = strawberry.field(resolver=get_api_version)

    @strawberry.field(permission_classes=[IsAuthenticated])
    def devices(self, info: Info) -> typing.List[ApiDevice]:
        return [
            ApiDevice(
                name=device.name,
                creation_date=device.date,
                is_caller=device.is_caller,
            )
            for device in get_api_tokens_with_caller_flag(
                info.context["request"]
                .headers.get("Authorization", "")
                .replace("Bearer ", "")
            )
        ]

    recovery_key: ApiRecoveryKeyStatus = strawberry.field(
        resolver=get_recovery_key_status, permission_classes=[IsAuthenticated]
    )