/**
 * 窗口关闭守卫 Hook
 * ================
 *
 * 监听 Tauri 窗口关闭事件。当有未完成的操作（第三方调用或本地处理）时，
 * 弹出确认框阻止误关闭；用户确认后再执行关闭。
 */

import { useEffect } from 'react';
import { getCurrentWindow } from '@tauri-apps/api/window';
import { confirm } from '@tauri-apps/plugin-dialog';
import { hasPendingOperations } from '../utils/pendingOperations';
import { isTauri } from '../utils/env';

export function useCloseGuard() {
  useEffect(() => {
    let unlisten: (() => void) | undefined;
    // 用户确认关闭后，避免再次弹窗导致循环
    const closingRef = { current: false };

    const setup = async () => {
      if (!isTauri()) {
        return;
      }
      const currentWindow = getCurrentWindow();
      unlisten = await currentWindow.onCloseRequested((event) => {
        if (closingRef.current || !hasPendingOperations()) {
          return;
        }
        // 同步阻止默认关闭行为，再异步询问用户
        event.preventDefault();

        (async () => {
          const confirmed = await confirm(
            '当前有任务正在执行，关闭窗口会中断处理。已提交的任务和已扣除的积分不会回退，确定要关闭吗？',
            {
              title: '确认关闭',
              kind: 'warning',
              okLabel: '确定关闭',
              cancelLabel: '取消',
            },
          );
          if (confirmed) {
            closingRef.current = true;
            await currentWindow.close();
          }
        })().catch(console.error);
      });
    };

    setup().catch(console.error);

    return () => {
      unlisten?.();
    };
  }, []);
}
