import {
  AttachmentApi,
  DocumentApi,
  Document,
  ModifyResponse,
  Service,
  ServiceApi,
  InteragencyTemplateApi,
  InteragencyApi,
  SettingsForServiceProcessApi,
} from '@openapi/registry-service';
import axios, { AxiosPromise, AxiosResponse } from 'axios';

const documentApi = new DocumentApi();
const interagencyApi = new InteragencyApi();
const serviceApi = new ServiceApi();
const interagencyTemplateApi = new InteragencyTemplateApi();

/* Common */
const unlink = (
  that: any,
  schema: string,
  parentLinkedObject: any,
  formKey: string,
  formId: string
) => {
  const document = {
    [formKey]: formId,
    id: parentLinkedObject.id,
    modified: parentLinkedObject.modified,
  };
  let unlinkRequest: any = () => {};
  switch (schema) {
    case 'ServiceDocument':
      unlinkRequest = documentApi.unlinkDocument.bind(that, schema, [document]);
      break;
    case 'Interagency':
      // @ts-ignore
      unlinkRequest = interagencyApi.unlinkInteragency.bind(that, [document]);
      break;
    case 'Service':
      // @ts-ignore
      unlinkRequest = serviceApi.unlinkService.bind(that, [document]);
      break;
    case 'Form':
      // @ts-ignore
      unlinkRequest = serviceApi.unlinkService.bind(that, [document]);
      break;
  }
  return unlinkRequest();
}

/* Services */
function updateService(service: Service): AxiosPromise<ModifyResponse> {
  return serviceApi.updateService([service]);
}

function unlinkService(service: Service): AxiosPromise<ModifyResponse> {
  return serviceApi.unlinkService([service]);
}

/* Attachments */
const attachmentApi = new AttachmentApi();

function fetchAttachment(
  schema: string,
  id: string,
  fileName: string,
  urlOnly = true
) {
  return attachmentApi
    .getDocumentFile(schema, id, fileName)
    .then((result) => {
      return urlOnly ? result.request?.responseURL : result.data;
    })
    .catch((e) => e);
}

function updateAttachment(
  schema: string,
  id: string,
  description?: string,
  files?: Array<any>
): AxiosPromise<ModifyResponse> {
  return attachmentApi.updateDocumentFile(schema, id, description, files);
}

/* Documents */
function createDocument(
  schema: string,
  document: Document[]
): AxiosPromise<ModifyResponse> {
  return documentApi.createDocument(schema, document);
}

function fetchDocument(
  schema: string,
  id: string,
  expand: string
): AxiosPromise<Document> {
  return documentApi.getDocument(schema, id, expand);
}

function updateDocument(
  schema: string,
  document: Document[]
): AxiosPromise<ModifyResponse> {
  return documentApi.updateDocument(schema, document);
}

async function getServicesOfOrganization(domainId: string): Promise<string[]> {
  const { data } = await axios.get<string[]>(
    `/service/registry/service/edges/to/organization/${domainId}/from/service/list`
  );
  return data;
}

/* SettingsForService= */
const settingsForServiceProcessApi = new SettingsForServiceProcessApi();

function createProcessWithAttachment(
  files: any,
  options: any,
): any {
  console.log(files);
  console.log(options);
  
  return settingsForServiceProcessApi.createProcessWithAttachment(files, options);
}
interface ExportRefugeeRegistryAnnulate {
  /**
   * Уникальный идентификатор документа
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  id?: string;
  /**
   * Дата модификации как UnixTime (Может требоваться при обновлении)
   * @type {number}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  modified?: number;
  /**
   * Имя схемы документа
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  schema?: string;
  /**
   * Заголовок
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  title?: string;
  /**
   * Регистрационный номер
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  regNumber?: string;
  /**
   * Отправлено
   * @type {boolean}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  sent?: boolean;
  /**
   * Подписано
   * @type {boolean}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  signed?: boolean;
  /**
   * Ссылка на файл экспорта в S3
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  dataFileLink?: string;
  /**
   * Подпись файл экспорта
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  dataFileSig?: string;
  /**
   * Ссылка на файл отчета в S3
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  reportLink?: string;
  /**
   * Подпись файл отчета
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  reportSig?: string;
  /**
   * GUID XML импорта
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  xmlGuid?: string;
  /**
   * Статус
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  state?: string;
  /**
   * Дата создания
   * @type {number}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  created?: number;
  /**
   * Дата подписи
   * @type {number}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  signDate?: number;
  /**
   * Дата аннулирования
   * @type {number}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  cancelDate?: number;
  /**
   * Хеш подписи
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  sigHash?: string;
  /**
   * ID департамента
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  departmentId?: string;
  /**
   * Название департамента
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  departmentName?: string;
  /**
   * Регион
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  region?: string;
  /**
   * Наименование региона
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  regionName?: string;
  /**
   * Причина аннулирования
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  cancelReason?: string;
  /**
   * текущая дата импорта файла (на момент импорта) в миллисекундах
   * @type {number}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  importTimestamp?: number;
  /**
   * Наименование ипортируемого файла
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  importFileName?: string;
  /**
   * информация о юзере, который совершил выгрузку, подтягивается из токена юзера, который запустил бп
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  importUserId?: string;
  /**
   * Ссылка на импортируемый файл в S3
   * @type {string}
   * @memberof ExportRegistryKompensDetskOtdMIRAllOf
   */
  importFileLink?: string;
}

/* Interagency Templates */
function createInteragencyTemplate(
  file: File,
  interagencyId: string
): AxiosPromise<ModifyResponse> {
  const bodyFormData = new FormData();
  bodyFormData.append('file', file);
  bodyFormData.append('interagencyId', interagencyId);
  return interagencyTemplateApi.createInteragencyTemplate({
    data: bodyFormData,
  });
}

export {
  updateService,
  unlinkService,
  fetchAttachment,
  updateAttachment,
  createDocument,
  fetchDocument,
  updateDocument,
  getServicesOfOrganization,
  ExportRefugeeRegistryAnnulate,
  createInteragencyTemplate,
  unlink,
};
