/*
 * 인증 상태 (zustand) — 로그인 토큰·사용자·워크스페이스·현재 선택 행사.
 * 토큰은 client.ts의 setAccessToken과 동기화(단일 출처는 client, 여기선 표시 상태).
 */
import { create } from 'zustand';
import { getAccessToken, setAccessToken } from '../api/client';
import type { AuthUser, EventRole, LoginResponse, WorkspaceDto } from '../api/types';
import { resolveLandingTrack, trackOf, type Track } from '../lib/roleTrack';

interface AuthState {
  user: AuthUser | null;
  workspaces: WorkspaceDto[];
  currentEventId: string | null;
  isAuthenticated: boolean;
  applyLogin: (res: LoginResponse) => void;
  /** 새로고침 세션 재수화 — 토큰은 살아있지만 스토어가 빈 상태(user=null)일 때 /me·/workspaces 응답으로 복원. */
  applySession: (user: AuthUser, workspaces: WorkspaceDto[]) => void;
  selectEvent: (eventId: string) => void;
  logout: () => void;
  currentWorkspace: () => WorkspaceDto | null;
  roleForCurrent: () => EventRole | null;
  // 전역 역할(app_user.role_code — 'ADMIN' | 'MANAGER' | …). 없으면 null. 관리자 판정(AdminGuard) 등에 사용.
  globalRole: () => string | null;
  // 반응형 활성 트랙(메뉴/탭 스코프). 행사 선택 시 해당 역할 트랙, 아니면 랜딩 트랙(plan §1).
  activeTrack: () => Track;
}

export const useAuthStore = create<AuthState>((set, get) => ({
  user: null,
  workspaces: [],
  currentEventId: null,
  isAuthenticated: Boolean(getAccessToken()),

  applyLogin: (res) => {
    setAccessToken(res.accessToken);
    set({
      user: res.user,
      workspaces: res.workspaces,
      isAuthenticated: true,
    });
  },

  applySession: (user, workspaces) => set({ user, workspaces, isAuthenticated: true }),

  selectEvent: (eventId) => set({ currentEventId: eventId }),

  logout: () => {
    setAccessToken(null);
    set({ user: null, workspaces: [], currentEventId: null, isAuthenticated: false });
  },

  currentWorkspace: () => {
    const { workspaces, currentEventId } = get();
    return workspaces.find((w) => w.eventId === currentEventId) ?? null;
  },

  roleForCurrent: () => get().currentWorkspace()?.myRole ?? null,

  globalRole: () => get().user?.roleCode ?? null,

  activeTrack: () => {
    const { user, workspaces, currentEventId } = get();
    // 행사 선택 시 그 역할 트랙 우선(단 현재 워크스페이스 해소 가능한 경우).
    if (currentEventId) {
      const ws = workspaces.find((w) => w.eventId === currentEventId);
      if (ws) return trackOf(ws.myRole);
    }
    return resolveLandingTrack(user, workspaces);
  },
}));
