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

import { bulkRedirectsDeleteRedirects } from "../funcs/bulkRedirectsDeleteRedirects.js";
import { bulkRedirectsEditRedirect } from "../funcs/bulkRedirectsEditRedirect.js";
import { bulkRedirectsGetRedirects } from "../funcs/bulkRedirectsGetRedirects.js";
import { bulkRedirectsGetVersions } from "../funcs/bulkRedirectsGetVersions.js";
import { bulkRedirectsRestoreRedirects } from "../funcs/bulkRedirectsRestoreRedirects.js";
import { bulkRedirectsStageRedirects } from "../funcs/bulkRedirectsStageRedirects.js";
import { bulkRedirectsUpdateVersion } from "../funcs/bulkRedirectsUpdateVersion.js";
import { ClientSDK, RequestOptions } from "../lib/sdks.js";
import {
  DeleteRedirectsRequest,
  DeleteRedirectsResponseBody,
} from "../models/deleteredirectsop.js";
import {
  EditRedirectRequest,
  EditRedirectResponseBody,
} from "../models/editredirectop.js";
import {
  GetRedirectsRequest,
  GetRedirectsResponseBody,
} from "../models/getredirectsop.js";
import {
  GetVersionsRequest,
  GetVersionsResponseBody,
} from "../models/getversionsop.js";
import {
  RestoreRedirectsRequest,
  RestoreRedirectsResponseBody,
} from "../models/restoreredirectsop.js";
import {
  StageRedirectsRequest,
  StageRedirectsResponseBody,
} from "../models/stageredirectsop.js";
import {
  UpdateVersionRequest,
  UpdateVersionResponseBody,
} from "../models/updateversionop.js";
import { unwrapAsync } from "../types/fp.js";

export class BulkRedirects extends ClientSDK {
  /**
   * Stages new redirects for a project.
   *
   * @remarks
   * Stages new redirects for a project and returns the new version.
   */
  async stageRedirects(
    request: StageRedirectsRequest,
    options?: RequestOptions,
  ): Promise<StageRedirectsResponseBody> {
    return unwrapAsync(bulkRedirectsStageRedirects(
      this,
      request,
      options,
    ));
  }

  /**
   * Gets project-level redirects.
   *
   * @remarks
   * Get the version history for a project's bulk redirects
   */
  async getRedirects(
    request: GetRedirectsRequest,
    options?: RequestOptions,
  ): Promise<GetRedirectsResponseBody> {
    return unwrapAsync(bulkRedirectsGetRedirects(
      this,
      request,
      options,
    ));
  }

  /**
   * Delete project-level redirects.
   *
   * @remarks
   * Deletes the provided redirects from the latest version of the projects' bulk redirects. Stages a new change with the new redirects and returns the alias for the new version in the response.
   */
  async deleteRedirects(
    request: DeleteRedirectsRequest,
    options?: RequestOptions,
  ): Promise<DeleteRedirectsResponseBody> {
    return unwrapAsync(bulkRedirectsDeleteRedirects(
      this,
      request,
      options,
    ));
  }

  /**
   * Edit a project-level redirect.
   *
   * @remarks
   * Edits a single redirect identified by its source path. Stages a new change with the modified redirect and returns the alias for the new version in the response.
   */
  async editRedirect(
    request: EditRedirectRequest,
    options?: RequestOptions,
  ): Promise<EditRedirectResponseBody> {
    return unwrapAsync(bulkRedirectsEditRedirect(
      this,
      request,
      options,
    ));
  }

  /**
   * Restore staged project-level redirects to their production version.
   *
   * @remarks
   * Restores the provided redirects in the staging version to the value in the production version. If no production version exists, removes the redirects from staging.
   */
  async restoreRedirects(
    request: RestoreRedirectsRequest,
    options?: RequestOptions,
  ): Promise<RestoreRedirectsResponseBody> {
    return unwrapAsync(bulkRedirectsRestoreRedirects(
      this,
      request,
      options,
    ));
  }

  /**
   * Get the version history for a project's redirects.
   *
   * @remarks
   * Get the version history for a project's bulk redirects
   */
  async getVersions(
    request: GetVersionsRequest,
    options?: RequestOptions,
  ): Promise<GetVersionsResponseBody> {
    return unwrapAsync(bulkRedirectsGetVersions(
      this,
      request,
      options,
    ));
  }

  /**
   * Promote a staging version to production or restore a previous production version.
   *
   * @remarks
   * Update a version by promoting staging to production or restoring a previous production version
   */
  async updateVersion(
    request: UpdateVersionRequest,
    options?: RequestOptions,
  ): Promise<UpdateVersionResponseBody> {
    return unwrapAsync(bulkRedirectsUpdateVersion(
      this,
      request,
      options,
    ));
  }
}
