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

@Injectable()
export class Invoice01EUSTClient extends Base01EUSTClient implements IInvoiceClient {
  @RetryMethod({ ms: 500 })
  public async getUnreconciled(filters: IInvoiceClientFilter): Promise<Invoice[]> {
    const url = `${this.baseURL}/v1/invoices/unreconciled`;

    const params = {
      ...filters,
    };

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

    this.logger.debug(
      `"Invoice01EUSTClient.getUnreconciled" - Sending GET request to url [${url}] with params [${JSON.stringify(
        params,
      )}]`,
    );

    try {
      const { data } = await axios.get<Invoice[]>(url, {
        params,
        headers,
      });

      return data.map((invoice: Invoice) => ({
        ...invoice,
        issueDate: new Date(invoice.issueDate as unknown as string),
        createdAt: new Date(invoice.createdAt as unknown as string),
        updatedAt: new Date(invoice.updatedAt as unknown as string),
      }));
    } catch (error) {
      const message = `Cannot get Unreconciled Invoices: GET - "${url}" | params: [${JSON.stringify(
        params,
      )}]`;
      const err = isAxiosError(error) ? error.response?.data : error;
      this.logger.error(message, err);
      throw new BadGateway(message, undefined, err);
    }
  }
}
