import axios, { AxiosResponse } from 'axios';
import { DefaultOptions } from '@apollo/client/core';
import { Logger } from '@nestjs/common';

export class MarketService {
  private readonly logger = new Logger(MarketService.name);

  public apolloDefaultOptions: DefaultOptions = {
    watchQuery: {
      fetchPolicy: 'no-cache',
      errorPolicy: 'ignore',
    },
    query: {
      fetchPolicy: 'no-cache',
      errorPolicy: 'all',
    },
  };

  get name(): string {
    return 'MarketService';
  }

  public async sleep(ms: number): Promise<any> {
    return new Promise(resolve => setTimeout(resolve, ms));
  }

  /**
   * Get Currency Price
   */
  public async getPrice(token: string, currency: string): Promise<number> {
    try {
      const response: AxiosResponse = await axios.get(
        `https://api.coingecko.com/api/v3/simple/price?ids=${token}&vs_currencies=${currency}`,
        {
          method: 'get',
          headers: {
            Accept: 'application/json',
          },
          timeout: 5000,
          transformResponse: [
            function transformResponse(data) {
              return JSON.parse(data);
            },
          ],
        },
      );
      this.logger.debug(
        `Fetched price ${token}/${currency}: ${response.data[token][currency]}`,
      );
      return response.data[token][currency];
    } catch (err) {
      this.logger.error(err);
    }
  }
}