/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

import { identitiesCreateIdentity } from "../funcs/identitiesCreateIdentity.js";
import { identitiesDeleteIdentity } from "../funcs/identitiesDeleteIdentity.js";
import { identitiesGetIdentity } from "../funcs/identitiesGetIdentity.js";
import { identitiesListIdentities } from "../funcs/identitiesListIdentities.js";
import { identitiesUpdateIdentity } from "../funcs/identitiesUpdateIdentity.js";
import { ClientSDK, RequestOptions } from "../lib/sdks.js";
import * as components from "../models/components/index.js";
import * as operations from "../models/operations/index.js";
import { unwrapAsync } from "../types/fp.js";
import { PageIterator, unwrapResultIterator } from "../types/operations.js";

export class Identities extends ClientSDK {
  /**
   * Create Identity
   *
   * @remarks
   * Create an identity to group multiple API keys under a single entity. Identities enable shared rate limits and metadata across all associated keys.
   *
   * Perfect for users with multiple devices, organizations with multiple API keys, or when you need unified rate limiting across different services.
   *
   * **Important**
   * Requires `identity.*.create_identity` permission
   */
  async createIdentity(
    request: components.V2IdentitiesCreateIdentityRequestBody,
    options?: RequestOptions,
  ): Promise<components.V2IdentitiesCreateIdentityResponseBody> {
    return unwrapAsync(identitiesCreateIdentity(
      this,
      request,
      options,
    ));
  }

  /**
   * Delete Identity
   *
   * @remarks
   * Permanently delete an identity. This operation cannot be undone.
   *
   * Use this for data cleanup, compliance requirements, or when removing entities from your system.
   *
   * > **Important**
   * > Requires `identity.*.delete_identity` permission
   * > Associated API keys remain functional but lose shared resources
   * > External ID becomes available for reuse immediately
   */
  async deleteIdentity(
    request: components.V2IdentitiesDeleteIdentityRequestBody,
    options?: RequestOptions,
  ): Promise<components.V2IdentitiesDeleteIdentityResponseBody> {
    return unwrapAsync(identitiesDeleteIdentity(
      this,
      request,
      options,
    ));
  }

  /**
   * Get Identity
   *
   * @remarks
   * Retrieve an identity by external ID. Returns metadata, rate limits, and other associated data.
   *
   * Use this to check if an identity exists, view configurations, or build management dashboards.
   *
   * > **Important**
   * > Requires `identity.*.read_identity` permission
   */
  async getIdentity(
    request: components.V2IdentitiesGetIdentityRequestBody,
    options?: RequestOptions,
  ): Promise<components.V2IdentitiesGetIdentityResponseBody> {
    return unwrapAsync(identitiesGetIdentity(
      this,
      request,
      options,
    ));
  }

  /**
   * List Identities
   *
   * @remarks
   * Get a paginated list of all identities in your workspace. Returns metadata and rate limit configurations.
   *
   * Perfect for building management dashboards, auditing configurations, or browsing your identities.
   *
   * > **Important**
   * > Requires `identity.*.read_identity` permission
   */
  async listIdentities(
    request: components.V2IdentitiesListIdentitiesRequestBody,
    options?: RequestOptions,
  ): Promise<
    PageIterator<
      operations.IdentitiesListIdentitiesResponse,
      { cursor: string }
    >
  > {
    return unwrapResultIterator(identitiesListIdentities(
      this,
      request,
      options,
    ));
  }

  /**
   * Update Identity
   *
   * @remarks
   * Update an identity's metadata and rate limits. Only specified fields are modified - others remain unchanged.
   *
   * Perfect for subscription changes, plan upgrades, or updating user information. Changes take effect immediately.
   *
   * > **Important**
   * > Requires `identity.*.update_identity` permission
   * > Rate limit changes propagate within 30 seconds
   */
  async updateIdentity(
    request: components.V2IdentitiesUpdateIdentityRequestBody,
    options?: RequestOptions,
  ): Promise<components.V2IdentitiesUpdateIdentityResponseBody> {
    return unwrapAsync(identitiesUpdateIdentity(
      this,
      request,
      options,
    ));
  }
}
