<script lang="ts">
  // Languages in the language itself
  import native from "../../assets/language_native.json"
  // Translated languages
  import language_translations from "../../assets/language_translations.json"

  import { Store, UIEventSource } from "../../Logic/UIEventSource"
  import Locale from "../i18n/Locale"
  import { LanguageIcon } from "@babeard/svelte-heroicons/solid"
  import Dropdown from "../Base/Dropdown.svelte"
  import { twMerge } from "tailwind-merge"
  import Translations from "../i18n/Translations"
import { ariaLabel } from "../../Utils/ariaLabel"
  /**
   * Languages one can choose from
   * Defaults to _all_ languages known by MapComplete
   */
  export let availableLanguages: string[] = Object.keys(native)
  /**
   * EventStore to assign to, defaults to 'Locale.langauge'
   */
  export let assignTo: UIEventSource<string> = Locale.language
  export let preferredLanguages: Store<string[]> = undefined
  let preferredFiltered: string[] = undefined
  preferredLanguages?.addCallbackAndRunD((preferredLanguages) => {
    let lng = navigator.language
    if (lng === "en-US") {
      lng = "en"
    }
    if (preferredLanguages?.indexOf(lng) < 0) {
      preferredLanguages?.push(lng)
    }
    preferredFiltered = preferredLanguages?.filter((l) => availableLanguages.indexOf(l) >= 0)
  })
  export let clss: string = undefined
  let current = Locale.language
</script>

{#if availableLanguages?.length > 1}
  <form class={twMerge("flex items-center max-w-full pr-4", clss)}>
    <label class="flex neutral-label" use:ariaLabel={Translations.t.general.pickLanguage}>
      <LanguageIcon class="h-4 w-4 mr-1 shrink-0" aria-hidden="true" />
      <Dropdown cls="max-w-full" value={assignTo}>
        {#if preferredFiltered}
          {#each preferredFiltered as language}
            <option value={language} class="font-bold">
              {native[language] ?? ""}
              {#if language !== $current}
                ({language_translations[language]?.[$current] ?? language})
              {/if}
            </option>
          {/each}
          <option disabled />
        {/if}

        {#each availableLanguages.filter(l => l !== "_context") as language}
          <option value={language} class="font-bold">
            {native[language] ?? ""}
            {#if language !== $current}
              {#if language_translations[language]?.[$current] !== undefined}
                ({ language_translations[language]?.[$current] + " - " + language ?? language})
              {:else}
                ({language})
              {/if}
            {/if}
          </option>
        {/each}
      </Dropdown>
    </label>
  </form>
{/if}