<script>
  import { _ } from "svelte-i18n";
  import {
    RunnerService,
    RunnerTeamService,
    RunnerOrganizationService,
  } from "@odit/lfk-client-js";
  import store from "../../store";
  import RunnersEmptyState from "./RunnersEmptyState.svelte";
  import Select from "svelte-select";
  import GenerateSponsoringContracts from "../pdf_generation/GenerateSponsoringContracts.svelte";
  import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte";
  import GenerateRunnerCertificates from "../pdf_generation/GenerateRunnerCertificates.svelte";
  let pageLoaded = false;
  $: searchvalue = "";
  $: active_deletes = [];
  export let current_runners = [];
  const runners_promise = RunnerService.runnerControllerGetAll().then((val) => {
    current_runners = val;
    pageLoaded = true;
  });
  $: selectedFilter_teams = null;
  $: selectedFilter = null;
  $: filter__teams = selectedFilter_teams || [];
  $: filter__orgs = selectedFilter || [];
  $: filterGroupIDs = filter__teams.concat(filter__orgs).map((i) => i.value);
  $: sponsoring_contracts_show = current_runners.some(
    (r) => r.is_selected === true
  );
  $: cards_show = current_runners.some((r) => r.is_selected === true);
  $: certificates_show = current_runners.some((r) => r.is_selected === true);
  $: generate_runners = current_runners.filter((r) => r.is_selected === true);
  $: teams = [];
  $: orgs = [];
  $: mappedteams = teams.map(function (g) {
    return { value: g.id, label: g.parentGroup.name + " > " + g.name };
  });
  $: selectgroups = orgs
    .map(function (g) {
      return { value: g.id, label: g.name };
    })
    .concat(mappedteams);

  RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
    teams = val;
  });
  RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => {
    orgs = val;
  });
  function should_display_based_on_id(id) {
    if (searchvalue.toString().slice(-1) === "*") {
      return id.toString().startsWith(searchvalue.replace("*", ""));
    }
    return id.toString() === searchvalue;
  }
</script>

{#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:GET")}
  {#await runners_promise}
    <div
      class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
      role="alert"
    >
      <p class="font-bold">{$_("runners-are-being-loaded")}</p>
      <p class="text-sm">{$_("this-might-take-a-moment")}</p>
    </div>
  {:then}
    {#if current_runners.length === 0}
      <RunnersEmptyState />
    {:else}
      <input
        type="search"
        bind:value={searchvalue}
        placeholder={$_("datatable.search")}
        aria-label={$_("datatable.search")}
        class="gridjs-input gridjs-search-input mb-4"
      />
      <div class="block mb-6">
        <label for="country" class="text-sm font-medium text-gray-700"
          >{$_("filter-by-organization-team")}</label
        >
        <Select
          on:select={(event) => {
            selectedFilter = event.detail;
          }}
          selectedValue={selectedFilter}
          placeholder={$_("filter-by-organization-team")}
          containerClasses="mt-1 py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
          items={selectgroups}
          isMulti={true}
        />
      </div>
      <div class="h-12">
        <GenerateSponsoringContracts
          bind:sponsoring_contracts_show
          bind:generate_runners
        />
        <GenerateRunnerCards bind:cards_show bind:generate_runners />
        <GenerateRunnerCertificates
          bind:certificates_show
          bind:generate_runners
        />
      </div>
      <div
        class:hidden={!pageLoaded}
        class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll"
      >
        <table class="divide-y divide-gray-200 w-full table-fixed">
          <thead class="bg-gray-50">
            <tr>
              <th
                scope="col"
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
              >
                <span
                  on:click={() => {
                    const newstate = !current_runners.some(
                      (r) => r.is_selected === true
                    );
                    current_runners = current_runners.map((r) => {
                      r.is_selected = newstate;
                      return r;
                    });
                  }}
                  class="underline cursor-pointer select-none"
                  >{#if current_runners.some((r) => r.is_selected === true)}
                    {$_("deselect-all")}
                  {:else}{$_("select-all")}{/if}
                </span>
              </th>
              <th
                scope="col"
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
              >
                {$_("name")}
              </th>
              <th
                scope="col"
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
              >
                {$_("contact-information")}
              </th>
              <th
                scope="col"
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
              >
                {$_("group")}
              </th>
              <th
                scope="col"
                class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider"
              >
                {$_("distance-in-km")}
              </th>
              <th scope="col" class="relative px-6 py-3">
                <span class="sr-only">{$_("action")}</span>
              </th>
            </tr>
          </thead>
          <tbody class="divide-y divide-gray-200">
            {#each current_runners as runner}
              {#if `${runner.firstname} ${runner.lastname}`
                .toLowerCase()
                .includes(searchvalue.toLowerCase()) || `${runner.firstname} ${runner.middlename || ""} ${runner.lastname}`
                  .toLowerCase()
                  .includes(searchvalue.toLowerCase()) || searchvalue === `#${runner.id}`}
                {#if filterGroupIDs.includes(runner.group.id) || filterGroupIDs.includes(runner.group.parentGroup?.id) || filterGroupIDs.length === 0}
                  <tr
                    data-rowid="user_{runner.id}"
                    data-groupid={runner.group.id}
                  >
                    <td class="px-6 py-4 whitespace-nowrap">
                      <input
                        bind:checked={runner.is_selected}
                        type="checkbox"
                        class="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
                      />
                    </td>
                    <td class="px-6 py-4 whitespace-nowrap">
                      <div class="flex items-center">
                        <div class="ml-4">
                          <div class="text-sm font-medium text-gray-900">
                            {runner.firstname}
                            {runner.middlename || ""}
                            {runner.lastname}
                          </div>
                        </div>
                      </div>
                    </td>
                    <td class="px-6 py-4 whitespace-nowrap">
                      {#if runner.email}
                        <div class="text-sm text-gray-500">{runner.email}</div>
                      {/if}
                      {#if runner.phone}
                        <div class="text-sm text-gray-500">{runner.phone}</div>
                      {/if}
                      {#if runner.address.address1 !== null}
                        {runner.address.address1}<br />
                        {runner.address.address2 || ""}<br />
                        {runner.address.postalcode}
                        {runner.address.city}
                        {runner.address.country}
                      {/if}
                    </td>
                    <td class="px-6 py-4 whitespace-nowrap">
                      {#if runner.group.responseType === "RUNNERTEAM"}
                        <a
                          href="../teams/{runner.group.id}"
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
                          >{runner.group.parentGroup.name} &gt; {runner.group
                            .name}</a
                        >
                      {/if}
                      {#if runner.group.responseType === "RUNNERORGANIZATION"}
                        <a
                          href="../orgs/{runner.group.id}"
                          class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800"
                          >{runner.group.name}</a
                        >
                      {/if}
                    </td>
                    <td class="px-6 py-4 whitespace-nowrap">
                      {runner.distance / 1000} km
                    </td>
                    {#if active_deletes[runner.id] === true}
                      <td
                        class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
                      >
                        <button
                          on:click={() => {
                            active_deletes[runner.id] = false;
                          }}
                          tabindex="0"
                          class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer"
                          >{$_("cancel-delete")}</button
                        >
                        <button
                          on:click={() => {
                            RunnerService.runnerControllerRemove(
                              runner.id,
                              true
                            )
                              .then((resp) => {
                                current_runners = current_runners.filter(
                                  (obj) => obj.id !== runner.id
                                );
                              })
                              .catch((err) => {});
                          }}
                          tabindex="0"
                          class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
                          >{$_("confirm-delete")}</button
                        >
                      </td>
                    {:else}
                      <td
                        class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
                      >
                        <a
                          href="./{runner.id}"
                          class="text-indigo-600 hover:text-indigo-900"
                          >{$_("details")}</a
                        >
                        {#if store.state.jwtinfo.userdetails.permissions.includes("RUNNER:DELETE")}
                          <button
                            on:click={() => {
                              active_deletes[runner.id] = true;
                            }}
                            tabindex="0"
                            class="ml-4 text-red-600 hover:text-red-900 cursor-pointer"
                            >{$_("delete")}</button
                          >
                        {/if}
                      </td>
                    {/if}
                  </tr>
                {/if}
              {/if}
            {/each}
          </tbody>
        </table>
      </div>
    {/if}
  {:catch error}
    <div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
      <span class="inline-block align-middle mr-8">
        <b class="capitalize">{$_("general_promise_error")}</b>
        {error}
      </span>
    </div>
  {/await}
{/if}
