import type * as Models from './models';
import type * as Parameters from './parameters';
import type { Client } from '../clients';
import type { Callback } from '../callback';
import type { RequestConfig } from '../requestConfig';

export class TimeTracking {
  constructor(private client: Client) {}

  /**
   * Returns the time tracking provider that is currently selected. Note that if time tracking is disabled, then a
   * successful but empty response is returned.
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async getSelectedTimeTrackingImplementation<T = void>(callback: Callback<T>): Promise<void>;
  /**
   * Returns the time tracking provider that is currently selected. Note that if time tracking is disabled, then a
   * successful but empty response is returned.
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async getSelectedTimeTrackingImplementation<T = void>(callback?: never): Promise<T>;
  async getSelectedTimeTrackingImplementation<T = void>(callback?: Callback<T>): Promise<void | T> {
    const config: RequestConfig = {
      url: '/rest/api/2/configuration/timetracking',
      method: 'GET',
    };

    return this.client.sendRequest(config, callback);
  }

  /**
   * Selects a time tracking provider.
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async selectTimeTrackingImplementation<T = void>(
    parameters: Parameters.SelectTimeTrackingImplementation | undefined,
    callback: Callback<T>,
  ): Promise<void>;
  /**
   * Selects a time tracking provider.
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async selectTimeTrackingImplementation<T = void>(
    parameters?: Parameters.SelectTimeTrackingImplementation,
    callback?: never,
  ): Promise<T>;
  async selectTimeTrackingImplementation<T = void>(
    parameters?: Parameters.SelectTimeTrackingImplementation,
    callback?: Callback<T>,
  ): Promise<void | T> {
    const config: RequestConfig = {
      url: '/rest/api/2/configuration/timetracking',
      method: 'PUT',
      data: {
        key: parameters?.key,
        name: parameters?.name,
        url: parameters?.url,
      },
    };

    return this.client.sendRequest(config, callback);
  }

  /**
   * Returns all time tracking providers. By default, Jira only has one time tracking provider: _JIRA provided time
   * tracking_. However, you can install other time tracking providers via apps from the Atlassian Marketplace. For more
   * information on time tracking providers, see the documentation for the [ Time Tracking
   * Provider](https://developer.atlassian.com/cloud/jira/platform/modules/time-tracking-provider/) module.
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async getAvailableTimeTrackingImplementations<T = Models.TimeTrackingProvider[]>(
    callback: Callback<T>,
  ): Promise<void>;
  /**
   * Returns all time tracking providers. By default, Jira only has one time tracking provider: _JIRA provided time
   * tracking_. However, you can install other time tracking providers via apps from the Atlassian Marketplace. For more
   * information on time tracking providers, see the documentation for the [ Time Tracking
   * Provider](https://developer.atlassian.com/cloud/jira/platform/modules/time-tracking-provider/) module.
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async getAvailableTimeTrackingImplementations<T = Models.TimeTrackingProvider[]>(callback?: never): Promise<T>;
  async getAvailableTimeTrackingImplementations<T = Models.TimeTrackingProvider[]>(
    callback?: Callback<T>,
  ): Promise<void | T> {
    const config: RequestConfig = {
      url: '/rest/api/2/configuration/timetracking/list',
      method: 'GET',
    };

    return this.client.sendRequest(config, callback);
  }

  /**
   * Returns the time tracking settings. This includes settings such as the time format, default time unit, and others.
   * For more information, see [Configuring time tracking](https://confluence.atlassian.com/x/qoXKM).
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async getSharedTimeTrackingConfiguration<T = Models.TimeTrackingConfiguration>(callback: Callback<T>): Promise<void>;
  /**
   * Returns the time tracking settings. This includes settings such as the time format, default time unit, and others.
   * For more information, see [Configuring time tracking](https://confluence.atlassian.com/x/qoXKM).
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async getSharedTimeTrackingConfiguration<T = Models.TimeTrackingConfiguration>(callback?: never): Promise<T>;
  async getSharedTimeTrackingConfiguration<T = Models.TimeTrackingConfiguration>(
    callback?: Callback<T>,
  ): Promise<void | T> {
    const config: RequestConfig = {
      url: '/rest/api/2/configuration/timetracking/options',
      method: 'GET',
    };

    return this.client.sendRequest(config, callback);
  }

  /**
   * Sets the time tracking settings.
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async setSharedTimeTrackingConfiguration<T = Models.TimeTrackingConfiguration>(
    parameters: Parameters.SetSharedTimeTrackingConfiguration,
    callback: Callback<T>,
  ): Promise<void>;
  /**
   * Sets the time tracking settings.
   *
   * **[Permissions](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#permissions) required:**
   * _Administer Jira_ [global permission](https://confluence.atlassian.com/x/x4dKLg).
   */
  async setSharedTimeTrackingConfiguration<T = Models.TimeTrackingConfiguration>(
    parameters: Parameters.SetSharedTimeTrackingConfiguration,
    callback?: never,
  ): Promise<T>;
  async setSharedTimeTrackingConfiguration<T = Models.TimeTrackingConfiguration>(
    parameters: Parameters.SetSharedTimeTrackingConfiguration,
    callback?: Callback<T>,
  ): Promise<void | T> {
    const config: RequestConfig = {
      url: '/rest/api/2/configuration/timetracking/options',
      method: 'PUT',
      data: {
        workingHoursPerDay: parameters.workingHoursPerDay,
        workingDaysPerWeek: parameters.workingDaysPerWeek,
        timeFormat: parameters.timeFormat,
        defaultUnit: parameters.defaultUnit,
      },
    };

    return this.client.sendRequest(config, callback);
  }
}
