import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { Capacitor } from '@capacitor/core'
import './index.css'
import App from './App.tsx'

// Service Worker（PWAのキャッシュ機構）はWeb版のみ。
// ネイティブ（Android）はファイルが端末内にあるのでSW不要どころか、
// APK更新後も古いキャッシュ画面を出し続けてしまうため、登録せず掃除する。
if (Capacitor.isNativePlatform()) {
  if ('serviceWorker' in navigator) {
    void navigator.serviceWorker.getRegistrations().then((regs) => {
      for (const r of regs) void r.unregister()
    })
  }
  if ('caches' in window) {
    void caches.keys().then((keys) => {
      for (const k of keys) void caches.delete(k)
    })
  }
} else {
  if (!import.meta.env.DEV) {
    void import('virtual:pwa-register').then(({ registerSW }) => registerSW())
  }
  // Web版は端末の空き容量が減るとブラウザにデータを消されることがある。
  // 思い出と写真は端末内にしか無いので、消さないよう申請しておく。
  void import('./logic/storage').then(({ requestPersistentStorage }) =>
    requestPersistentStorage(),
  )
}

// 開発時のみ: 非表示タブでは Chrome が requestAnimationFrame を完全停止し、
// MapLibre の初期化が一切進まなくなる。ヘッドレス検証環境（プレビューペイン等）でも
// 動作確認できるよう、隠れタブでは setTimeout ベースにフォールバックする。
if (import.meta.env.DEV && document.visibilityState === 'hidden') {
  window.requestAnimationFrame = (cb: FrameRequestCallback) =>
    window.setTimeout(() => cb(performance.now()), 16) as unknown as number
  window.cancelAnimationFrame = (id: number) => window.clearTimeout(id)
}

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <App />
  </StrictMode>,
)
