<script lang="ts">
  import { Store, UIEventSource } from "../../Logic/UIEventSource"
  import Loading from "../Base/Loading.svelte"
  import Tr from "../Base/Tr.svelte"
  import Translations from "../i18n/Translations"
  import { default as SearchResultSvelte } from "./SearchResult.svelte"
  import MoreScreen from "../BigComponents/MoreScreen"
  import type { GeocodeResult } from "../../Logic/Geocoding/GeocodingProvider"

  import ActiveFilters from "./ActiveFilters.svelte"
  import Constants from "../../Models/Constants"
  import type { ActiveFilter } from "../../Logic/State/LayerState"
  import ThemeViewState from "../../Models/ThemeViewState"
  import FilterResult from "./FilterResult.svelte"
  import ThemeResult from "./ThemeResult.svelte"
  import SidebarUnit from "../Base/SidebarUnit.svelte"
  import { TrashIcon } from "@babeard/svelte-heroicons/mini"
  import { Dropdown, DropdownItem } from "flowbite-svelte"
  import DotsCircleHorizontal from "@rgossiaux/svelte-heroicons/solid/DotsCircleHorizontal"
  import DotMenu from "../Base/DotMenu.svelte"
  import { CogIcon } from "@rgossiaux/svelte-heroicons/solid"

  export let state: ThemeViewState
  let activeFilters: Store<ActiveFilter[]> = state.layerState.activeFilters.map(fs => fs.filter(f => Constants.priviliged_layers.indexOf(<any>f.layer.id) < 0))
  let recentlySeen: UIEventSource<GeocodeResult[]> = state.searchState.recentlySearched.seenThisSession
  let recentThemes = state.userRelatedState.recentlyVisitedThemes.mapD(thms => thms.filter(th => th !== state.layout.id).slice(0, 6))
  let allowOtherThemes = state.featureSwitches.featureSwitchBackToThemeOverview
  let searchTerm = state.searchState.searchTerm
  let results = state.searchState.suggestions
  let isSearching = state.searchState.suggestionsSearchRunning
  let filterResults = state.searchState.filterSuggestions
  let themeResults = state.searchState.themeSuggestions

</script>
<div class="p-4 low-interaction flex gap-y-2 flex-col">

  <ActiveFilters activeFilters={$activeFilters} />

  {#if $searchTerm.length > 0 && $filterResults.length > 0}
    <SidebarUnit>

      <h3>Pick a filter below</h3>

      <div class="flex flex-wrap">
        {#each $filterResults as filterResult (filterResult)}
          <FilterResult {state} entry={filterResult} />
        {/each}
      </div>
    </SidebarUnit>
  {/if}

  <!-- Actual search results (or ""loading"", or ""no results"")-->
  {#if $searchTerm.length > 0}
    <SidebarUnit>

      <h3>Locations</h3>

      {#if $isSearching}
        <div class="flex justify-center m-4 my-8">
          <Loading />
        </div>
      {/if}

      {#if $results?.length > 0}
        {#each $results as entry (entry)}
          <SearchResultSvelte on:select {entry} {state} />
        {/each}

      {:else if !$isSearching}
        <b class="flex justify-center p-4">
          <Tr t={Translations.t.general.search.nothingFor.Subs({term: $searchTerm})} />
        </b>
      {/if}
    </SidebarUnit>

  {/if}


  <!-- Other maps which match the search term-->
  {#if $themeResults.length > 0}
    <SidebarUnit>
      <h3>
        Other maps
      </h3>
      {#each $themeResults as entry (entry.id)}
        <ThemeResult {entry} />
      {/each}
    </SidebarUnit>
  {/if}


  {#if $searchTerm.length == 0 && $recentlySeen?.length > 0}
    <SidebarUnit>
      <div class="flex justify-between">

        <h3 class="m-2">
          <Tr t={Translations.t.general.search.recents} />
        </h3>
        <DotMenu>
          <button on:click={() => {state.searchState.recentlySearched.seenThisSession.set([])}}>
            <TrashIcon />
            Delete search history
          </button>
          <button on:click={() => state.guistate.openUsersettings("sync-visited-locations")}>
            <CogIcon />
            Edit sync settings
          </button>
        </DotMenu>
      </div>
      {#each $recentlySeen as entry (entry)}
        <SearchResultSvelte {entry} {state} on:select />
      {/each}
    </SidebarUnit>
  {/if}

  {#if $searchTerm.length === 0 && $recentThemes?.length > 0 && $allowOtherThemes}
    <SidebarUnit>
      <div class="flex w-full justify-between">

        <h3 class="m-2">
          <Tr t={Translations.t.general.search.recentThemes} />
        </h3>
        <DotMenu>
          <button on:click={() => {state.userRelatedState.recentlyVisitedThemes.set([])}}>
            <TrashIcon />
            Delete earlier visited themes
          </button>
          <button on:click={() => state.guistate.openUsersettings("sync-visited-themes")}>
            <CogIcon />
            Edit sync settings
          </button>
        </DotMenu>
      </div>
      {#each $recentThemes as themeId (themeId)}
        <SearchResultSvelte
          entry={{payload: MoreScreen.officialThemesById.get(themeId), osm_id: themeId, category: "theme"}}
          {state}
          on:select />
      {/each}

    </SidebarUnit>
  {/if}


</div>