/*
 * 역할별 랜딩·트랙 판정 (단일 출처) — _workspace/plan_role_routing.md §1 로직 그대로.
 * 웹·모바일 공통 규칙. 순수 함수 + authStore 파생 셀렉터(activeTrack)에서 재사용.
 *
 * 우선순위: admin > ops > business > agency > visitor.
 * 회귀 0 원칙: ops·business 랜딩은 기존 `/home` 유지, admin·agency·visitor 만 신규 분기.
 */
import type { AuthUser, EventRole, WorkspaceDto } from '../api/types';

export type Track = 'visitor' | 'business' | 'agency' | 'ops' | 'admin';

/** 워크스페이스 역할 → 트랙(스코프 판정용). */
export function trackOf(role: EventRole | null | undefined): Track {
  switch (role) {
    case 'ORGANIZER':
    case 'EXHIBITOR':
      return 'business';
    case 'CONTRACTOR':
      return 'agency';
    case 'HALL_MANAGER':
      return 'ops';
    default:
      return 'visitor';
  }
}

/**
 * 로그인 랜딩 트랙 결정(primaryTrack 우선순위). plan §1 resolveLandingTrack 이식.
 * 판정 불가(예외) 시 안전 폴백은 호출부에서 처리(랜딩 경로 /home).
 */
export function resolveLandingTrack(
  user: AuthUser | null | undefined,
  workspaces: WorkspaceDto[],
): Track {
  const role = (user?.roleCode ?? '').toUpperCase();
  const ws = workspaces ?? [];
  if (role === 'ADMIN') return 'admin';
  if (role === 'MANAGER' || ws.some((w) => w.myRole === 'HALL_MANAGER')) return 'ops';
  if (ws.some((w) => w.myRole === 'ORGANIZER' || w.myRole === 'EXHIBITOR')) return 'business';
  if (ws.some((w) => w.myRole === 'CONTRACTOR')) return 'agency';
  return 'visitor';
}

/** 트랙 → 로그인 직후 랜딩 라우트. ops·business=/home(회귀 0), admin·agency·visitor 만 신규. */
export function landingPathForTrack(track: Track): string {
  switch (track) {
    case 'admin':
      return '/admin';
    case 'agency':
      return '/contractor/dashboard';
    case 'visitor':
      return '/visitor';
    case 'ops':
    case 'business':
    default:
      return '/home';
  }
}

/** 사용자·워크스페이스로부터 랜딩 라우트 계산(예외 시 /home 폴백). */
export function landingPathFor(
  user: AuthUser | null | undefined,
  workspaces: WorkspaceDto[],
): string {
  try {
    return landingPathForTrack(resolveLandingTrack(user, workspaces));
  } catch {
    return '/home';
  }
}
