import type { Ref } from 'vue';
import { setStorage, getStorage, removeStorage } from '@/utils/storage';
// 既支持指定的固定值，也支持任意字符串
export type CaptchaType = 'phone' | 'email' | string;

// 本地存储的状态类型
interface StoredCaptchaState {
  type: CaptchaType; // 验证码类型
  receiver: string; // 接收方（手机号/邮箱）
  sendTime: number; // 发送时间戳（毫秒）
  totalSeconds: number; // 总倒计时时长（默认60）
}

// 倒计时状态类型（供组件绑定）
export interface CaptchaCountdownState {
  countdown: Ref<number>; // 剩余秒数
  isCounting: Ref<boolean>; // 是否正在倒计时
  timer: number | null; // 定时器标识
  key: string; // 唯一标识（区分不同场景/类型的验证码，如：register_phone）
}

/**
 * 初始化验证码倒计时状态（支持刷新恢复）
 * @param key 唯一标识（必填，如：register_phone/register_email/forgotPassword_phone）
 * @param totalSeconds 总倒计时时长（默认60秒）
 * @param pagePrefix 页面级唯一前缀（可选，用于隔离不同页面的倒计时状态）
 * @returns 倒计时状态对象
 */
export const initCaptchaState = (
  key: string,
  totalSeconds: number = 60,
  pagePrefix?: string
): CaptchaCountdownState => {
  // 生成完整的 key，包含页面级前缀以避免跨页面状态污染
  const fullKey = pagePrefix ? `${pagePrefix}_${key}` : key;

  const state: CaptchaCountdownState = {
    countdown: ref(0),
    isCounting: ref(false),
    timer: null,
    key: fullKey
  };

  // 页面刷新后，从sessionStorage恢复状态
  const stored = getStorage<StoredCaptchaState>(`captcha_${fullKey}`, 'session');
  if (stored) {
    try {
      const now = Date.now();
      // 计算剩余时间 = 总时长 - (当前时间 - 发送时间戳)/1000
      const remaining = stored.totalSeconds - Math.floor((now - stored.sendTime) / 1000);

      // 剩余时间>0，恢复倒计时
      if (remaining > 0) {
        state.countdown.value = remaining;
        state.isCounting.value = true;

        // 重启定时器
        state.timer = window.setInterval(() => {
          state.countdown.value--;
          // 同步更新本地存储的剩余时间（可选，增强鲁棒性）
          updateStoredCaptchaState(state.key, state.countdown.value);

          if (state.countdown.value <= 0) {
            clearCaptchaTimer(state); // 倒计时结束，清除状态
          }
        }, 1000);
      } else {
        // 剩余时间<=0，清空本地存储
        removeStorage(`captcha_${fullKey}`, 'session');
      }
    } catch (e) {
      console.error('恢复验证码倒计时状态失败：', e);
      removeStorage(`captcha_${fullKey}`, 'session');
    }
  }

  return state;
};

/**
 * 更新本地存储的验证码状态（内部使用）
 */
const updateStoredCaptchaState = (key: string, remaining: number) => {
  const stored = getStorage<StoredCaptchaState>(`captcha_${key}`, 'session');
  if (stored) {
    // 仅更新剩余时间（可选，核心是时间戳，剩余时间只是辅助）
    setStorage(`captcha_${key}`, {
      ...stored,
      // 可选：记录剩余时间，方便初始化时快速读取
      remaining
    }, 'session');
  }
};

/**
 * 通用发送验证码函数（支持手机/邮箱，防刷新重复发送）
 * @param type 验证码类型：phone/email
 * @param receiver 接收方：手机号/邮箱地址
 * @param state 倒计时状态（由initCaptchaState生成）
 * @param sendApi 实际发送验证码的接口函数（需自行实现，入参为receiver）
 * @returns Promise<boolean> 发送是否成功
 */
export const sendCaptcha = async (
  type: CaptchaType,
  receiver: string,
  state: CaptchaCountdownState,
  sendCodeApi: (receiver: string) => Promise<any>
): Promise<boolean> => {
  // ========== 核心：刷新后防重复发送的校验 ==========
  const stored = getStorage<StoredCaptchaState>(`captcha_${state.key}`, 'session');
  if (stored) {
    const now = Date.now();
    const elapsed = Math.floor((now - stored.sendTime) / 1000); // 已过去的秒数

    // 未到冷却期（60秒），禁止发送
    if (elapsed < stored.totalSeconds) {
      const remaining = stored.totalSeconds - elapsed;
      ElNotification({
        message: `请${remaining}秒后再发送验证码`,
        type: 'warning',
        duration: 2000,
        customClass: 'global-notification'
      });
      // 恢复倒计时（防止内存状态和本地存储不一致）
      state.countdown.value = remaining;
      state.isCounting.value = true;
      return false;
    }
  }

  // ========== 原有校验 ==========
  if (state.isCounting.value) {
    ElNotification({
      message: '验证码已发送，请勿重复点击',
      type: 'warning',
      duration: 2000,
      customClass: 'global-notification'
    });
    return false;
  }
  if (!receiver) {
    ElNotification({
      message: `请输入${type === 'phone' ? '手机号' : '邮箱'}`,
      type: 'warning',
      duration: 2000,
      customClass: 'global-notification'
    });
    return false;
  }

  try {
    // 1. 调用真实发送接口
    await sendCodeApi(receiver);

    // 2. 发送成功提示
    ElNotification({
      message: `验证码已发送至${type === 'phone' ? '手机' : '邮箱'}，请注意查收`,
      type: 'success',
      duration: 2000,
      customClass: 'global-notification'
    });

    // 3. 记录发送状态到本地存储（核心：防刷新）
    const storedState: StoredCaptchaState = {
      type,
      receiver,
      sendTime: Date.now(), // 发送时间戳（毫秒）
      totalSeconds: 60 // 总倒计时时长
    };
    setStorage(`captcha_${state.key}`, storedState, 'session');



    // 4. 启动60秒倒计时
    state.isCounting.value = true;
    state.countdown.value = 60;

    // 清除旧定时器（防止重复）
    if (state.timer) clearInterval(state.timer);

    // 5. 定时器逻辑（同步更新本地存储）
    state.timer = window.setInterval(() => {
      state.countdown.value--;
      // 同步更新本地存储的剩余时间
      updateStoredCaptchaState(state.key, state.countdown.value);

      if (state.countdown.value <= 0) {
        clearCaptchaTimer(state); // 倒计时结束，清除所有状态
      }
    }, 1000);

    return true;
  } catch (error) {
    ElNotification({
      message: `发送${type}验证码失败：${(error as Error).message || '未知错误'}`,
      type: 'error',
      duration: 2000,
      customClass: 'global-notification'
    });
    console.error(`发送${type}验证码失败：`, error);
    return false;
  }
};

/**
 * 清除验证码倒计时（组件卸载/倒计时结束时调用，防止内存泄漏+清空本地存储）
 * @param state 倒计时状态
 */
export const clearCaptchaTimer = (state: CaptchaCountdownState): void => {
  // 1. 清除定时器
  if (state.timer) {
    clearInterval(state.timer);
    state.timer = null;
  }

  // 2. 重置内存状态
  state.countdown.value = 0;
  state.isCounting.value = false;

  // 3. 清空本地存储（核心：倒计时结束后允许重新发送）
  removeStorage(`captcha_${state.key}`, 'session');
};