import soapClient from "./soapClient.js";
import {
  generateAuditRecord,
  AuditRecord,
  FileEngine,
  AuditEngine,
} from "@digigov-oss/gsis-audit-record-db";

import config from "./config.json";

export type AuditInit = AuditRecord;

export type GetValidDisabilityCertificationOutputRecord = { 
  committeeNum: string;
  decisionNum: string;
  disabilityDesc: string;
  disabilityRate: string;
  issuedDate: string;
  responseMessage: string;
  responseSuccess: boolean;
  validFromDate: string;
  validToDate: string;
};

export type GetValidDisabilityCertPercOutputRecord = { 
  committeeNum: string;
  decisionNum: string;
  disabilityRate: string;
  issuedDate: string;
  responseMessage: string;
  responseSuccess: boolean;
  validFromDate: string;
  validToDate: string;
};

export type ErrorRecord = {
  errorCode: string;
  errorDescr: string;
};

/**
 * @type Overrides
 * @description Overrides for the SOAP client
 * @param {boolean} prod - Set to true for production environment
 * @param {string} auditInit - Audit record initializer to be used for the audit record produced
 * @param {string} auditStoragePath - Path to the audit record storage
 */
export type Overrides = {
  endpoint?: string;
  prod?: boolean;
  auditInit?: AuditRecord;
  auditStoragePath?: string;
  auditEngine?: AuditEngine;
};

/**
 * @param passportNumber
 * @param reasonDesc
 * @param user username
 * @param pass password
 * @param overrides options overrides
 * @returns AuditRecord | errorRecord
 */
export const getValidDisabilityCertification = async (
  amka: string,
  date: string,
  user: string,
  pass: string,
  overrides?: Overrides
) => {
  const endpoint = overrides?.endpoint ?? "";
  const prod = overrides?.prod ?? false;
  const auditInit = overrides?.auditInit ?? ({} as AuditRecord);
  const auditStoragePath = overrides?.auditStoragePath ?? "/tmp";
  const auditEngine =
    overrides?.auditEngine ?? new FileEngine(auditStoragePath);
  const wsdl = prod == true ? config.prod.wsdl : config.test.wsdl;
  const auditRecord = await generateAuditRecord(auditInit, auditEngine);
  if (!auditRecord) throw new Error("Audit record is not initialized");

  try {
    const s = new soapClient(wsdl, user, pass, auditRecord, endpoint);
    const response:
      | GetValidDisabilityCertificationOutputRecord
      | ErrorRecord = await s.getValidDisabilityCertification(amka, date);
    return { kedResponse: response, auditRecord: auditRecord };
  } catch (error) {
    throw error;
  }
};

/**
 * @param name
 * @param surname
 * @param dateOfBirth
 * @param reasonDesc
 * @param user username
 * @param pass password
 * @param overrides options overrides
 * @returns AuditRecord | errorRecord
 */
export const getValidDisabilityCertPerc = async (
  amka: string,
  date: string,
  user: string,
  pass: string,
  overrides?: Overrides
) => {
  const endpoint = overrides?.endpoint ?? "";
  const prod = overrides?.prod ?? false;
  const auditInit = overrides?.auditInit ?? ({} as AuditRecord);
  const auditStoragePath = overrides?.auditStoragePath ?? "/tmp";
  const auditEngine =
    overrides?.auditEngine ?? new FileEngine(auditStoragePath);
  const wsdl = prod == true ? config.prod.wsdl : config.test.wsdl;
  const auditRecord = await generateAuditRecord(auditInit, auditEngine);
  if (!auditRecord) throw new Error("Audit record is not initialized");

  try {
    const s = new soapClient(wsdl, user, pass, auditRecord, endpoint);
    const response:
      | GetValidDisabilityCertPercOutputRecord
      | ErrorRecord = await s.getValidDisabilityCertPerc(amka, date);
    return { kedResponse: response, auditRecord: auditRecord };
  } catch (error) {
    throw error;
  }
};

export default { getValidDisabilityCertification, getValidDisabilityCertPerc };
