import { Injectable } from '@severo-tech/injection-decorator';
import { BadGateway } from '@somma/node-errors';
import axios, { isAxiosError } from 'axios';
import { IConciliationClient } from '../../application/contracts';
import { Invoice } from '../../domain/invoice';
import { Base01EUSTClient } from './base-01eust-client';
import { RetryMethod } from '../../application/decorators';
import { Debit } from '../../domain/debit';

@Injectable()
export class Conciliation01EUSTClient extends Base01EUSTClient implements IConciliationClient {
  @RetryMethod({ ms: 500 })
  public async conciliate(debits: Debit[], invoices: Invoice[]): Promise<void> {
    const url = `${this.baseURL}/v1/conciliations`;

    const body = {
      debitIds: debits.map(({ id }: Debit): string => id),
      invoiceIds: invoices.map(({ id }: Invoice): string => id),
    };

    const headers = {
      Authorization: await this.getToken(),
    };

    this.logger.debug(
      `"Conciliation01EUSTClient.conciliate" - Sending POST request to url [${url}] with body [${JSON.stringify(body)}]`,
    );

    try {
      await axios.post<{ conciliated: boolean, integrated: boolean }>(
        url,
        body,
        { headers },
      );
    } catch (error) {
      const message = `Cannot conciliate invoices x debits: POST - "${url}" | body: [${JSON.stringify(body)}]`;
      const err = isAxiosError(error) ? error.response?.data : error;
      this.logger.error(message, err);
      throw new BadGateway(message, undefined, err);
    }
  }
}
