<script context="module" lang="ts">
  /**
   * @typedef {"initial"} DELETE_STEP_INITIAL
   */
  const DELETE_STEP_INITIAL = 'initial'
  /**
   * @typedef {"confirm"} DELETE_STEP_CONFIRM
   */
  const DELETE_STEP_CONFIRM = 'confirm'
  /**
   * @typedef {"deleting"} DELETE_STEP_DELETING
   */
  const DELETE_STEP_DELETING = 'deleting'
</script>

<script lang="ts">
  import { Button, Tile, Tag } from 'carbon-components-svelte'
  import { TrashCan } from 'carbon-icons-svelte'

  /**
   * @type {(DELETE_STEP_INITIAL|DELETE_STEP_CONFIRM|DELETE_STEP_DELETING)}
   */
  let deleteCommandStep = DELETE_STEP_INITIAL

  /**
   * Command ID
   * @type {Object.<string, any>}
   */
  export let registration
  /**
   * Command name; used to execute command
   * @type {string}
   */
  export let name
  /**
   * Command description
   * @type {string}
   */
  export let description

  export let tags

  const id = registration?.id

  async function onDeleteCommand() {
    deleteCommandStep = DELETE_STEP_DELETING
    let data
    try {
      const response = await fetch(`/api/admin/commands/delete/${id}`, {
        method: 'DELETE',
        body: JSON.stringify({ id }),
      })
      if (response.ok && response.status === 200) {
        data = await response.json()
        // TODO: improve popping command from list without reload
        location.reload()
      }
    } catch (error) {
      console.error('Unable to delete command', error)
    }
    deleteCommandStep = DELETE_STEP_INITIAL
    return data
  }
</script>

<Tile>
  <article>
    <div>
      <div>
        <slot name="header">
          <h3>{name}</h3>
        </slot>
        <slot name="tags">
          {#if tags}
            <div>
              {#each tags as tag}
                <Tag>{tag}</Tag>
              {/each}
            </div>
          {/if}
        </slot>
      </div>
      <div>
        {#if id}
          {#if deleteCommandStep === DELETE_STEP_INITIAL}
            <Button
              kind="danger-tertiary"
              iconDescription="Delete"
              icon="{TrashCan}"
              on:click="{() => (deleteCommandStep = DELETE_STEP_CONFIRM)}"
            />
          {:else if deleteCommandStep === DELETE_STEP_CONFIRM}
            <Button
              kind="danger-tertiary"
              iconDescription="Confirm delete"
              on:click="{onDeleteCommand}"
            >
              Are you sure?
            </Button>
          {:else if deleteCommandStep === DELETE_STEP_DELETING}
            <Button
              kind="danger-tertiary"
              iconDescription="Confirm delete"
              disabled
            >
              Are you sure?
            </Button>
          {/if}
        {/if}
      </div>
    </div>
    <!-- command metadata 
          enabled?
          permissions?
          update button
          delete button
  -->
    <!-- <h3>{name}</h3> -->
    <p>{description}</p>
    <!-- command name -->
    <!-- command description -->
    <!-- command options -->
  </article>
</Tile>

<style>
  article {
    display: grid;
    grid-auto-flow: row;
    grid-row-gap: var(--cds-spacing-04);
  }

  article > div {
    display: flex;
    justify-content: space-between;
  }

  article span {
    color: var(--cds-text-03);
  }
</style>