"use client";

import React, { createContext, useContext, useEffect, useState } from "react";
import { useAuth } from "@/hooks/useAuth";
import { SessionManager, initSessionManager, cleanupSessionManager, formatTime } from "@/lib/sessionManager";

interface AuthContextType {
  sessionManager: SessionManager | null;
  showSessionWarning: boolean;
  warningTime: number;
}

const AuthContext = createContext<AuthContextType | undefined>(undefined);

interface AuthProviderProps {
  children: React.ReactNode;
}

/**
 * 인증 컨텍스트 프로바이더
 * 전역 세션 관리 및 세션 만료 경고 처리
 */
export function AuthProvider({ children }: AuthProviderProps) {
  const { isLoggedIn, logout } = useAuth();
  const [sessionManager, setSessionManager] = useState<SessionManager | null>(null);
  const [showSessionWarning, setShowSessionWarning] = useState(false);
  const [warningTime, setWarningTime] = useState(0);

  // 세션 매니저 초기화 및 정리
  useEffect(() => {
    if (isLoggedIn) {
      // 세션 매니저 초기화
      const manager = initSessionManager(
        {
          checkInterval: 60000, // 1분마다 체크
          warningTime: 300000, // 5분 전 경고
          maxInactiveTime: 1800000, // 30분 비활성 시 만료
        },
        {
          onWarning: (remainingTime: number) => {
            console.log(`세션 만료 경고: ${formatTime(remainingTime)} 남음`);
            setWarningTime(remainingTime);
            setShowSessionWarning(true);
          },
          onExpiry: () => {
            console.log("세션이 만료되어 자동 로그아웃됩니다");
            setShowSessionWarning(false);
            logout();
          },
          onActivity: () => {
            // 활동 감지 시 경고 숨김
            if (showSessionWarning) {
              setShowSessionWarning(false);
            }
          },
        },
      );

      setSessionManager(manager);
      manager.start();

      return () => {
        manager.stop();
        cleanupSessionManager();
        setSessionManager(null);
      };
    } else {
      // 로그인되지 않은 경우 세션 매니저 정리
      cleanupSessionManager();
      setSessionManager(null);
      setShowSessionWarning(false);
    }
  }, [isLoggedIn, logout, showSessionWarning]);

  const contextValue: AuthContextType = {
    sessionManager,
    showSessionWarning,
    warningTime,
  };

  return <AuthContext.Provider value={contextValue}>{children}</AuthContext.Provider>;
}

/**
 * 인증 컨텍스트 사용 훅
 */
export function useAuthContext() {
  const context = useContext(AuthContext);
  if (context === undefined) {
    throw new Error("useAuthContext must be used within an AuthProvider");
  }
  return context;
}

export default AuthProvider;
