'use client';

import { useState, useEffect, useCallback } from 'react';
import { userApi } from '@/entities/user';
import type {
  LoginRequest,
  RegisterRequest,
  User,
  AuthState,
} from '@/entities/user';

const TOKEN_KEY = 'accessToken';
const USER_KEY = 'user';

/**
 * 인증 관련 커스텀 훅
 */
export const useAuth = () => {
  const [authState, setAuthState] = useState<AuthState>({
    user: null,
    token: null,
    isAuthenticated: false,
    isLoading: true,
  });

  // 초기 인증 상태 확인
  useEffect(() => {
    const token = localStorage.getItem(TOKEN_KEY);
    const userStr = localStorage.getItem(USER_KEY);

    if (token && userStr) {
      try {
        const user = JSON.parse(userStr) as User;
        setAuthState({
          user,
          token,
          isAuthenticated: true,
          isLoading: false,
        });
      } catch {
        localStorage.removeItem(TOKEN_KEY);
        localStorage.removeItem(USER_KEY);
        setAuthState({
          user: null,
          token: null,
          isAuthenticated: false,
          isLoading: false,
        });
      }
    } else {
      setAuthState((prev) => ({ ...prev, isLoading: false }));
    }
  }, []);

  // 로그인
  const login = useCallback(async (credentials: LoginRequest) => {
    try {
      const response = await userApi.login(credentials);

      // 토큰을 먼저 저장 (프로필 조회에 필요)
      localStorage.setItem(TOKEN_KEY, response.token);

      // 프로필 조회하여 storeId 포함한 전체 정보 가져오기
      const profile = await userApi.getProfile();

      const user: User = {
        userId: profile.userId,
        userName: profile.userName,
        email: profile.email,
        role: profile.role,
        phoneNumber: profile.phoneNumber,
        storeId: profile.storeId,
        storeName: profile.storeName,
        industry: profile.industry,
        address: profile.address,
        businessHours: profile.businessHours,
      };

      localStorage.setItem(USER_KEY, JSON.stringify(user));

      setAuthState({
        user,
        token: response.token,
        isAuthenticated: true,
        isLoading: false,
      });

      return { success: true, user };
    } catch (error) {
      // 로그인 실패 시 저장된 토큰 삭제
      localStorage.removeItem(TOKEN_KEY);
      return {
        success: false,
        error: error instanceof Error ? error.message : '로그인에 실패했습니다.',
      };
    }
  }, []);

  // 회원가입
  const register = useCallback(async (data: RegisterRequest) => {
    console.log('🔐 useAuth.register 시작');
    console.log('📋 회원가입 데이터:', {
      ...data,
      password: '***'
    });

    try {
      console.log('📡 userApi.register 호출');
      const response = await userApi.register(data);
      console.log('📨 userApi.register 응답:', response);

      const user: User = {
        userId: response.userId,
        userName: response.userName,
        email: data.email,
        role: 'USER',
        storeId: response.storeId,
        storeName: response.storeName,
      };

      console.log('👤 생성된 User 객체:', user);

      localStorage.setItem(TOKEN_KEY, response.token);
      localStorage.setItem(USER_KEY, JSON.stringify(user));
      console.log('💾 localStorage에 토큰과 사용자 정보 저장 완료');

      setAuthState({
        user,
        token: response.token,
        isAuthenticated: true,
        isLoading: false,
      });
      console.log('✅ 인증 상태 업데이트 완료');

      return { success: true, user };
    } catch (error: any) {
      console.error('❌ useAuth.register 에러:', error);

      let errorMessage = '회원가입에 실패했습니다.';

      if (error.response) {
        // 서버가 응답을 반환한 경우
        console.error('서버 응답 에러:', {
          status: error.response.status,
          statusText: error.response.statusText,
          data: error.response.data,
        });
        errorMessage = error.response.data?.message ||
                      error.response.data?.error ||
                      `서버 오류 (${error.response.status})`;
      } else if (error.request) {
        // 요청은 보냈지만 응답을 받지 못한 경우
        console.error('응답 없음:', error.request);
        errorMessage = '서버로부터 응답이 없습니다. 네트워크 연결을 확인해주세요.';
      } else {
        // 요청 설정 중 에러 발생
        console.error('요청 설정 에러:', error.message);
        errorMessage = error.message;
      }

      return {
        success: false,
        error: errorMessage,
      };
    }
  }, []);

  // 로그아웃
  const logout = useCallback(async () => {
    try {
      console.log('📡 로그아웃 API 호출');
      await userApi.logout();
      console.log('✅ 로그아웃 API 성공');
    } catch (error: any) {
      console.warn('⚠️ 로그아웃 API 실패 (서버 에러):', {
        status: error.response?.status,
        message: error.response?.data?.message || error.message,
      });
      console.log('ℹ️ 로컬 상태는 정리하고 로그아웃 처리를 계속합니다');
    } finally {
      console.log('🧹 로컬 토큰 및 사용자 정보 삭제');
      localStorage.removeItem(TOKEN_KEY);
      localStorage.removeItem(USER_KEY);

      setAuthState({
        user: null,
        token: null,
        isAuthenticated: false,
        isLoading: false,
      });
      console.log('✅ 로그아웃 완료 (로컬 상태 정리됨)');
    }
  }, []);

  // 프로필 새로고침
  const refreshProfile = useCallback(async () => {
    try {
      const profile = await userApi.getProfile();

      const user: User = {
        userId: profile.userId,
        userName: profile.userName,
        email: profile.email,
        role: profile.role,
        phoneNumber: profile.phoneNumber,
        storeId: profile.storeId,
        storeName: profile.storeName,
        industry: profile.industry,
        address: profile.address,
        businessHours: profile.businessHours,
      };

      localStorage.setItem(USER_KEY, JSON.stringify(user));
      setAuthState((prev) => ({ ...prev, user }));

      return { success: true, user };
    } catch (error) {
      return {
        success: false,
        error: error instanceof Error ? error.message : '프로필 조회에 실패했습니다.',
      };
    }
  }, []);

  return {
    ...authState,
    login,
    register,
    logout,
    refreshProfile,
  };
};
