<script lang="ts">
import { fileTypeFromBuffer } from 'file-type';
import type Embedding from './Embedding.svelte';
import type Embeddings from './Embeddings.svelte';

import { EmbeddedFile, EMBED_TYPES } from './main';

  import { settings } from './stores'

  export let id = ''
  export let files: EmbeddedFile[];
  export let inst: Embedding | Embeddings;

  let isVideo = false

  inst.$on("fileinfo", (info) => {
    isVideo = isVideo || info.detail.type.mime.startsWith('video/');
  })

  let visible = false
  function reveal() {
    visible = !visible
    document.dispatchEvent(new CustomEvent('reveal', { detail: { id } }))
  }
  const isNotChrome = !navigator.userAgent.includes("Chrome/");

  async function downloadFile(file: EmbeddedFile) {
    const a = document.createElement("a") as HTMLAnchorElement;
    document.body.appendChild(a);
    a.style.display = 'none';
    const thumb = Buffer.isBuffer(file.data) ? file.data : await file.data();
    const type = await fileTypeFromBuffer(thumb);
    const url = URL.createObjectURL(new Blob([thumb], { type: type?.mime }))
    a.href = url;
    a.download = file.filename;
    a.click();
    window.URL.revokeObjectURL(url);
  }

  let black = new Set<string>();
  settings.subscribe(s => {
      black = new Set(s.blacklist);
  });
  let blackHits = files.filter(file => file.tags?.some(e => black.has(e)) ?? false) ?? [''];
</script>

{#if $settings.eye}
  <span
    on:click={reveal}
    class:fa-eye={!visible}
    class:fa-eye-slash={visible}
    class="fa clickable"
  />
{/if}
{#each files as file}
<span
  title={file.filename}
  on:click={() => downloadFile(file)}
  class="fa fa-download clickable"
  class:hasembed={file?.embed_type === EMBED_TYPES.MEDIA_EMBED}
  class:hasext={file?.embed_type === EMBED_TYPES.THIRD_EYE}
  class:hasblack={file?.isBlacklisted === true}
/> <!-- hasblack is last for it to have greater weight than hasext, to override it -->

{#if file.source}
<!-- svelte-ignore a11y-missing-content -->
<a
  href={file.source}
  target="_blank"
  class="clickable"
  class:hasembed={file?.embed_type === EMBED_TYPES.MEDIA_EMBED}
  class:hasext={file?.embed_type === EMBED_TYPES.THIRD_EYE}
  class:hasblack={file?.isBlacklisted === true}
>Source</a>
{/if}
{#if file.page}
<!-- svelte-ignore a11y-missing-content -->
<a
  href={file.page.url}
  target="_blank"
  class="clickable"
  class:hasembed={file?.embed_type === EMBED_TYPES.MEDIA_EMBED}
  class:hasext={file?.embed_type === EMBED_TYPES.THIRD_EYE}
  class:hasblack={file?.isBlacklisted === true}
>{file.page.title}</a>
{/if}
{#if file.tags}
<!-- svelte-ignore a11y-missing-content -->
<details class="tags">
  <summary
  class:hasembed={file?.embed_type === EMBED_TYPES.MEDIA_EMBED}
  class:hasext={file?.embed_type === EMBED_TYPES.THIRD_EYE}
  class:hasblack={file?.isBlacklisted === true}
    >Tags</summary>
  <ul>
    {#each file.tags as tag}
    <li class:hasblack-bg={black.has(tag)}>{tag}</li>
    {/each}
  </ul>
</details>
{/if}
{#if isNotChrome && isVideo}
  <!-- svelte-ignore a11y-missing-attribute -->
  <a on:click={(ev) => { inst.bepis(ev); }}
  alt="By clicking this you agree to stay hydrated"
  class="clickable"
  class:hasembed={file?.embed_type === EMBED_TYPES.MEDIA_EMBED}
  class:hasext={file?.embed_type === EMBED_TYPES.THIRD_EYE}
  class:hasblack={file?.isBlacklisted === true}
    >[PEE contract]</a
  >
{/if}
{/each}

<style scoped>
  .clickable {
    cursor: pointer;
    /* margin-left: 5px; */

    /* Custom */
    margin-left: 2px;
    margin-right: 2px;
  }

  .hasembed {
    color: deeppink;
  }
  .hasext {
    color: goldenrod;
  }
  .hasblack {
    color: black;
  }

  /*
  .hasembed-bg {
    background-color: deeppink;
  }
  .hasext-bg {
    background-color: goldenrod;
  }
  */
  .hasblack-bg {
    background-color: black;
  }
  .clickable:hover {
    text-shadow: 0 0 4px palevioletred;
  }
  a.clickable.hasembed {
    color: deeppink !important;
  }
  a.clickable.hasext {
    color: goldenrod !important;
  }
  a.clickable.hasblack {
    color: black !important;
  }

  details.tags {
    display: inline-block;
  }
  .tags > ul {
    position: absolute;
    min-width: 35px;

    list-style: none;
    margin-top: 2px;
    padding: 0;
    background-color: #00000044;
  }
  .tags > ul > li {
    padding: 2px 2px;
    margin-bottom: 2px;
  }
</style>
