import i18next from "i18next";
import { configure, runInAction } from "mobx";
import { http, HttpResponse } from "msw";
import isDefined from "../../../../lib/Core/isDefined";
import CommonStrata from "../../../../lib/Models/Definition/CommonStrata";
import Terria from "../../../../lib/Models/Terria";
import WebProcessingServiceCatalogFunctionJob from "../../../../lib/Models/Catalog/Ows/WebProcessingServiceCatalogFunctionJob";
import { worker } from "../../../mocks/browser";

// For more tests see - test\Models\WebProcessingServiceCatalogFunctionSpec.ts

import regionMapping from "../../../../wwwroot/data/regionMapping.json";

configure({
  enforceActions: "observed",
  computedRequiresReaction: true
});

describe("WebProcessingServiceCatalogFunctionJob", function () {
  let item: WebProcessingServiceCatalogFunctionJob;

  beforeEach(function () {
    const terria = initTerria();
    item = new WebProcessingServiceCatalogFunctionJob("test", terria);
    runInAction(() => {
      item.setTrait(CommonStrata.user, "parameters", {
        name: "point",
        value: "144.97228,-37.77138"
      });
      item.setTrait(CommonStrata.user, "geojsonFeatures", [
        {
          type: "Feature",
          geometry: {
            type: "Point",
            coordinates: [144.97228, -37.77138]
          },
          properties: {}
        }
      ]);
      item.setTrait(CommonStrata.user, "jobStatus", "finished");
    });
    worker.use(
      http.get("*/build/TerriaJS/data/regionMapping.json", () =>
        HttpResponse.json(regionMapping)
      )
    );
  });

  it("has a type & typeName", function () {
    expect(WebProcessingServiceCatalogFunctionJob.type).toBe("wps-result");
    expect(item.typeName).toBe(
      i18next.t("models.webProcessingService.wpsResult")
    );
  });

  describe("after loading metadata", function () {
    it("correctly defines `Inputs` in info", async function () {
      await item.loadMetadata();
      const inputSection = item.info.find((info) => info.name === "Inputs");
      expect(inputSection).toBeDefined();
      if (isDefined(inputSection)) {
        expect(inputSection.content).toMatch(/point/);
        expect(inputSection.content).toMatch(/144.97228,-37.77138/);
      }
    });

    it("sets the featureInfoTemplate", async function () {
      await item.loadMetadata();
      expect(item.featureInfoTemplate.template).toBeDefined();
    });

    describe("shortReportSections", function () {
      it("adds a shortReport for LiteralData output", async function () {
        item.setTrait(CommonStrata.user, "wpsResponse", {
          ProcessOutputs: {
            Output: { Title: "Sum", Data: { LiteralData: "4242" } }
          }
        });
        await item.loadMetadata();
        const shortReport = item.shortReportSections.find(
          (r) => r.name === "Sum"
        );
        expect(shortReport).toBeDefined();
        if (isDefined(shortReport)) {
          expect(shortReport.content).toBe("4242");
        }
      });
    });
  });
});

function initTerria() {
  const terria = new Terria({ baseUrl: "./" });

  return terria;
}
