"use client";

/**
 * useBrand — white-label resolver (#657).
 *
 * Активный бренд резолвится из ДВУХ источников (account-бренд приоритетен, #765):
 *   1. `me.brand` из /me — привязка бренда к аккаунту (#657 brand-by-account) — WINS;
 *   2. query-параметр `?brand=<slug>` — демо/превью, только если у аккаунта нет бренда.
 * Если ни один не задан — нет бренда (generic UI), хук возвращает {data: null}.
 *
 * Mirror паттерна useMe.ts: TanStack Query, staleTime/gcTime Infinity
 * (бренд статичен на сессию). Backend: GET /api/v1/brand/{slug}
 * (см. tradein-mvp/backend/app/api/v1/brand.py) — возвращает поля ниже,
 * fallback на generic если slug не найден.
 */

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

import { apiFetch } from "@/lib/api";
import { useMe } from "@/lib/useMe";

export interface Brand {
  slug: string;
  name: string;
  logo_url: string | null;
  primary_color: string;
  accent_color: string;
  footer_text: string | null;
  pdf_disclaimer: string | null;
}

/** Читает `?brand=` slug из URL. SSR-safe (null на сервере). */
export function getBrandSlugFromUrl(): string | null {
  if (typeof window === "undefined") return null;
  const slug = new URLSearchParams(window.location.search).get("brand");
  return slug && slug.trim() ? slug.trim().toLowerCase() : null;
}

/**
 * Активный slug бренда: account-бренд (me.brand) ПРИОРИТЕТЕН над `?brand=`.
 * `?brand=` разрешён только когда у аккаунта нет своего бренда (демо/превью) —
 * иначе любой залогиненный мог бы отрендерить чужой бренд (cross-brand leak, #765).
 * Hook (читает useMe) — вызывать только в React-компонентах.
 */
export function useActiveBrandSlug(): string | null {
  const { data: me } = useMe();
  const accountSlug = me?.brand ? me.brand.trim().toLowerCase() : null;
  // Account-бренд приоритетен: ?brand= НЕ может его перекрыть (cross-brand leak).
  if (accountSlug) return accountSlug;
  return getBrandSlugFromUrl();
}

async function fetchBrand(slug: string): Promise<Brand> {
  return apiFetch<Brand>(`/api/v1/brand/${encodeURIComponent(slug)}`);
}

/**
 * Возвращает активный бренд или {data: null}, если бренд не задан ни в URL,
 * ни в аккаунте. Запрос включён только при наличии slug — иначе хук no-op.
 */
export function useBrand() {
  const slug = useActiveBrandSlug();
  return useQuery<Brand | null, Error>({
    queryKey: ["brand", slug],
    queryFn: () => (slug ? fetchBrand(slug) : Promise.resolve(null)),
    enabled: slug !== null,
    staleTime: Infinity,
    gcTime: Infinity,
    refetchOnWindowFocus: false,
    refetchOnReconnect: false,
    refetchOnMount: false,
  });
}
