import { describe, it, expect } from "vitest";
import { precipitations } from "../src/data/weather/precipitations.ts";
import { specials } from "../src/data/weather/specials.ts";
import { temperatures } from "../src/data/weather/temperatures.ts";
import { winds } from "../src/data/weather/winds.ts";

describe("weather Tests", () => {
  describe("temperature", () => {
    const temps = new Set(temperatures.map((element) => {
      return element.name;
    }));
    it("temperatures should be unique", () => {
      expect(temps.size, "temperatures are not unique!").toBe(
        temperatures.length,
      );
    });
  });

  describe("winds", () => {
    const wind = new Set(winds.map((element) => {
      return element.name;
    }));
    it("winds should be unique", () => {
      expect(wind.size, "winds are not unique!").toBe(winds.length);
    });
  });

  describe("precipitations", () => {
    const precip = new Set(precipitations.map((element) => {
      return element.name;
    }));
    it("precipitations should be unique", () => {
      expect(precip.size, "precipitations are not unique!").toBe(
        precipitations.length,
      );
    });

    for (const precipitation of precipitations) {
      it(`${precipitation.name} should have unique temps`, () => {
        if (precipitation.temps === "any") {
          return;
        }
        const temps = new Set(precipitation.temps);
        expect(temps.size, `${precipitation.name} temps are not unique!`).toBe(
          precipitation.temps.length,
        );
      });

      it(`${precipitation.name} should have unique winds`, () => {
        if (precipitation.winds === "any") {
          return;
        }
        const winds = new Set(precipitation.winds);
        expect(winds.size, `${precipitation.name} winds are not unique!`).toBe(
          precipitation.winds.length,
        );
      });
    }
  });

  describe("specials", () => {
    const spec = new Set(specials.map((element) => {
      return element.name;
    }));
    it("specials should be unique", () => {
      expect(spec.size, "specials are not unique!").toBe(specials.length);
    });

    for (const special of specials) {
      it(`${special.name} should have unique temps`, () => {
        if (special.temps === "any") {
          return;
        }
        const temps = new Set(special.temps);
        expect(temps.size, `${special.name} temps are not unique!`).toBe(
          special.temps.length,
        );
      });

      it(`${special.name} should have unique winds`, () => {
        if (special.winds === "any") {
          return;
        }
        const winds = new Set(special.winds);
        expect(special.winds, "Special winds are not unique!").toHaveLength(
          winds.size,
        );
      });

      it(`${special.name} should have unique precipitation`, () => {
        if (special.precipitations === "any") {
          return;
        }
        const precip = new Set(special.precipitations);
        expect(
          precip.size,
          `${special.name} precipitation is not unique!`,
        ).toBe(special.precipitations.length);
      });
    }
  });
});
