"use client";

/**
 * MIRROR of main frontend `frontend/src/lib/useMe.ts` — keep in sync manually.
 *
 * Tradein-mvp — отдельный Next.js bundle с basePath=/trade-in. `apiFetch`
 * автоматически префиксит `API_BASE_URL` (= `/trade-in` в проде, "" в dev),
 * поэтому путь `/api/v1/me` в проде превращается в `/trade-in/api/v1/me` →
 * Caddy `uri strip_prefix /trade-in` → tradein-backend `/api/v1/me`.
 * Tradein-backend имеет mirror endpoint `/me` (см. `tradein-mvp/backend/app/api/v1/me.py`).
 */

import { useQuery } from "@tanstack/react-query";

import { apiFetchWithStatus, HTTPError } from "@/lib/api";

// #2555: session-auth (POST /api/v1/auth/login) вводит новые роли
// admin|manager|employee. Legacy Caddy trusted-header роли (pilot|analyst|
// expired) остаются — backend `/api/v1/me` может отдать любую из обеих
// групп в зависимости от того, каким механизмом пришёл юзер (dual-mode
// resolver, см. `tradein-mvp/backend/app/core/rbac.py`).
export type Role =
  | "admin"
  | "manager"
  | "employee"
  | "pilot"
  | "analyst"
  | "expired";

export interface UserScope {
  username: string;
  role: Role;
  allowed_paths: string[];
  deny_paths: string[];
  // #657 brand-by-account: slug бренда, привязанный к аккаунту (praktika→"praktika").
  // null/undefined = generic UI. useBrand применяет его автоматически на login.
  brand?: string | null;
  // #2046 real profile fields для TopNav. undefined/null = данных нет, фронт
  // фолбэкается на username / brand ?? role / "" (как раньше).
  display_name?: string | null;
  org?: string | null;
  email?: string | null;
}

export const ME_QUERY_KEY = ["auth", "me"] as const;

async function fetchMe(): Promise<UserScope> {
  const { body } = await apiFetchWithStatus<UserScope>("/api/v1/me");
  return body;
}

export function useMe() {
  return useQuery<UserScope, Error>({
    queryKey: ME_QUERY_KEY,
    queryFn: fetchMe,
    staleTime: Infinity,
    gcTime: Infinity,
    refetchOnWindowFocus: false,
    refetchOnReconnect: false,
    refetchOnMount: false,
    retry: (failureCount, error) => {
      if (error instanceof HTTPError && (error.status === 401 || error.status === 403)) {
        return false;
      }
      return failureCount < 2;
    },
  });
}
