import { Injectable } from '@nestjs/common'
import { ConfigService } from '@nestjs/config';
import axios from "axios"
import { MainApiAnswerDTO } from './dto/main-api-answer';
import { MainApiError } from './main-api-error';
import { MainApiProductsInfoDTO } from './dto/main-api-products-info-dto';
import { MainApiMakeOrderSiteRequestDTO, MainApiMakeOrderSiteResponseDTO } from './dto/main-api-make-order-site';
import { MainApiCheckCouponDTO } from './dto/main-api-check-coupon';

@Injectable()
export class MainApiService{
  
  constructor (
    private _configService: ConfigService
  ) {
    
  }


  async callMethod<T>(method: string, args: any = {}): Promise<T> {
    const host = this._configService.get('integration.mainApiHost')
    const key = this._configService.get('integration.mainApiKey')

    const response = await axios.post<MainApiAnswerDTO<T>>(
      host + "api/" + method,
      {
        ...args,
        key: key
      },
      {
        headers: {
          'Content-Type': 'application/json'
        }
      }
    )

    if (response.data.error){
      throw new MainApiError(
        response.data.error.message,
        response.data.error.code
      )
    }

    return response.data.res as T;
  }
  
  async getProducts(): Promise<MainApiProductsInfoDTO> {
    return await this.callMethod<MainApiProductsInfoDTO>('studio/getProductsForStudioSite');
  }

  async checkCoupon(code: string, email: string): Promise<MainApiCheckCouponDTO> {
    return await this.callMethod<MainApiCheckCouponDTO>('studio/shopCheckCouponSite', {
      code,
      email
    })
  }

  async makeOrderSite(req: MainApiMakeOrderSiteRequestDTO): Promise<MainApiMakeOrderSiteResponseDTO>{
    return await this.callMethod<MainApiMakeOrderSiteResponseDTO>('studio/shopMakeOrderSite', req)
  }
}
