from __future__ import annotations

import typing as t

from globus_sdk import utils
from globus_sdk._types import UUIDLike


class UserCredentialDocument(utils.PayloadWrapper):
    """
    Convenience class for constructing a UserCredential document
    to use as the `data` parameter to `create_user_credential` and
    `update_user_credential`

    :param DATA_TYPE: Versioned document type.
    :type DATA_TYPE: str
    :param identity_id: UUID of the Globus identity this credential will
        provide access for
    :type identity_id: UUID or str, optional
    :param connector_id: UUID of the connector this credential is for
    :type connector_id: UUID or str, optional
    :param username: Username of the local account this credential will provide
        access to, format is connector specific
    :type username: str, optional
    :param display_name: Display name for this credential
    :type display_name: str, optional
    :param storage_gateway_id: UUID of the storage gateway this credential is for
    :type storage_gateway_id: UUID or str, optional
    :param policies: Connector specific policies for this credential
    :type policies: dict, optional
    :param additional_fields: Additional data for inclusion in the document
    :type additional_fields: dict, optional
    """

    def __init__(
        self,
        DATA_TYPE: str = "user_credential#1.0.0",
        identity_id: UUIDLike | None = None,
        connector_id: UUIDLike | None = None,
        username: str | None = None,
        display_name: str | None = None,
        storage_gateway_id: UUIDLike | None = None,
        policies: dict[str, t.Any] | None = None,
        additional_fields: dict[str, t.Any] | None = None,
    ) -> None:
        super().__init__()
        self._set_optstrs(
            DATA_TYPE=DATA_TYPE,
            identity_id=identity_id,
            connector_id=connector_id,
            username=username,
            display_name=display_name,
            storage_gateway_id=storage_gateway_id,
        )
        self._set_value("policies", policies, callback=dict)

        if additional_fields is not None:
            self.update(additional_fields)
