import { createParams } from "../services/odata.service";
import {
  AgentInvoiceItem,
  AgentPrintAction,
  AgentPrintActionRequest,
  ChangeEntryAgentSurchargeAction,
  Column,
  CustomEntryStatusItem,
  DossierViewResult,
  EntryTotals,
  FilterItem,
  NumberStringPair,
  PageResult,
  PrintActionGroup,
  TideClientConfig,
} from "../types";
import { post } from "./api";
import { get } from "./common-client";

const ENDPOINT = "/api/web/agent";
const ENDPOINT_GET_PRINT_ACTIONS = `${ENDPOINT}/print-action`;
const ENDPOINT_PRINT = `${ENDPOINT}/print-action`;
const ENDPOINT_CUSTOM_ENTRY_STATUS = `${ENDPOINT}/custom-entry-status`;
const ENDPOINT_ENUM_ENTRY_STATUS = `${ENDPOINT}/enum/entry-status`;
const ENDPOINT_CHANGE_ENTRY_AGENT_SURCHARGE = `${ENDPOINT}/entry/change-agent-surcharge`;

/**
 * api/web/agent/print-action/{print-action-group}
 * @param config
 * @param printActionGroup
 * @param signal
 * @returns print actions that are available for agents for given group.
 */
export const getPrintActions = (
  config: TideClientConfig,
  printActionGroup: PrintActionGroup,
  signal?: AbortSignal
): Promise<AgentPrintAction[]> => {
  const url = `${config.host}${ENDPOINT_GET_PRINT_ACTIONS}/${printActionGroup}`;
  const apiKey = config.apiKey;

  return get<AgentPrintAction[]>(url, apiKey, config.token, signal, true);
};

/**
 * api/web/agent/print-action
 * @param config
 * @param request
 * @param signal
 * @returns pdf as stream.
 */
export const print = (
  config: TideClientConfig,
  request: AgentPrintActionRequest,
  signal?: AbortSignal
): Promise<Response> => {
  const url = `${config.host}${ENDPOINT_PRINT}`;
  const apiKey = config.apiKey;
  const body = JSON.stringify(request);

  return post(url, apiKey, body, config.token, signal, undefined);
};

export const getEntryList = (
  config: TideClientConfig,
  filterItem: FilterItem,
  gridColumns?: Column[],
  signal?: AbortSignal
): Promise<PageResult<DossierViewResult>> => {
  const params = createParams(filterItem, false, gridColumns);
  const queryString = Object.keys(params)
    .map(
      (key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`
    )
    .join("&");
  const url = `${config.host}${ENDPOINT}/entry/list?${queryString}`;
  const apiKey = config.apiKey;

  return get<PageResult<DossierViewResult>>(
    url,
    apiKey,
    config.token,
    signal,
    true
  );
};

export const getEntryTotals = (
  config: TideClientConfig,
  filterItem: FilterItem,
  gridColumns?: Column[],
  signal?: AbortSignal
): Promise<EntryTotals> => {
  const params = createParams(filterItem, false, gridColumns);
  const queryString = Object.keys(params)
    .map(
      (key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`
    )
    .join("&");
  const url = `${config.host}${ENDPOINT}/entry/total?${queryString}`;
  const apiKey = config.apiKey;

  return get<EntryTotals>(url, apiKey, config.token, signal, true);
};

export const getInvoiceList = (
  config: TideClientConfig,
  filterItem: FilterItem,
  gridColumns?: Column[],
  signal?: AbortSignal
): Promise<PageResult<AgentInvoiceItem>> => {
  const params = createParams(filterItem, false, gridColumns);
  const queryString = Object.keys(params)
    .map(
      (key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`
    )
    .join("&");
  const url = `${config.host}${ENDPOINT}/invoice/list?${queryString}`;
  const apiKey = config.apiKey;

  return get<PageResult<AgentInvoiceItem>>(
    url,
    apiKey,
    config.token,
    signal,
    true
  );
};

export const getCustomEntryStatus = (
  config: TideClientConfig,
  signal?: AbortSignal,
  languageCode?: string
): Promise<CustomEntryStatusItem[]> => {
  const url = `${config.host}${ENDPOINT_CUSTOM_ENTRY_STATUS}`;
  const apiKey = config.apiKey;

  return get<CustomEntryStatusItem[]>(
    url,
    apiKey,
    config.token,
    signal,
    true,
    languageCode
  );
};

export const getEntryStatus = (
  config: TideClientConfig,
  signal?: AbortSignal,
  languageCode?: string
): Promise<NumberStringPair[]> => {
  const url = `${config.host}${ENDPOINT_ENUM_ENTRY_STATUS}`;
  const apiKey = config.apiKey;

  return get<NumberStringPair[]>(
    url,
    apiKey,
    config.token,
    signal,
    true,
    languageCode
  );
};

export const changeEntryAgentSurcharge = (
  config: TideClientConfig,
  request: ChangeEntryAgentSurchargeAction,
  signal?: AbortSignal
) => {
  const url = `${config.host}${ENDPOINT_CHANGE_ENTRY_AGENT_SURCHARGE}`;
  const apiKey = config.apiKey;
  const body = JSON.stringify(request);

  return post(url, apiKey, body, config.token, signal);
};
