<script lang="ts">
  import type { DialogOption } from "./types";
  import { createEventDispatcher } from "svelte";
  import { gameFactsStore, addGameFactToFactArray } from "./gameFacts";
  import Typewriter from "svelte-typewriter";

  const dispatch = createEventDispatcher();

  export let imageUrl: string;
  export let title: string | undefined;
  export let text: string;
  export let options: DialogOption[] = [];
  $: usableOptions = options.filter((option) =>
    isDialogOptionAllowedByGameFacts(option, $gameFactsStore)
  );
  export let addFacts: String[] = [];
  $: {
    if (Array.isArray(addFacts)) {
      const gameFactsAfterAddedFacts = addFacts.reduce(
        (accFacts, factToAdd) => addGameFactToFactArray(factToAdd, accFacts),
        $gameFactsStore
      );
      $gameFactsStore = gameFactsAfterAddedFacts;
    }
  }
  export let removeFacts: String[] = [];
  $: {
    if (Array.isArray(removeFacts)) {
      const gameFactsAfterRemovedFacts = removeFacts.reduce(
        (accFacts, factToRemove) => accFacts.filter((f) => f !== factToRemove),
        $gameFactsStore
      );
      $gameFactsStore = gameFactsAfterRemovedFacts;
    }
  }

  function isDialogOptionAllowedByGameFacts(
    option: DialogOption,
    gameFacts: String[]
  ): boolean {
    // Check if all required facts are given
    if (Array.isArray(option.requiredFacts)) {
      const isOk = option.requiredFacts.every((requiredFact) =>
        gameFacts.includes(requiredFact)
      );
      if (!isOk) {
        return false;
      }
    }

    // Check if no forbidden facts are given
    if (Array.isArray(option.forbiddenFacts)) {
      const isOk = option.forbiddenFacts.every(
        (forbiddenFact) => !gameFacts.includes(forbiddenFact)
      );
      if (!isOk) {
        return false;
      }
    }

    return true;
  }

  function handleDialogOptionClick(option: DialogOption): void {
    dispatch("switchToDialog", option.linksToDialog);
  }
</script>

{#if typeof title === "string"}
  <h3>
    {title}
  </h3>
{/if}

<img src={imageUrl} alt="Portrait" />

<div>
  <Typewriter cascade interval={10} cursor={false}>
    {#each text.split("\n") as para}
      <p>{para}</p>
    {/each}
  </Typewriter>
</div>
<hr />
<div>
  {#each usableOptions as option}
    <button on:click={() => handleDialogOptionClick(option)}>
      {option.text}
    </button>
    <br />
  {/each}
</div>

<style>
  img {
    max-height: 15rem;
  }
</style>