import { APIClient } from "./ApiClient";

export interface InboxEntry {
  id: number;
  file_id: number;
  user_id: number;
  movement_id?: number;
  time: number;
  label?: string;
  amount?: number;
  time_create: number;
  time_update: number;
}

export interface InboxEntryUpdate {
  file_id: number;
  movement_id?: number;
  time: number;
  label?: string;
  amount?: number;
}

export class InboxApi {
  /**
   * Get the number of unmatched entries
   */
  static async CountUnmatched(): Promise<number> {
    return (
      await APIClient.exec({
        uri: `/inbox/count?include_attached=false`,
        method: "GET",
      })
    ).data.count;
  }
  /**
   * Create a new inbox entry
   */
  static async Create(entry: InboxEntryUpdate): Promise<void> {
    await APIClient.exec({
      uri: `/inbox`,
      method: "POST",
      jsonData: entry,
    });
  }

  /**
   * Get the list of inbox entries
   */
  static async GetList(includeAttached: boolean): Promise<InboxEntry[]> {
    return (
      await APIClient.exec({
        uri: `/inbox?include_attached=${includeAttached ? "true" : "false"}`,
        method: "GET",
      })
    ).data;
  }

  /**
   * Update inbox entry
   */
  static async Update(
    inbox: InboxEntry & InboxEntryUpdate
  ): Promise<InboxEntry> {
    return (
      await APIClient.exec({
        uri: `/inbox/${inbox.id}`,
        method: "PUT",
        jsonData: inbox,
      })
    ).data;
  }

  /**
   * Delete an inbox entry
   */
  static async Delete(movement: InboxEntry): Promise<void> {
    await APIClient.exec({
      uri: `/inbox/${movement.id}`,
      method: "DELETE",
    });
  }
}
