<template>
  <FormGroup v-slot="attrs" :errors="slug.errors">
    <div>
      <div class="tw-flex tw-gap-2 tw-flex-wrap">
        <input v-model="newSlug" type="text" v-bind="attrs" class="tw-min-w-48 tw-flex-[2]" />
        <button
          type="button"
          class="btn btn-default tw-whitespace-nowrap tw-flex-none"
          :disabled="newSlug === show.slug"
          @click="confirmSlugRenaming"
        >
          <Loading v-if="slug.isSaving" class="tw-h-2" />
          {{ t('show.editor.slugRenaming.label') }}
        </button>
      </div>

      <ADescription>{{ t('show.editor.slugRenaming.description') }}</ADescription>
    </div>
  </FormGroup>

  <ConfirmSlugRenaming v-slot="{ resolve }">
    <AConfirmDialog
      :title="t('show.editor.slugRenaming.dialogTitle')"
      :confirm-label="
        t('show.editor.slugRenaming.confirm.confirmLabel', { show: sanitizedShowName })
      "
      :prompt-value="show.slug"
      :prompt-label="t('show.editor.slugRenaming.confirm.prompt', { challenge: show.slug })"
      class="tw-max-w-xl"
      @confirm="resolve(true)"
      @cancel="resolve(false)"
    >
      <SafeHTML
        as="p"
        :html="t('show.editor.slugRenaming.confirm.text', { show: sanitizedShowName })"
        sanitize-preset="inline-noninteractive"
      />
    </AConfirmDialog>
  </ConfirmSlugRenaming>
</template>
<script setup lang="ts">
import FormGroup from '@/components/generic/FormGroup.vue'
import Loading from '@/components/generic/Loading.vue'
import { createTemplatePromise } from '@vueuse/core'
import SafeHTML from '@/components/generic/SafeHTML'
import AConfirmDialog from '@/components/generic/AConfirmDialog.vue'
import { computed, ref, watchEffect } from 'vue'
import { sanitizeHTML } from '@/util'
import { useAPIObjectFieldCopy } from '@/form'
import { Show } from '@/types'
import { useI18n } from '@/i18n'
import { useShowStore } from '@/stores'
import ADescription from '@/components/generic/ADescription.vue'

const props = defineProps<{
  show: Show
}>()

const { t } = useI18n()
const showStore = useShowStore()

const ConfirmSlugRenaming = createTemplatePromise<boolean>()
const sanitizedShowName = computed(() => sanitizeHTML(props.show.name))
const slug = useAPIObjectFieldCopy(showStore, () => props.show, 'slug', { debounce: 0 })
const newSlug = ref(slug.value)

watchEffect(() => (newSlug.value = slug.value))

async function confirmSlugRenaming() {
  if (await ConfirmSlugRenaming.start()) {
    slug.value = newSlug.value
  }
}
</script>