import ContentConfigurationResults from "../ContentConfigurationResults";
import ContentConfigurationElements from "../ContentConfigurationElements";
import LayoutHintCollection from "../../layouthint/LayoutHintCollection";

describe("contentConfigurationResults", () => {
  it("should be able to create an instance of ContentConfigurationResults", () => {
    const contentConfigurationResults = new ContentConfigurationResults();

    expect(contentConfigurationResults).toBeInstanceOf(
      ContentConfigurationResults,
    );
    expect(contentConfigurationResults.label).toBeNull();
    expect(contentConfigurationResults.description).toBeNull();
    expect(contentConfigurationResults.attributes).toStrictEqual([]);
    expect(contentConfigurationResults.getFormConfigElement()).toBeInstanceOf(
      ContentConfigurationElements,
    );
    expect(contentConfigurationResults.calculatedResultElements).toBeInstanceOf(
      ContentConfigurationElements,
    );
    expect(contentConfigurationResults.positiveResultElements).toBeInstanceOf(
      ContentConfigurationElements,
    );
    expect(contentConfigurationResults.negativeResultElements).toBeInstanceOf(
      ContentConfigurationElements,
    );
    expect(contentConfigurationResults.resultElements).toBeInstanceOf(
      ContentConfigurationElements,
    );
    expect(contentConfigurationResults.layouthint).toBeInstanceOf(
      LayoutHintCollection,
    );
  });

  it("can handle configuration with description object", () => {
    const message =
      "<p>The property value is ${EstimatedPropertyValue} and my personal deposit is ${MortgageDeposit}. The mortgage is a repayment mortgage for a term of ${MortgageTermInYears} years. The rate type is ${InterestRateType} for a period of ${PeriodOfInterestRate}.</p>";

    const contributions = {
      label: "Total cost of mortgage",
      description: {
        id: "CalculatorResults.TotalCostOfMortgage.introText",
        message,
      },
      layouthint: ["render-description:TotalCostOfMortgage"],
      attributes: ["TotalCostOfMortgage"],
      resultElements: [
        {
          labelElement: {
            label: "Result label",
            labelTypes: ["ResultLabel"],
          },
        },
      ],
    };

    const contentConfigurationResults = new ContentConfigurationResults(
      contributions,
    );

    expect(contentConfigurationResults.label).toBe("Total cost of mortgage");
    expect(contentConfigurationResults.description).toBe(message);
    expect(contentConfigurationResults.attributes).toStrictEqual([
      "TotalCostOfMortgage",
    ]);
    expect(
      contentConfigurationResults.calculatedResultElements.hasConfig(),
    ).toBe(false);
    expect(contentConfigurationResults.positiveResultElements.hasConfig()).toBe(
      false,
    );
    expect(contentConfigurationResults.negativeResultElements.hasConfig()).toBe(
      false,
    );
    expect(contentConfigurationResults.resultElements.hasConfig()).toBe(true);
    expect(
      contentConfigurationResults.resultElements.labelConfig,
    ).toStrictEqual([
      {
        icon: "",
        label: "Result label",
        layouthint: new LayoutHintCollection(),
        type: "labelElement",
        types: ["ResultLabel"],
      },
    ]);
  });

  it("can handle configuration with description string", () => {
    const message =
      "<p>The property value is ${EstimatedPropertyValue} and my personal deposit is ${MortgageDeposit}. The mortgage is a repayment mortgage for a term of ${MortgageTermInYears} years. The rate type is ${InterestRateType} for a period of ${PeriodOfInterestRate}.</p>";

    const contentConfigurationResults = new ContentConfigurationResults({
      label: "Total cost of mortgage",
      description: message,
    });

    expect(contentConfigurationResults.label).toBe("Total cost of mortgage");
    expect(contentConfigurationResults.description).toBe(message);
  });
});
