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

import { rollingReleaseApproveRollingReleaseStage } from "../funcs/rollingReleaseApproveRollingReleaseStage.js";
import { rollingReleaseCompleteRollingRelease } from "../funcs/rollingReleaseCompleteRollingRelease.js";
import { rollingReleaseDeleteRollingReleaseConfig } from "../funcs/rollingReleaseDeleteRollingReleaseConfig.js";
import { rollingReleaseGetRollingRelease } from "../funcs/rollingReleaseGetRollingRelease.js";
import { rollingReleaseGetRollingReleaseBillingStatus } from "../funcs/rollingReleaseGetRollingReleaseBillingStatus.js";
import { rollingReleaseGetRollingReleaseConfig } from "../funcs/rollingReleaseGetRollingReleaseConfig.js";
import { rollingReleaseUpdateRollingReleaseConfig } from "../funcs/rollingReleaseUpdateRollingReleaseConfig.js";
import { ClientSDK, RequestOptions } from "../lib/sdks.js";
import {
  ApproveRollingReleaseStageRequest,
  ApproveRollingReleaseStageResponseBody,
} from "../models/approverollingreleasestageop.js";
import {
  CompleteRollingReleaseRequest,
  CompleteRollingReleaseResponseBody,
} from "../models/completerollingreleaseop.js";
import {
  DeleteRollingReleaseConfigRequest,
  DeleteRollingReleaseConfigResponseBody,
} from "../models/deleterollingreleaseconfigop.js";
import {
  GetRollingReleaseBillingStatusRequest,
  GetRollingReleaseBillingStatusResponseBody,
} from "../models/getrollingreleasebillingstatusop.js";
import {
  GetRollingReleaseConfigRequest,
  GetRollingReleaseConfigResponseBody,
} from "../models/getrollingreleaseconfigop.js";
import {
  GetRollingReleaseRequest,
  GetRollingReleaseResponseBody,
} from "../models/getrollingreleaseop.js";
import {
  UpdateRollingReleaseConfigRequest,
  UpdateRollingReleaseConfigResponseBody,
} from "../models/updaterollingreleaseconfigop.js";
import { unwrapAsync } from "../types/fp.js";

export class RollingRelease extends ClientSDK {
  /**
   * Get rolling release billing status
   *
   * @remarks
   * Get the Rolling Releases billing status for a project. The team level billing status is used to determine if the project can be configured for rolling releases.
   */
  async getRollingReleaseBillingStatus(
    request: GetRollingReleaseBillingStatusRequest,
    options?: RequestOptions,
  ): Promise<GetRollingReleaseBillingStatusResponseBody> {
    return unwrapAsync(rollingReleaseGetRollingReleaseBillingStatus(
      this,
      request,
      options,
    ));
  }

  /**
   * Get rolling release configuration
   *
   * @remarks
   * Get the Rolling Releases configuration for a project. The project-level config is simply a template that will be used for any future rolling release, and not the configuration for any active rolling release.
   */
  async getRollingReleaseConfig(
    request: GetRollingReleaseConfigRequest,
    options?: RequestOptions,
  ): Promise<GetRollingReleaseConfigResponseBody> {
    return unwrapAsync(rollingReleaseGetRollingReleaseConfig(
      this,
      request,
      options,
    ));
  }

  /**
   * Delete rolling release configuration
   *
   * @remarks
   * Disable Rolling Releases for a project means that future deployments will not undergo a rolling release. Changing the config never alters a rollout that's already in-flight—it only affects the next production deployment. If you want to also stop the current rollout, call this endpoint to disable the feature, and then call either the /complete or /abort endpoint.
   */
  async deleteRollingReleaseConfig(
    request: DeleteRollingReleaseConfigRequest,
    options?: RequestOptions,
  ): Promise<DeleteRollingReleaseConfigResponseBody> {
    return unwrapAsync(rollingReleaseDeleteRollingReleaseConfig(
      this,
      request,
      options,
    ));
  }

  /**
   * Update the rolling release settings for the project
   *
   * @remarks
   * Update (or disable) Rolling Releases for a project. When disabling with the resolve-on-disable feature flag enabled, any active rolling release document is resolved using the disableRolloutAction parameter: "abort" to roll back (default), or "complete" to promote the canary to production. When enabling or updating config, changes only affect the next production deployment and do not alter a rollout that's already in-flight. Note: Enabling Rolling Releases automatically enables skew protection on the project with the default value if it wasn't configured already.
   */
  async updateRollingReleaseConfig(
    request: UpdateRollingReleaseConfigRequest,
    options?: RequestOptions,
  ): Promise<UpdateRollingReleaseConfigResponseBody> {
    return unwrapAsync(rollingReleaseUpdateRollingReleaseConfig(
      this,
      request,
      options,
    ));
  }

  /**
   * Get the active rolling release information for a project
   *
   * @remarks
   * Return the Rolling Release for a project, regardless of whether the rollout is active, aborted, or completed. If the feature is enabled but no deployment has occurred yet, null will be returned.
   */
  async getRollingRelease(
    request: GetRollingReleaseRequest,
    options?: RequestOptions,
  ): Promise<GetRollingReleaseResponseBody> {
    return unwrapAsync(rollingReleaseGetRollingRelease(
      this,
      request,
      options,
    ));
  }

  /**
   * Update the active rolling release to the next stage for a project
   *
   * @remarks
   * Advance a rollout to the next stage. This is only needed when rolling releases is configured to require manual approval.
   */
  async approveRollingReleaseStage(
    request: ApproveRollingReleaseStageRequest,
    options?: RequestOptions,
  ): Promise<ApproveRollingReleaseStageResponseBody> {
    return unwrapAsync(rollingReleaseApproveRollingReleaseStage(
      this,
      request,
      options,
    ));
  }

  /**
   * Complete the rolling release for the project
   *
   * @remarks
   * Force-complete a Rolling Release. The canary deployment will begin serving 100% of the traffic.
   */
  async completeRollingRelease(
    request: CompleteRollingReleaseRequest,
    options?: RequestOptions,
  ): Promise<CompleteRollingReleaseResponseBody> {
    return unwrapAsync(rollingReleaseCompleteRollingRelease(
      this,
      request,
      options,
    ));
  }
}
