/**
 * 提交去重 Hook（ai14）
 *
 * 生成幂等 key，防止快速点击导致的重复提交
 * 支持基于 crypto.randomUUID 的 key 生成与降级方案
 */

import { useState, useCallback, useRef } from "react";

export interface UseSubmitDedupReturn {
  /** 幂等 key（每次新提交生成新的） */
  idempotencyKey: string;
  /** 是否正在提交中 */
  isSubmitting: boolean;
  /** 标记开始提交（生成新 key + 锁定） */
  markSubmitting: () => void;
  /** 标记提交完成（解锁，生成新 key 供下次使用） */
  markComplete: () => void;
  /** 是否允许提交（未在提交中） */
  canSubmit: boolean;
}

/** 生成幂等 key（优先 crypto.randomUUID，降级 Date+Random） */
function generateIdempotencyKey(examId: string): string {
  if (
    typeof crypto !== "undefined" &&
    typeof crypto.randomUUID === "function"
  ) {
    return `exam-${examId}-${crypto.randomUUID()}`;
  }
  return `exam-${examId}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
}

export function useSubmitDedup(examId: string): UseSubmitDedupReturn {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [idempotencyKey, setIdempotencyKey] = useState(() =>
    generateIdempotencyKey(examId),
  );
  const lockRef = useRef(false);

  const markSubmitting = useCallback(() => {
    if (lockRef.current) return;
    lockRef.current = true;
    setIdempotencyKey(generateIdempotencyKey(examId));
    setIsSubmitting(true);
  }, [examId]);

  const markComplete = useCallback(() => {
    lockRef.current = false;
    setIsSubmitting(false);
    setIdempotencyKey(generateIdempotencyKey(examId));
  }, [examId]);

  const canSubmit = !lockRef.current;

  return {
    idempotencyKey,
    isSubmitting,
    markSubmitting,
    markComplete,
    canSubmit,
  };
}
