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

import { tasksCreate } from "../funcs/tasksCreate.js";
import { tasksDelete } from "../funcs/tasksDelete.js";
import { tasksGet } from "../funcs/tasksGet.js";
import { tasksList } from "../funcs/tasksList.js";
import { tasksUpdate } from "../funcs/tasksUpdate.js";
import { ClientSDK, RequestOptions } from "../lib/sdks.js";
import {
  DeleteV2TasksTaskIdRequest,
  DeleteV2TasksTaskIdResponse,
} from "../models/operations/deletev2taskstaskid.js";
import {
  GetV2TasksRequest,
  GetV2TasksResponse,
} from "../models/operations/getv2tasks.js";
import {
  GetV2TasksTaskIdRequest,
  GetV2TasksTaskIdResponse,
} from "../models/operations/getv2taskstaskid.js";
import {
  PatchV2TasksTaskIdRequest,
  PatchV2TasksTaskIdResponse,
} from "../models/operations/patchv2taskstaskid.js";
import {
  PostV2TasksRequest,
  PostV2TasksResponse,
} from "../models/operations/postv2tasks.js";
import { unwrapAsync } from "../types/fp.js";

export class Tasks extends ClientSDK {
  /**
   * List tasks
   *
   * @remarks
   * List all tasks. Results are sorted by creation date, from oldest to newest.
   *
   * Required scopes: `task:read`, `object_configuration:read`, `record_permission:read`, `user_management:read`.
   */
  async list(
    request: GetV2TasksRequest,
    options?: RequestOptions,
  ): Promise<GetV2TasksResponse> {
    return unwrapAsync(tasksList(
      this,
      request,
      options,
    ));
  }

  /**
   * Create a task
   *
   * @remarks
   * Creates a new task.
   *
   * At present, tasks can only be created from plaintext without record reference formatting.
   *
   * Required scopes: `task:read-write`, `object_configuration:read`, `record_permission:read`, `user_management:read`.
   */
  async create(
    request: PostV2TasksRequest,
    options?: RequestOptions,
  ): Promise<PostV2TasksResponse> {
    return unwrapAsync(tasksCreate(
      this,
      request,
      options,
    ));
  }

  /**
   * Get a task
   *
   * @remarks
   * Get a single task by ID.
   *
   * Required scopes: `task:read`, `object_configuration:read`, `record_permission:read`, `user_management:read`.
   */
  async get(
    request: GetV2TasksTaskIdRequest,
    options?: RequestOptions,
  ): Promise<GetV2TasksTaskIdResponse> {
    return unwrapAsync(tasksGet(
      this,
      request,
      options,
    ));
  }

  /**
   * Update a task
   *
   * @remarks
   * Updates an existing task by `task_id`. At present, only the `deadline_at`, `is_completed`, `linked_records`, and `assignees` fields can be updated.
   *
   * Required scopes: `task:read-write`, `object_configuration:read`, `record_permission:read`, `user_management:read`.
   */
  async update(
    request: PatchV2TasksTaskIdRequest,
    options?: RequestOptions,
  ): Promise<PatchV2TasksTaskIdResponse> {
    return unwrapAsync(tasksUpdate(
      this,
      request,
      options,
    ));
  }

  /**
   * Delete a task
   *
   * @remarks
   * Delete a task by ID.
   *
   * Required scopes: `task:read-write`.
   */
  async delete(
    request: DeleteV2TasksTaskIdRequest,
    options?: RequestOptions,
  ): Promise<DeleteV2TasksTaskIdResponse> {
    return unwrapAsync(tasksDelete(
      this,
      request,
      options,
    ));
  }
}
