import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { QueryClientProvider } from '@tanstack/react-query';
import { PublicClientApplication, EventType, EventMessage, AuthenticationResult } from '@azure/msal-browser';
import { MsalProvider } from '@azure/msal-react';
import { RouterProvider } from 'react-router-dom';

import { msalConfig } from '@/auth/msal-config';
import { MaintenanceGate } from '@/auth/MaintenanceGate';
import { queryClient } from '@/query/query-client';
import { router } from '@/routes';
import { ErrorBoundary } from '@/components/ui/ErrorBoundary';
import { ToastProvider } from '@/components/ToastProvider';
import './index.css';

const msalInstance = new PublicClientApplication(msalConfig);

// Account-handling: capture LOGIN_SUCCESS and set as active so token requests work.
msalInstance.addEventCallback((event: EventMessage) => {
  if (
    (event.eventType === EventType.LOGIN_SUCCESS ||
      event.eventType === EventType.ACQUIRE_TOKEN_SUCCESS) &&
    event.payload
  ) {
    const payload = event.payload as AuthenticationResult;
    if (payload.account) msalInstance.setActiveAccount(payload.account);
  }
});

// Wait for MSAL to finish handling redirect promise before rendering.
msalInstance
  .initialize()
  .then(() =>
    msalInstance.handleRedirectPromise().catch(err => {
      // handleRedirectPromise rejects when there is no in-progress redirect
      // or when stale cache state is left over (no_token_request_cache_error).
      // We must swallow so the SPA can still render the sign-in UI.
      // eslint-disable-next-line no-console
      console.warn('[MSAL] handleRedirectPromise rejected (non-fatal)', err);
      return null;
    }),
  )
  .then(() => {
    const existing = msalInstance.getAllAccounts();
    if (!msalInstance.getActiveAccount() && existing[0]) {
      msalInstance.setActiveAccount(existing[0]);
    }
    const rootEl = document.getElementById('root');
    if (!rootEl) throw new Error('#root element missing');
    createRoot(rootEl).render(
      <StrictMode>
        <MaintenanceGate>
          <ErrorBoundary>
            <MsalProvider instance={msalInstance}>
              <QueryClientProvider client={queryClient}>
                <ToastProvider>
                  <RouterProvider router={router} />
                </ToastProvider>
              </QueryClientProvider>
            </MsalProvider>
          </ErrorBoundary>
        </MaintenanceGate>
      </StrictMode>,
    );
  })
  .catch(err => {
    // eslint-disable-next-line no-console
    console.error('[MSAL] fatal init error', err);
    const rootEl = document.getElementById('root');
    if (rootEl) {
      rootEl.innerHTML =
        '<div style="padding:24px;font-family:sans-serif"><h2>Sign-in error</h2>' +
        '<p>' +
        String(err) +
        '</p><p><a href="/">Reload</a></p></div>';
    }
  });
