import React, { createContext, useContext, useState, useEffect } from 'react';

interface AuthContextType {
  isAuthenticated: boolean;
  login: (username: string, password: string) => Promise<boolean>;
  logout: () => void;
  token: string | null;
}

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

export const useAuth = () => {
  const context = useContext(AuthContext);
  if (context === undefined) {
    throw new Error('useAuth must be used within an AuthProvider');
  }
  return context;
};

export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  const [token, setToken] = useState<string | null>(null);

  useEffect(() => {
    const checkTokenValidity = () => {
      console.log('🔍 인증 토큰 유효성 검사 시작');
      const savedToken = localStorage.getItem('auth_token');
      const tokenExpiry = localStorage.getItem('auth_token_expiry');
      
      console.log('📋 저장된 토큰 존재:', !!savedToken);
      console.log('📋 토큰 만료 시간:', tokenExpiry);
      
      if (savedToken && tokenExpiry) {
        const now = new Date().getTime();
        const expiryTime = parseInt(tokenExpiry);
        
        console.log('📋 현재 시간:', now);
        console.log('📋 만료 시간:', expiryTime);
        console.log('📋 시간 차이:', expiryTime - now);
        
        if (now < expiryTime) {
          // 토큰이 아직 유효함
          setToken(savedToken);
          setIsAuthenticated(true);
          console.log('✅ 토큰이 유효합니다.');
        } else {
          // 토큰이 만료됨
          console.log('❌ 토큰이 만료되었습니다. 로그인이 필요합니다.');
          console.log('⏰ 로그인 권한이 만료되었습니다. 다시 로그인해주세요.');
          setToken(null);
          setIsAuthenticated(false);
          localStorage.removeItem('auth_token');
          localStorage.removeItem('auth_token_expiry');
        }
      } else {
        console.log('📋 저장된 토큰이 없습니다.');
      }
    };

    // 초기 토큰 체크
    checkTokenValidity();

    // 1분마다 토큰 만료 체크 (더 정확한 만료 시간 관리)
    const interval = setInterval(checkTokenValidity, 1 * 60 * 1000);

    return () => clearInterval(interval);
  }, []);

  const login = async (username: string, password: string): Promise<boolean> => {
    try {
      console.log('🔐 로그인 시도 시작');
      console.log('📋 사용자명:', username);
      console.log('📋 비밀번호 존재:', !!password);
      
      // 하드코딩된 인증
      const validUsername = 'admin';
      const validPassword = 'researchqa';

      if (username === validUsername && password === validPassword) {
        console.log('✅ 로그인 성공');
        const fakeToken = 'hardcoded_auth_token_' + Date.now();
        setToken(fakeToken);
        setIsAuthenticated(true);
        
        // 토큰과 만기 시간 저장 (1시간 후)
        const expiryTime = new Date().getTime() + (60 * 60 * 1000); // 1시간 = 60분 * 60초 * 1000ms
        localStorage.setItem('auth_token', fakeToken);
        localStorage.setItem('auth_token_expiry', expiryTime.toString());
        
        console.log('💾 토큰 저장 완료');
        console.log('📋 만료 시간:', new Date(expiryTime).toLocaleString());
        console.log('⏰ 로그인 권한이 1시간 동안 유지됩니다.');
        
        return true;
      } else {
        console.log('❌ 로그인 실패 - 잘못된 자격 증명');
        return false;
      }
    } catch (error) {
      console.error('❌ 로그인 네트워크 오류');
      console.error('📋 오류 타입:', error instanceof Error ? error.name : typeof error);
      console.error('📋 오류 메시지:', error instanceof Error ? error.message : String(error));
      console.error('📋 전체 오류:', error);
      return false;
    }
  };

  const logout = () => {
    console.log('🚪 로그아웃 시작');
    setToken(null);
    setIsAuthenticated(false);
    localStorage.removeItem('auth_token');
    localStorage.removeItem('auth_token_expiry');
    console.log('✅ 로그아웃 완료');
  };

  return (
    <AuthContext.Provider value={{ isAuthenticated, login, logout, token }}>
      {children}
    </AuthContext.Provider>
  );
};
