import { useEffect, type ReactNode } from 'react'
import { useAuth } from 'react-oidc-context'

/**
 * Гейтит всё содержимое приложения по аутентификации. Если юзер не залогинен —
 * сразу редиректим на Keycloak (без промежуточной страницы "Вы не авторизованы"
 * и без красного 401 от axios). Пока auth state ещё определяется — показываем
 * нейтральный spinner.
 *
 * Сценарии:
 * - First visit, нет токена → signinRedirect → Keycloak login → redirect_uri →
 *   onSigninCallback чистит URL → дети рендерятся.
 * - Истёк access_token, silent renew не успел → 401 от backend ловится в
 *   {@link TokenSync} interceptor, который дёргает signinSilent/signinRedirect.
 * - Возврат с ошибкой OIDC (?error=access_denied) → не редиректим в цикле,
 *   показываем сообщение.
 */
export function RequireAuth({ children }: { children: ReactNode }) {
  const auth = useAuth()

  const oidcError =
    typeof window !== 'undefined' &&
    new URLSearchParams(window.location.search).get('error')

  useEffect(() => {
    if (oidcError) return
    if (auth.isLoading || auth.activeNavigator) return
    if (auth.isAuthenticated) return
    auth.signinRedirect().catch((err) => {
      // Не уйти на signinRedirect = Keycloak недоступен. Логируем, дальше
      // покажем сообщение об ошибке (auth.error будет выставлен).
      console.error('[auth] signinRedirect failed', err)
    })
  }, [auth.isAuthenticated, auth.isLoading, auth.activeNavigator, oidcError])

  if (oidcError) {
    return (
      <div className="min-h-screen flex items-center justify-center p-8">
        <div className="max-w-md text-center space-y-2">
          <h1 className="text-lg font-primary">Ошибка входа</h1>
          <p className="text-sm text-carbon/70">
            Keycloak вернул ошибку:{' '}
            <code className="font-mono">{oidcError}</code>
          </p>
          <button
            type="button"
            className="mt-4 inline-flex items-center justify-center rounded-sm border border-ultramarain text-ultramarain px-4 py-2 text-sm hover:bg-orbit"
            onClick={() => {
              window.location.href = '/'
            }}
          >
            Попробовать снова
          </button>
        </div>
      </div>
    )
  }

  if (auth.error && !auth.isAuthenticated) {
    return (
      <div className="min-h-screen flex items-center justify-center p-8">
        <div className="max-w-md text-center space-y-2">
          <h1 className="text-lg font-primary">Не удалось подключиться к авторизации</h1>
          <p className="text-sm text-carbon/70">{auth.error.message}</p>
        </div>
      </div>
    )
  }

  if (!auth.isAuthenticated) {
    return (
      <div className="min-h-screen flex items-center justify-center">
        <div className="text-sm text-carbon/60 font-secondary">Перенаправление на вход…</div>
      </div>
    )
  }

  return <>{children}</>
}
