import { db } from "../../database/database";
import DataFetcher from "../data-fetcher";
import { BeatSaverMap } from "../types/beatsaver/beatsaver-map";

const API_BASE = "https://api.beatsaver.com";
const LOOKUP_MAP_BY_HASH_ENDPOINT = `${API_BASE}/maps/hash/:query`;

class BeatSaverFetcher extends DataFetcher {
  constructor() {
    super("BeatSaver");
  }

  /**
   * Gets the map that match the query.
   *
   * @param query the query to search for
   * @param useProxy whether to use the proxy or not
   * @returns the map that match the query, or undefined if no map were found
   */
  async getMapBsr(query: string, useProxy = true): Promise<string | undefined> {
    this.log(`Looking up the bsr for map hash ${query}...`);

    const map = await db.beatSaverMaps.get(query);
    // The map is cached
    if (map != undefined) {
      this.log(`Found cached bsr ${map.bsr} for map hash ${query}`);
      return map.bsr;
    }

    const response = await this.fetch<BeatSaverMap>(useProxy, LOOKUP_MAP_BY_HASH_ENDPOINT.replace(":query", query));
    // Map not found
    if (response == undefined) {
      return undefined;
    }

    const bsr = response.id;
    if (bsr == undefined) {
      return undefined;
    }

    // Save map the the db
    await db.beatSaverMaps.add({
      hash: query,
      bsr: bsr,
    });
    this.log(`Looked up bsr ${bsr} for map hash ${query}`);
    return bsr;
  }
}

export const beatsaverFetcher = new BeatSaverFetcher();