import { BaseService, BaseServiceOptions } from '../../api/services/base-service';
import { createQueryParams } from '../../common';
import { Listing, ListingWithAsset } from '../interfaces';
import {
  EditPriceRequest,
  GetListingsReportRequest,
  SearchListingsRequest,
  SearchListingsResponse,
} from './listing.service.interfaces';

export class ListingService extends BaseService {
  listingApiUrl: string;

  constructor(opts: BaseServiceOptions) {
    super(opts);
    this.listingApiUrl = `${this.apiUrl}/marketplace/v1/listings`;
  }

  search(req: SearchListingsRequest = {}) {
    return this.get<SearchListingsResponse>(this.listingApiUrl, req);
  }

  editPrice(req: EditPriceRequest) {
    return this.put<Listing, EditPriceRequest>(this.listingApiUrl, req);
  }

  reportDownloadUrl(req: GetListingsReportRequest) {
    return this.get<SearchListingsResponse, GetListingsReportRequest>(`${this.listingApiUrl}/reports`, req);
  }

  getById(id: string) {
    return this.get<Listing>(`${this.listingApiUrl}/${id}`);
  }

  removeById(id: string) {
    return this.delete<Listing>(`${this.listingApiUrl}/${id}`);
  }

  getPublic(id: string) {
    return this.get<Listing>(`${this.listingApiUrl}/${id}/public`);
  }

  getByAssetId(assetId: string) {
    return this.get<ListingWithAsset>(`${this.listingApiUrl}/${assetId}/asset`);
  }

  getPublicByAssetId(assetId: string) {
    return this.get<ListingWithAsset>(`${this.listingApiUrl}/${assetId}/public`);
  }

  removeByAssetId(assetId: string) {
    return this.delete<void>(`${this.listingApiUrl}/${assetId}/asset`);
  }

  listingView(listingId: string) {
    return this.put<boolean, object>(`${this.listingApiUrl}/${listingId}/viewed`, {});
  }
}
