import { defineStore } from 'pinia'
import { ref } from 'vue'

// 전역 다이얼로그(알림/확인) — window.alert/confirm 을 대체하는 공통 모달의 상태 저장소.
// 디자인/구조는 업무 삭제 모달과 동일(전역 relay.css 의 .modal-* / .mbtn 클래스 사용).

export type DialogVariant = 'info' | 'success' | 'warning' | 'danger'
export type DialogMode = 'alert' | 'confirm'

// 호출 시 넘길 수 있는 옵션
export interface DialogOptions {
  /** 제목을 따로 지정하면 본문 텍스트는 설명(desc)으로 내려간다 */
  title?: string
  /** 아이콘/버튼 색 계열 */
  variant?: DialogVariant
  /** 확인 버튼 문구 */
  confirmText?: string
  /** 취소 버튼 문구(confirm 전용) */
  cancelText?: string
}

// 현재 표시 중인 다이얼로그 상태
export interface DialogState {
  id: number
  mode: DialogMode
  title: string
  desc?: string
  variant: DialogVariant
  confirmText: string
  cancelText: string
  resolve: (ok: boolean) => void
}

export const useDialogStore = defineStore('dialog', () => {
  // 현재 떠 있는 다이얼로그(없으면 null)
  const current = ref<DialogState | null>(null)
  // 동시에 여러 개가 요청되면 순차 표시(큐)
  const queue: DialogState[] = []
  let seq = 0

  function enqueue(
    mode: DialogMode,
    text: string,
    opts: DialogOptions,
    defaults: { variant: DialogVariant; confirmText: string },
  ): Promise<boolean> {
    return new Promise<boolean>((resolve) => {
      const item: DialogState = {
        id: ++seq,
        mode,
        // title 을 따로 주면 본문은 설명으로, 아니면 본문이 곧 제목
        title: opts.title ?? text,
        desc: opts.title ? text : undefined,
        variant: opts.variant ?? defaults.variant,
        confirmText: opts.confirmText ?? defaults.confirmText,
        cancelText: opts.cancelText ?? '취소',
        resolve,
      }
      if (current.value) queue.push(item)
      else current.value = item
    })
  }

  // 알림(OK 한 개) — 항상 true 로 resolve
  function alert(text: string, opts: DialogOptions = {}): Promise<boolean> {
    return enqueue('alert', text, opts, { variant: 'info', confirmText: '확인' })
  }

  // 확인(취소/확인) — 확인=true, 취소/바깥클릭=false
  function confirm(text: string, opts: DialogOptions = {}): Promise<boolean> {
    return enqueue('confirm', text, opts, { variant: 'danger', confirmText: '확인' })
  }

  // 사용자 응답 처리 후 다음 큐로 전환
  function settle(ok: boolean) {
    current.value?.resolve(ok)
    current.value = queue.shift() ?? null
  }

  return { current, alert, confirm, settle }
})
