import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import '@milkdown/kit/prose/view/style/prosemirror.css';
import '@milkdown/kit/prose/tables/style/tables.css';
import '@milkdown/kit/prose/gapcursor/style/gapcursor.css';
import './themes/fonts.css';
import './themes/base.css';
import './themes/light.css';
import './themes/dark.css';
import './themes/editor.css';
import './themes/source.css';
import { openFileRef, restoreSession, startDraftAutosave } from './app/actions';
import { AppShell } from './app/AppShell';
import { useSettings } from './store/settings';

function settingsHydrated(): Promise<void> {
  if (useSettings.persist.hasHydrated()) return Promise.resolve();
  return new Promise((resolve) => {
    const unsubscribe = useSettings.persist.onFinishHydration(() => {
      unsubscribe();
      resolve();
    });
  });
}

/** Files opened from Finder/Explorer when installed as a PWA with file handling. */
function consumeLaunchedFiles() {
  window.launchQueue?.setConsumer(async ({ files }) => {
    const handle = files[0];
    if (handle?.kind === 'file') await openFileRef({ name: handle.name, handle });
  });
}

async function boot() {
  await Promise.all([settingsHydrated(), restoreSession().catch(console.error)]);
  startDraftAutosave();
  createRoot(document.getElementById('root')!).render(
    <StrictMode>
      <AppShell />
    </StrictMode>,
  );
  consumeLaunchedFiles();
}

boot();
