<template>
  <Transition name="dialog">
    <div v-if="show" class="dialog-overlay" @click.self="handleCancel">
      <div class="dialog">
        <h3>{{ dialogTitle }}</h3>
        <p v-html="dialogMessage"></p>
        <div class="dialog-buttons">
          <button class="btn-cancel" @click="handleCancel" :disabled="loading">
            {{ dialogCancelText }}
          </button>
          <button 
            v-if="dialogShowDiscard" 
            class="btn-discard" 
            :class="dialogDiscardVariant"
            @click="handleDiscard"
            :disabled="loading"
          >
            <span v-if="loading === 'discard'" class="btn-loader"></span>
            <span v-else>{{ dialogDiscardText }}</span>
          </button>
          <button 
            class="btn-confirm" 
            :class="dialogVariant"
            @click="handleConfirm"
            :disabled="loading"
          >
            <span v-if="loading === 'confirm'" class="btn-loader"></span>
            <span v-else>{{ dialogConfirmText }}</span>
          </button>
        </div>
      </div>
    </div>
  </Transition>
</template>

<script setup>
import { ref, computed, watch } from 'vue'
import { DIALOGS } from '../stores/dialogs'

const props = defineProps({
  show: {
    type: Boolean,
    default: false
  },
  // Тип диалога из конфига (archive, restore, deleteTask, etc.)
  type: {
    type: String,
    default: null
  },
  // Прямые props (переопределяют type если заданы)
  title: String,
  message: String,
  confirmText: String,
  cancelText: String,
  discardText: String,
  showDiscard: {
    type: Boolean,
    default: undefined
  },
  variant: String,
  discardVariant: String,
  // Async callback для подтверждения — сам управляет loading
  action: {
    type: Function,
    default: null
  },
  // Async callback для discard (опционально)
  discardAction: {
    type: Function,
    default: null
  }
})

// Получаем конфиг по типу
const config = computed(() => props.type ? DIALOGS[props.type] : {})

// Computed свойства с fallback: props → config → default
const dialogTitle = computed(() => props.title ?? config.value.title ?? 'Подтверждение')
const dialogMessage = computed(() => props.message ?? config.value.message ?? 'Вы уверены?')
const dialogConfirmText = computed(() => props.confirmText ?? config.value.confirmText ?? 'Подтвердить')
const dialogCancelText = computed(() => props.cancelText ?? 'Отмена')
const dialogDiscardText = computed(() => props.discardText ?? config.value.discardText ?? 'Не сохранять')
const dialogShowDiscard = computed(() => props.showDiscard ?? config.value.showDiscard ?? false)
const dialogVariant = computed(() => props.variant ?? config.value.variant ?? 'default')
const dialogDiscardVariant = computed(() => props.discardVariant ?? config.value.discardVariant ?? 'default')

const emit = defineEmits(['confirm', 'cancel', 'discard', 'update:show'])

// Внутреннее состояние загрузки: null | 'confirm' | 'discard'
const loading = ref(null)

// Сброс состояния при закрытии диалога
watch(() => props.show, (newVal) => {
  if (!newVal) {
    loading.value = null
  }
})

const handleConfirm = async () => {
  if (loading.value) return
  
  // Если есть async action — вызываем его и управляем loading
  if (props.action) {
    loading.value = 'confirm'
    try {
      await props.action()
      // Успех — эмитим confirm и закрываем диалог
      emit('confirm')
      emit('update:show', false)
    } catch (e) {
      console.error('ConfirmDialog action failed:', e)
      // При ошибке — не закрываем диалог
    } finally {
      loading.value = null
    }
  } else {
    // Простой режим — просто эмитим и закрываем
    emit('confirm')
    emit('update:show', false)
  }
}

const handleCancel = () => {
  if (loading.value) return
  emit('cancel')
  emit('update:show', false)
}

const handleDiscard = async () => {
  if (loading.value) return
  
  // Если есть async discardAction — вызываем его и управляем loading
  if (props.discardAction) {
    loading.value = 'discard'
    try {
      await props.discardAction()
      // Успех — эмитим discard и закрываем диалог
      emit('discard')
      emit('update:show', false)
    } catch (e) {
      console.error('ConfirmDialog discardAction failed:', e)
      // При ошибке — не закрываем диалог
    } finally {
      loading.value = null
    }
  } else {
    // Простой режим — просто эмитим и закрываем
    emit('discard')
    emit('update:show', false)
  }
}
</script>

<style scoped>
.dialog-overlay {
  position: fixed;
  inset: 0;
  background: var(--bg-body);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 2000;
}

.dialog {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  width: 100%;
  height: 100%;
  padding: 24px;
}

.dialog h3 {
  margin: 0 0 16px;
  font-size: 24px;
  font-weight: 600;
  color: var(--text-primary);
}

.dialog p {
  margin: 0 0 48px;
  font-size: 16px;
  color: var(--text-muted);
  line-height: 1.5;
  max-width: 320px;
}

.dialog-buttons {
  display: flex;
  flex-direction: column;
  gap: 12px;
  width: 100%;
  max-width: 320px;
}

.dialog-buttons button {
  width: 100%;
  padding: 16px 24px;
  border-radius: 12px;
  font-size: 16px;
  font-weight: 500;
  cursor: pointer;
  transition: all 0.2s ease;
  border: none;
  font-family: inherit;
}

.btn-cancel {
  background: rgba(255, 255, 255, 0.08);
  color: var(--text-muted);
}

.btn-cancel:hover {
  background: rgba(255, 255, 255, 0.12);
  color: var(--text-primary);
}

.btn-discard {
  background: rgba(239, 68, 68, 0.15);
  color: #ef4444;
}

.btn-discard:hover {
  background: rgba(239, 68, 68, 0.25);
}

.btn-discard.warning {
  background: rgba(245, 158, 11, 0.15);
  color: #fbbf24;
}

.btn-discard.warning:hover {
  background: rgba(245, 158, 11, 0.25);
  color: #fcd34d;
}

.btn-discard.danger {
  background: #ef4444;
  color: #fff;
}

.btn-discard.danger:hover {
  background: #dc2626;
}

.btn-discard:disabled {
  opacity: 0.7;
  cursor: not-allowed;
}

.btn-confirm {
  background: var(--accent);
  color: #000;
}

.btn-confirm:hover {
  background: #00e6b8;
}

.btn-confirm.danger {
  background: rgba(239, 68, 68, 0.15);
  color: #f87171;
}

.btn-confirm.danger:hover {
  background: rgba(239, 68, 68, 0.25);
  color: #fca5a5;
}

.btn-confirm.warning {
  background: rgba(245, 158, 11, 0.15);
  color: #fbbf24;
}

.btn-confirm.warning:hover {
  background: rgba(245, 158, 11, 0.25);
  color: #fcd34d;
}

.btn-confirm:disabled {
  opacity: 0.7;
  cursor: not-allowed;
}

.btn-loader {
  display: inline-block;
  width: 18px;
  height: 18px;
  border: 2px solid rgba(255, 255, 255, 0.3);
  border-top-color: currentColor;
  border-radius: 50%;
  animation: spin 0.7s linear infinite;
}

@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

/* Transition */
.dialog-enter-active,
.dialog-leave-active {
  transition: opacity 0.25s ease;
}

.dialog-enter-active .dialog,
.dialog-leave-active .dialog {
  transition: transform 0.25s ease;
}

.dialog-enter-from,
.dialog-leave-to {
  opacity: 0;
}

.dialog-enter-from .dialog {
  transform: translateY(20px);
}

.dialog-leave-to .dialog {
  transform: translateY(-20px);
}
</style>
