/**
 * This script compares the data we get from the OWLS bulk endpoint to the data
 * we get by loading the data with the new individual endpoint! This will help
 * us check for bugs as we switch over!
 */
const fetch = require("node-fetch");
const connectToDb = require("../src/server/db");
const buildLoaders = require("../src/server/loaders");
const { getOWLSTradeValue } = require("../src/server/nc-trade-values");

async function main() {
  const db = await connectToDb();
  const { itemTranslationLoader } = buildLoaders(db);

  // Load the bulk data. We're gonna loop through it all!
  const bulkEndpointRes = await fetch(
    `http://localhost:3000/api/allNCTradeValues`
  );
  const bulkEndpointData = await bulkEndpointRes.json();

  // Load the item names, bc our bulk data is keyed by item ID.
  const itemIds = Object.keys(bulkEndpointData);
  const itemTranslations = await itemTranslationLoader.loadMany(itemIds);

  // Load the OWLs data! I don't do any of it in parallel, because I'm worried
  // about upsetting the server, y'know?
  let numChecked = 0;
  let numSuccesses = 0;
  let numFailures = 0;
  for (const { name, itemId } of itemTranslations) {
    if (numChecked % 100 === 0) {
      console.info(`Checked ${numChecked} items`);
    }
    numChecked++;
    const expectedValueText = bulkEndpointData[itemId].valueText;
    let actualValue;
    try {
      actualValue = await getOWLSTradeValue(name);
    } catch (error) {
      console.error(`[${itemId} / ${name}]: Error loading data:\n`, error);
      numFailures++;
      continue;
    }
    if (actualValue == null) {
      console.error(`[${itemId} / ${name}]: No value found.`);
      numFailures++;
      continue;
    }
    const actualValueText = actualValue.valueText;
    if (expectedValueText !== actualValueText) {
      console.error(
        `[${itemId}]: Value did not match. ` +
          `Expected: ${JSON.stringify(expectedValueText)}. ` +
          `Actual: ${JSON.stringify(actualValueText)}`
      );
      numFailures++;
      continue;
    }
    numSuccesses++;
  }
  console.info(
    `Checked all ${numChecked} items. ` +
      `${numSuccesses} successes, ${numFailures} failures.`
  );
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .then(() => process.exit());