/**
 * $confirm + API 调用的标准包装 mixin
 *
 * 解决问题：$confirm 取消也会 reject，和 API 失败混在同一个 catch 里无法区分
 *
 * 调用方无需 try/catch，只需判断返回值：
 *  - 返回 true  → 用户取消，静默返回
 *  - 返回 false → action 已执行（成功或失败），拦截器已处理 Message
 *
 * @example
 * import { confirmMixin } from '@/composables/useConfirmHandle'
 * export default {
 *   mixins: [confirmMixin, i18nMixin('page.xxx')],
 *   methods: {
 *     async handleDelete (row) {
 *       const cancelled = await this.$confirmAction(
 *         { message: this.key('confirm_delete'), title: this.key('tip') },
 *         () => deleteApi({ id: row.id })
 *       )
 *       if (cancelled) return
 *       this.$message.success(this.$t(this.key('operation_success')))
 *       this.fetchData()
 *     }
 *   }
 * }
 */
export const confirmMixin = {
  methods: {
    /**
     * @param {Object}   confirmOpts - { message, title, ...$confirm 其余参数 }
     * @param {Function} action      - 确认后执行的 async 函数
     * @returns {Promise<boolean>} true = 已取消, false = 已执行
     */
    async $confirmAction (confirmOpts, action) {
      try {
        await this.$confirm(
          confirmOpts.message ? this.$t(confirmOpts.message) : '',
          confirmOpts.title ? this.$t(confirmOpts.title) : '',
          {
            confirmButtonText: this.$t(confirmOpts.confirmButtonText || 'page.common.confirm'),
            cancelButtonText: this.$t(confirmOpts.cancelButtonText || 'page.common.cancel'),
            type: confirmOpts.type || 'warning',
            closeOnClickModal: confirmOpts.closeOnClickModal !== false
          }
        )
      } catch {
        return true
      }

      try {
        await action()
      } catch {
        // 拦截器已弹出 Message
      }
      return false
    }
  }
}

export default confirmMixin
