import { App } from '@capacitor/app'
import { StatusBar, Style } from '@capacitor/status-bar'
import { SplashScreen } from '@capacitor/splash-screen'
import { Haptics, ImpactStyle } from '@capacitor/haptics'
import { Capacitor } from '@capacitor/core'

export default defineNuxtPlugin(async (nuxtApp) => {

  const siteData = ref()
  const categoriesStore = useCategoriesStore()
  const placeStore = useMyPlacesStore()
  const authStore = useAuthStore()
  const configStore = useMyConfigStore()
  const { loadToken, getToken } = useAuthToken()

  const { apiFetch } = useApi()
  const token = await loadToken()
  console.log(token)
  const { data } = await apiFetch('/init',
    {
      headers: {
        'auth-key': token || ''
      }
    }
  )

  if (data.value?.user) {
    authStore.user = data.value.user
  }

  if (data.value?.config) {
    configStore.config = data.value.config
  }

  if (data.value?.states) {
    configStore.states = data.value.states
  }

  if (data.value?.categories) {
    categoriesStore.categories = data.value.categories
    placeStore.places = data.value.places
  }

  // Csak natív platformon fut
  if (!Capacitor.isNativePlatform()) {
    return
  }

  const router = useRouter()
  // Android hardware back button kezelése
  App.addListener('backButton', async ({ canGoBack }) => {
    // Ha van history, navigáljunk vissza
    if (router.currentRoute.value.path !== '/' && window.history.length > 1) {
      router.back()
    } else {
      // Ha a főoldalon vagyunk, minimalizáljuk az appot
      App.minimizeApp()
    }
  })

  // Status bar beállítása dark/light mode alapján
  const setupStatusBar = async (isDark: boolean) => {
    try {
      if (Capacitor.getPlatform() === 'android') {
          await StatusBar.setBackgroundColor({ color: '#262626' }) // surface-950
          await StatusBar.setStyle({ style: Style.Dark }) // világos ikonok
      }
    } catch (e) {
      console.warn('StatusBar setup error:', e)
    }
  }

  // Splash screen elrejtése amikor az app betöltődött
  const hideSplash = async () => {
    try {
      await SplashScreen.hide({
        fadeOutDuration: 300
      })
    } catch (e) {
      console.warn('SplashScreen hide error:', e)
    }
  }

  // Dark mode figyelése
  const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)')

  // Dark mode változás figyelése
  darkModeQuery.addEventListener('change', (e) => {
    setupStatusBar(e.matches)
  })

  // App mounted hook
  nuxtApp.hooks.hook('app:mounted', async () => {
    // Kezdeti beállítás a jelenlegi dark mode állapot alapján
    await setupStatusBar(darkModeQuery.matches)
    // Kis késleltetés hogy a UI renderelődjön
    setTimeout(() => {
      hideSplash()
    }, 500)
  })

  // Haptics helper függvények exportálása
  return {
    provide: {
      haptics: {
        // Könnyű rezgés (pl. gomb kattintás)
        light: () => Haptics.impact({ style: ImpactStyle.Light }),
        // Közepes rezgés (pl. toggle váltás)
        medium: () => Haptics.impact({ style: ImpactStyle.Medium }),
        // Erős rezgés (pl. sikeres művelet)
        heavy: () => Haptics.impact({ style: ImpactStyle.Heavy }),
        // Szelekció rezgés
        selection: () => Haptics.selectionStart(),
        // Értesítés rezgések
        success: () => Haptics.notification({ type: 'SUCCESS' as any }),
        warning: () => Haptics.notification({ type: 'WARNING' as any }),
        error: () => Haptics.notification({ type: 'ERROR' as any }),
      }
    }
  }
})
