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

import { workspacesWorkspaceUploadRequestAddWorkspaceUploadRequestDocument } from "../funcs/workspacesWorkspaceUploadRequestAddWorkspaceUploadRequestDocument.js";
import { workspacesWorkspaceUploadRequestCompleteWorkspaceUploadRequest } from "../funcs/workspacesWorkspaceUploadRequestCompleteWorkspaceUploadRequest.js";
import { workspacesWorkspaceUploadRequestCreateWorkspaceUploadRequest } from "../funcs/workspacesWorkspaceUploadRequestCreateWorkspaceUploadRequest.js";
import { workspacesWorkspaceUploadRequestDeleteWorkspaceUploadRequest } from "../funcs/workspacesWorkspaceUploadRequestDeleteWorkspaceUploadRequest.js";
import { workspacesWorkspaceUploadRequestGetWorkspaceUploadRequest } from "../funcs/workspacesWorkspaceUploadRequestGetWorkspaceUploadRequest.js";
import { workspacesWorkspaceUploadRequestGetWorkspaceUploadRequests } from "../funcs/workspacesWorkspaceUploadRequestGetWorkspaceUploadRequests.js";
import { workspacesWorkspaceUploadRequestUpdateWorkspaceUploadRequest } from "../funcs/workspacesWorkspaceUploadRequestUpdateWorkspaceUploadRequest.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";

export class WorkspaceUploadRequest extends ClientSDK {
  /**
   * Creates a new upload request within a workspace
   *
   * @remarks
   * This operation creates a new upload request within a workspace. The upload request includes name, description, due date, and user assignments. Upload requests can be created as drafts or sent immediately based on the status field.
   */
  async createWorkspaceUploadRequest(
    request: operations.CreateWorkspaceUploadRequestRequest,
    options?: RequestOptions,
  ): Promise<components.GetWorkspaceUploadRequestResponse> {
    return unwrapAsync(
      workspacesWorkspaceUploadRequestCreateWorkspaceUploadRequest(
        this,
        request,
        options,
      ),
    );
  }

  /**
   * Gets upload requests within a workspace
   *
   * @remarks
   * This operation retrieves a list of upload requests within a workspace. Each upload request includes details such as ID, name, description, status, owner information, associated documents, assignments, and various dates.
   */
  async getWorkspaceUploadRequests(
    request: operations.GetWorkspaceUploadRequestsRequest,
    options?: RequestOptions,
  ): Promise<components.GetWorkspaceUploadRequestsResponse> {
    return unwrapAsync(
      workspacesWorkspaceUploadRequestGetWorkspaceUploadRequests(
        this,
        request,
        options,
      ),
    );
  }

  /**
   * Gets details for a specific upload request
   *
   * @remarks
   * This operation retrieves details about a specific upload request within a workspace. The response includes comprehensive information about the upload request including status, assigned users, associated documents, owner details, and various dates.
   */
  async getWorkspaceUploadRequest(
    request: operations.GetWorkspaceUploadRequestRequest,
    options?: RequestOptions,
  ): Promise<components.GetWorkspaceUploadRequestResponse> {
    return unwrapAsync(
      workspacesWorkspaceUploadRequestGetWorkspaceUploadRequest(
        this,
        request,
        options,
      ),
    );
  }

  /**
   * Updates a specific upload request
   *
   * @remarks
   * This operation updates a specific upload request within a workspace. Only draft upload requests can be edited. The editable fields are name, description, due date, and status. Status changes are restricted - only transitions from draft to in_progress are allowed. Attempting to update a non-draft upload request will result in an INVALID_STATUS error. Attempting an invalid status change will result in an INVALID_STATUS_CHANGE error.
   */
  async updateWorkspaceUploadRequest(
    request: operations.UpdateWorkspaceUploadRequestRequest,
    options?: RequestOptions,
  ): Promise<components.GetWorkspaceUploadRequestResponse> {
    return unwrapAsync(
      workspacesWorkspaceUploadRequestUpdateWorkspaceUploadRequest(
        this,
        request,
        options,
      ),
    );
  }

  /**
   * Deletes a specific upload request
   *
   * @remarks
   * This operation deletes a specific upload request within a workspace. Upload requests cannot be deleted if they are complete or have associated documents.
   */
  async deleteWorkspaceUploadRequest(
    request: operations.DeleteWorkspaceUploadRequestRequest,
    options?: RequestOptions,
  ): Promise<void> {
    return unwrapAsync(
      workspacesWorkspaceUploadRequestDeleteWorkspaceUploadRequest(
        this,
        request,
        options,
      ),
    );
  }

  /**
   * Add a document to an upload request via file upload
   *
   * @remarks
   * This operation adds a document to a specific upload request within a workspace via file upload. The file is passed in the request body as multipart/form-data. The file name is used as the document name.
   */
  async addWorkspaceUploadRequestDocument(
    request: operations.AddWorkspaceUploadRequestDocumentRequest,
    options?: RequestOptions,
  ): Promise<components.AddWorkspaceUploadRequestDocumentResponse> {
    return unwrapAsync(
      workspacesWorkspaceUploadRequestAddWorkspaceUploadRequestDocument(
        this,
        request,
        options,
      ),
    );
  }

  /**
   * Complete an upload request
   *
   * @remarks
   * This operation completes a specific upload request within a workspace and is intended to be called by the user completing the upload request. Only upload requests that are in progress can be completed.
   */
  async completeWorkspaceUploadRequest(
    request: operations.CompleteWorkspaceUploadRequestRequest,
    options?: RequestOptions,
  ): Promise<void> {
    return unwrapAsync(
      workspacesWorkspaceUploadRequestCompleteWorkspaceUploadRequest(
        this,
        request,
        options,
      ),
    );
  }
}
