import {addErrorMessage, clearIndicators} from 'sentry/actionCreators/indicator';
import {Client} from 'sentry/api';
import {t} from 'sentry/locale';
import {NoteType} from 'sentry/types/alerts';

/**
 * Fetches a list of activities for an incident
 */
export function fetchIncidentActivities(api: Client, orgId: string, alertId: string) {
  return api.requestPromise(`/organizations/${orgId}/incidents/${alertId}/activity/`);
}

/**
 * Creates a note for an incident
 */
export async function createIncidentNote(
  api: Client,
  orgId: string,
  alertId: string,
  note: NoteType
) {
  try {
    const result = await api.requestPromise(
      `/organizations/${orgId}/incidents/${alertId}/comments/`,
      {
        method: 'POST',
        data: {
          mentions: note.mentions,
          comment: note.text,
        },
      }
    );

    return result;
  } catch (err) {
    addErrorMessage(t('Unable to post comment'));
    throw err;
  }
}

/**
 * Deletes a note for an incident
 */
export async function deleteIncidentNote(
  api: Client,
  orgId: string,
  alertId: string,
  noteId: string
) {
  try {
    const result = await api.requestPromise(
      `/organizations/${orgId}/incidents/${alertId}/comments/${noteId}/`,
      {
        method: 'DELETE',
      }
    );

    return result;
  } catch (err) {
    addErrorMessage(t('Failed to delete comment'));
    throw err;
  }
}

/**
 * Updates a note for an incident
 */
export async function updateIncidentNote(
  api: Client,
  orgId: string,
  alertId: string,
  noteId: string,
  note: NoteType
) {
  try {
    const result = await api.requestPromise(
      `/organizations/${orgId}/incidents/${alertId}/comments/${noteId}/`,
      {
        method: 'PUT',
        data: {
          mentions: note.mentions,
          comment: note.text,
        },
      }
    );
    clearIndicators();
    return result;
  } catch (err) {
    addErrorMessage(t('Unable to update comment'));
    throw err;
  }
}

// This doesn't return anything because you shouldn't need to do anything with
// the result success or fail
export async function markIncidentAsSeen(api: Client, orgId: string, incident) {
  if (!incident || incident.hasSeen) {
    return;
  }

  try {
    await api.requestPromise(
      `/organizations/${orgId}/incidents/${incident.identifier}/seen/`,
      {
        method: 'POST',
        data: {
          hasSeen: true,
        },
      }
    );
  } catch (err) {
    // do nothing
  }
}