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

import { featureFlagsCreateFlag } from "../funcs/featureFlagsCreateFlag.js";
import { featureFlagsCreateFlagSegment } from "../funcs/featureFlagsCreateFlagSegment.js";
import { featureFlagsCreateSDKKey } from "../funcs/featureFlagsCreateSDKKey.js";
import { featureFlagsDeleteFlag } from "../funcs/featureFlagsDeleteFlag.js";
import { featureFlagsDeleteFlagSegment } from "../funcs/featureFlagsDeleteFlagSegment.js";
import { featureFlagsDeleteSDKKey } from "../funcs/featureFlagsDeleteSDKKey.js";
import { featureFlagsGetDeploymentFeatureFlags } from "../funcs/featureFlagsGetDeploymentFeatureFlags.js";
import { featureFlagsGetFlag } from "../funcs/featureFlagsGetFlag.js";
import { featureFlagsGetFlagSegment } from "../funcs/featureFlagsGetFlagSegment.js";
import { featureFlagsGetFlagSettings } from "../funcs/featureFlagsGetFlagSettings.js";
import { featureFlagsGetSDKKeys } from "../funcs/featureFlagsGetSDKKeys.js";
import { featureFlagsListFlags } from "../funcs/featureFlagsListFlags.js";
import { featureFlagsListFlagSegments } from "../funcs/featureFlagsListFlagSegments.js";
import { featureFlagsListFlagsV2 } from "../funcs/featureFlagsListFlagsV2.js";
import { featureFlagsListFlagVersions } from "../funcs/featureFlagsListFlagVersions.js";
import { featureFlagsListTeamFlags } from "../funcs/featureFlagsListTeamFlags.js";
import { featureFlagsListTeamFlagSettings } from "../funcs/featureFlagsListTeamFlagSettings.js";
import { featureFlagsListTeamFlagsV2 } from "../funcs/featureFlagsListTeamFlagsV2.js";
import { featureFlagsUpdateFlag } from "../funcs/featureFlagsUpdateFlag.js";
import { featureFlagsUpdateFlagSegment } from "../funcs/featureFlagsUpdateFlagSegment.js";
import { featureFlagsUpdateFlagSettings } from "../funcs/featureFlagsUpdateFlagSettings.js";
import { ClientSDK, RequestOptions } from "../lib/sdks.js";
import {
  CreateFlagRequest,
  CreateFlagResponseBody,
} from "../models/createflagop.js";
import {
  CreateFlagSegmentRequest,
  CreateFlagSegmentResponseBody,
} from "../models/createflagsegmentop.js";
import { CreateSDKKeyRequest } from "../models/createsdkkeyop.js";
import { DeleteFlagRequest } from "../models/deleteflagop.js";
import { DeleteFlagSegmentRequest } from "../models/deleteflagsegmentop.js";
import { DeleteSDKKeyRequest } from "../models/deletesdkkeyop.js";
import { Flag } from "../models/flag.js";
import { FlagsSDKKeyWithSecrets } from "../models/flagssdkkeywithsecrets.js";
import {
  GetDeploymentFeatureFlagsRequest,
  GetDeploymentFeatureFlagsResponseBody,
} from "../models/getdeploymentfeatureflagsop.js";
import { GetFlagRequest } from "../models/getflagop.js";
import { GetFlagSegmentRequest } from "../models/getflagsegmentop.js";
import {
  GetFlagSettingsRequest,
  GetFlagSettingsResponseBody,
} from "../models/getflagsettingsop.js";
import {
  GetSDKKeysRequest,
  GetSDKKeysResponseBody,
} from "../models/getsdkkeysop.js";
import {
  ListFlagSegmentsRequest,
  ListFlagSegmentsResponseBody,
} from "../models/listflagsegmentsop.js";
import {
  ListFlagsRequest,
  ListFlagsResponseBody,
} from "../models/listflagsop.js";
import {
  ListFlagsV2Request,
  ListFlagsV2ResponseBody,
} from "../models/listflagsv2op.js";
import {
  ListFlagVersionsRequest,
  ListFlagVersionsResponseBody,
} from "../models/listflagversionsop.js";
import {
  ListTeamFlagSettingsRequest,
  ListTeamFlagSettingsResponseBody,
} from "../models/listteamflagsettingsop.js";
import {
  ListTeamFlagsRequest,
  ListTeamFlagsResponseBody,
} from "../models/listteamflagsop.js";
import {
  ListTeamFlagsV2Request,
  ListTeamFlagsV2ResponseBody,
} from "../models/listteamflagsv2op.js";
import { Segment } from "../models/segment.js";
import {
  UpdateFlagRequest,
  UpdateFlagResponseBody,
} from "../models/updateflagop.js";
import { UpdateFlagSegmentRequest } from "../models/updateflagsegmentop.js";
import {
  UpdateFlagSettingsRequest,
  UpdateFlagSettingsResponse,
} from "../models/updateflagsettingsop.js";
import { unwrapAsync } from "../types/fp.js";

export class FeatureFlags extends ClientSDK {
  /**
   * List flags
   *
   * @remarks
   * Retrieve feature flags for a project. Returns an opaque cursor for pagination.
   */
  async listFlagsV2(
    request: ListFlagsV2Request,
    options?: RequestOptions,
  ): Promise<ListFlagsV2ResponseBody> {
    return unwrapAsync(featureFlagsListFlagsV2(
      this,
      request,
      options,
    ));
  }

  /**
   * List flags
   *
   * @remarks
   * Retrieve feature flags for a project. The list can be filtered by state and supports pagination.
   */
  async listFlags(
    request: ListFlagsRequest,
    options?: RequestOptions,
  ): Promise<ListFlagsResponseBody> {
    return unwrapAsync(featureFlagsListFlags(
      this,
      request,
      options,
    ));
  }

  /**
   * Create a flag
   *
   * @remarks
   * Create a new feature flag for a project. The flag must have a unique slug within the project and specify its kind (boolean, string, number, or json).
   */
  async createFlag(
    request: CreateFlagRequest,
    options?: RequestOptions,
  ): Promise<CreateFlagResponseBody> {
    return unwrapAsync(featureFlagsCreateFlag(
      this,
      request,
      options,
    ));
  }

  /**
   * Get a flag
   *
   * @remarks
   * Retrieve a specific feature flag by its ID or slug.
   */
  async getFlag(
    request: GetFlagRequest,
    options?: RequestOptions,
  ): Promise<Flag | undefined> {
    return unwrapAsync(featureFlagsGetFlag(
      this,
      request,
      options,
    ));
  }

  /**
   * Update a flag
   *
   * @remarks
   * Update an existing feature flag. This endpoint supports partial updates, allowing you to modify specific properties like variants, environments, or state without providing the full flag configuration.
   */
  async updateFlag(
    request: UpdateFlagRequest,
    options?: RequestOptions,
  ): Promise<UpdateFlagResponseBody | undefined> {
    return unwrapAsync(featureFlagsUpdateFlag(
      this,
      request,
      options,
    ));
  }

  /**
   * Delete a flag
   *
   * @remarks
   * Permanently delete a feature flag from the project. This action cannot be undone. Consider archiving the flag instead if you may need it in the future.
   */
  async deleteFlag(
    request: DeleteFlagRequest,
    options?: RequestOptions,
  ): Promise<void> {
    return unwrapAsync(featureFlagsDeleteFlag(
      this,
      request,
      options,
    ));
  }

  /**
   * List flag versions
   *
   * @remarks
   * Lists flag versions for a given flag.
   */
  async listFlagVersions(
    request: ListFlagVersionsRequest,
    options?: RequestOptions,
  ): Promise<ListFlagVersionsResponseBody | undefined> {
    return unwrapAsync(featureFlagsListFlagVersions(
      this,
      request,
      options,
    ));
  }

  /**
   * Get project flag settings
   *
   * @remarks
   * Retrieve feature flag settings for a project.
   */
  async getFlagSettings(
    request: GetFlagSettingsRequest,
    options?: RequestOptions,
  ): Promise<GetFlagSettingsResponseBody> {
    return unwrapAsync(featureFlagsGetFlagSettings(
      this,
      request,
      options,
    ));
  }

  /**
   * Update project flag settings
   *
   * @remarks
   * Update feature flag settings for a project.
   */
  async updateFlagSettings(
    request: UpdateFlagSettingsRequest,
    options?: RequestOptions,
  ): Promise<UpdateFlagSettingsResponse> {
    return unwrapAsync(featureFlagsUpdateFlagSettings(
      this,
      request,
      options,
    ));
  }

  /**
   * List team project flag settings
   *
   * @remarks
   * Retrieve feature flag settings for projects in a team.
   */
  async listTeamFlagSettings(
    request: ListTeamFlagSettingsRequest,
    options?: RequestOptions,
  ): Promise<ListTeamFlagSettingsResponseBody> {
    return unwrapAsync(featureFlagsListTeamFlagSettings(
      this,
      request,
      options,
    ));
  }

  /**
   * List all flags for a team
   *
   * @remarks
   * Retrieve all feature flags for a team across all projects. Returns an opaque cursor for pagination.
   */
  async listTeamFlagsV2(
    request: ListTeamFlagsV2Request,
    options?: RequestOptions,
  ): Promise<ListTeamFlagsV2ResponseBody> {
    return unwrapAsync(featureFlagsListTeamFlagsV2(
      this,
      request,
      options,
    ));
  }

  /**
   * List all flags for a team
   *
   * @remarks
   * Retrieve all feature flags for a team across all projects. The list can be filtered by state and supports pagination.
   */
  async listTeamFlags(
    request: ListTeamFlagsRequest,
    options?: RequestOptions,
  ): Promise<ListTeamFlagsResponseBody> {
    return unwrapAsync(featureFlagsListTeamFlags(
      this,
      request,
      options,
    ));
  }

  /**
   * Create a segment
   *
   * @remarks
   * Create a new feature flag segment.
   */
  async createFlagSegment(
    request: CreateFlagSegmentRequest,
    options?: RequestOptions,
  ): Promise<CreateFlagSegmentResponseBody> {
    return unwrapAsync(featureFlagsCreateFlagSegment(
      this,
      request,
      options,
    ));
  }

  /**
   * List segments
   *
   * @remarks
   * List all feature flag segments for a project.
   */
  async listFlagSegments(
    request: ListFlagSegmentsRequest,
    options?: RequestOptions,
  ): Promise<ListFlagSegmentsResponseBody> {
    return unwrapAsync(featureFlagsListFlagSegments(
      this,
      request,
      options,
    ));
  }

  /**
   * Get a segment
   *
   * @remarks
   * Retrieve a feature flag segment by ID or slug.
   */
  async getFlagSegment(
    request: GetFlagSegmentRequest,
    options?: RequestOptions,
  ): Promise<Segment> {
    return unwrapAsync(featureFlagsGetFlagSegment(
      this,
      request,
      options,
    ));
  }

  /**
   * Delete a segment
   *
   * @remarks
   * Delete a feature flag segment.
   */
  async deleteFlagSegment(
    request: DeleteFlagSegmentRequest,
    options?: RequestOptions,
  ): Promise<void> {
    return unwrapAsync(featureFlagsDeleteFlagSegment(
      this,
      request,
      options,
    ));
  }

  /**
   * Update a segment
   *
   * @remarks
   * Update an existing feature flag segment.
   */
  async updateFlagSegment(
    request: UpdateFlagSegmentRequest,
    options?: RequestOptions,
  ): Promise<Segment> {
    return unwrapAsync(featureFlagsUpdateFlagSegment(
      this,
      request,
      options,
    ));
  }

  /**
   * Retrieve the feature flags of a deployment
   *
   * @remarks
   * Retrieve the feature flags of a deployment.
   */
  async getDeploymentFeatureFlags(
    request: GetDeploymentFeatureFlagsRequest,
    options?: RequestOptions,
  ): Promise<GetDeploymentFeatureFlagsResponseBody> {
    return unwrapAsync(featureFlagsGetDeploymentFeatureFlags(
      this,
      request,
      options,
    ));
  }

  /**
   * Get all SDK keys
   *
   * @remarks
   * Gets all SDK keys for a project.
   */
  async getSDKKeys(
    request: GetSDKKeysRequest,
    options?: RequestOptions,
  ): Promise<GetSDKKeysResponseBody> {
    return unwrapAsync(featureFlagsGetSDKKeys(
      this,
      request,
      options,
    ));
  }

  /**
   * Create an SDK key
   *
   * @remarks
   * Creates an SDK key.
   */
  async createSDKKey(
    request: CreateSDKKeyRequest,
    options?: RequestOptions,
  ): Promise<FlagsSDKKeyWithSecrets> {
    return unwrapAsync(featureFlagsCreateSDKKey(
      this,
      request,
      options,
    ));
  }

  /**
   * Delete an SDK key
   *
   * @remarks
   * Deletes an SDK key.
   */
  async deleteSDKKey(
    request: DeleteSDKKeyRequest,
    options?: RequestOptions,
  ): Promise<void> {
    return unwrapAsync(featureFlagsDeleteSDKKey(
      this,
      request,
      options,
    ));
  }
}
