import { create } from "zustand";
import { persist } from "zustand/middleware";

/**
 * [사용자 정보 타입]
 */
export interface User {
  id: string;
  email: string;
  name?: string;
  avatar?: string;
  createdAt?: string;
}

/**
 * [인증 상태 인터페이스]
 */
interface AuthState {
  // ========== 상태 ==========
  user: User | null;
  isAuthenticated: boolean;

  // ========== 액션 ==========
  setUser: (user: User | null) => void;
  updateUser: (updates: Partial<User>) => void;
  logout: () => void;
}

/**
 * [인증 스토어]
 *
 * 전역 사용자 인증 상태를 관리합니다.
 * - localStorage에 자동 저장 (persist 미들웨어)
 * - 페이지 새로고침 시에도 상태 유지
 *
 * @example
 * ```tsx
 * import { useAuthStore } from '@/stores/auth-store';
 *
 * function Profile() {
 *   const { user, isAuthenticated, setUser } = useAuthStore();
 *
 *   if (!isAuthenticated) return <Login />;
 *   return <div>Welcome, {user?.email}</div>;
 * }
 * ```
 */
export const useAuthStore = create<AuthState>()(
  persist(
    (set) => ({
      // ========== 초기 상태 ==========
      user: null,
      isAuthenticated: false,

      // ========== 사용자 설정 ==========
      setUser: (user) =>
        set({
          user,
          isAuthenticated: !!user,
        }),

      // ========== 사용자 정보 업데이트 ==========
      updateUser: (updates) =>
        set((state) => ({
          user: state.user ? { ...state.user, ...updates } : null,
        })),

      // ========== 로그아웃 ==========
      logout: () =>
        set({
          user: null,
          isAuthenticated: false,
        }),
    }),
    {
      name: "auth-storage", // localStorage 키 이름
    },
  ),
);
