import type {TorrentProperties} from '../../../../shared/types/Torrent';
import type {TransmissionTorrentProperties} from '../types/TransmissionTorrentsMethods';
import {TransmissionTorrentError, TransmissionTorrentStatus} from '../types/TransmissionTorrentsMethods';

const getTorrentStatus = (
  properties: Pick<
    TransmissionTorrentProperties,
    'error' | 'status' | 'rateDownload' | 'rateUpload' | 'haveValid' | 'totalSize'
  >,
): TorrentProperties['status'] => {
  const {error, status, rateDownload, rateUpload, haveValid, totalSize} = properties;
  const statuses: TorrentProperties['status'] = [];

  switch (status) {
    case TransmissionTorrentStatus.TR_STATUS_CHECK:
    case TransmissionTorrentStatus.TR_STATUS_CHECK_WAIT:
      statuses.push('checking');
      break;
    case TransmissionTorrentStatus.TR_STATUS_DOWNLOAD:
    case TransmissionTorrentStatus.TR_STATUS_DOWNLOAD_WAIT:
      statuses.push('downloading');
      if (rateDownload > 0) {
        statuses.push('active');
      } else {
        statuses.push('inactive');
      }
      break;
    case TransmissionTorrentStatus.TR_STATUS_SEED:
    case TransmissionTorrentStatus.TR_STATUS_SEED_WAIT:
      statuses.push('seeding');
      if (rateUpload > 0) {
        statuses.push('active');
      } else {
        statuses.push('inactive');
      }
      break;
    case TransmissionTorrentStatus.TR_STATUS_STOPPED:
      statuses.push('stopped', 'inactive');
      break;
    default:
      break;
  }

  if (error !== TransmissionTorrentError.TR_STAT_OK) {
    if (error === TransmissionTorrentError.TR_STAT_TRACKER_WARNING) {
      statuses.push('warning');
    } else {
      statuses.push('error');
    }
  }

  if (haveValid === totalSize) {
    statuses.push('complete');
  }

  return statuses;
};

export default {getTorrentStatus};
