<script lang="ts">
  import { onMount } from 'svelte'
  import { Events, Call } from '@wailsio/runtime'
  import FloatingIndicator from './components/indicator/FloatingIndicator.svelte'
  import SettingsWindow from './components/settings/SettingsWindow.svelte'
  import OnboardingView from './components/onboarding/OnboardingView.svelte'
  import UpdateDialog from './components/update/UpdateDialog.svelte'
  import { engineStatus } from './lib/stores/app'
  import { indicatorVisible, indicatorStatus, indicatorVolume, hotkeyName } from './lib/stores/indicator'
  import { updateAvailable, type UpdateInfo } from './lib/stores/update'
  import { deviceName, engineHardwareInfo } from './lib/stores/app'

  let isIndicatorRoute = $state(window.location.hash === '#/indicator')
  let showUpdateDialog = $state(false)

  onMount(() => {
    Events.On('indicator:show', (ev: any) => {
      indicatorVisible.set(true)
      if (ev?.data?.status) {
        indicatorStatus.set(ev.data.status)
      }
    })

    Events.On('indicator:hide', () => {
      indicatorVisible.set(false)
    })

    Events.On('indicator:status', (ev: any) => {
      const data = ev?.data
      if (data?.status) {
        indicatorStatus.set(data.status)
      }
      if (data?.hotkeyName) {
        hotkeyName.set(data.hotkeyName)
      }
    })

    Events.On('indicator:volume', (ev: any) => {
      indicatorVolume.set(ev?.data ?? 0)
    })

    Events.On('engine:status', (ev: any) => {
      const data = ev?.data
      if (data?.status) {
        engineStatus.set(data.status as any)
      }
      if (data?.hardwareInfo) {
        engineHardwareInfo.set(data.hardwareInfo)
      }
    })

    Events.On('device:changed', (ev: any) => {
      if (ev?.data?.name) {
        deviceName.set(ev.data.name)
      }
    })

    Events.On('update:available', (ev: any) => {
      const data = ev?.data as UpdateInfo
      updateAvailable.set(data)
      showUpdateDialog = true
    })

    window.addEventListener('hashchange', () => {
      isIndicatorRoute = window.location.hash === '#/indicator'
    })

    // Query engine status on mount (events emitted before frontend load are lost)
    Call.ByName('voicesnap/services.EngineService.GetStatus').then((data: any) => {
      if (data?.status) {
        engineStatus.set(data.status as any)
      }
      if (data?.hardwareInfo) {
        engineHardwareInfo.set(data.hardwareInfo)
      }
    })

    Call.ByName('voicesnap/services.EngineService.ModelExists').then((exists: any) => {
      if (!exists) {
        engineStatus.set('need_model')
      }
    })

    // Load actual hotkey name from backend (store default is generic "Ctrl")
    Call.ByName('voicesnap/services.HotkeyService.GetHotkeyName').then((name: any) => {
      if (name) {
        hotkeyName.set(name)
      }
    })
  })
</script>

{#if isIndicatorRoute}
  <FloatingIndicator />
{:else}
  {#if $engineStatus === 'need_model'}
    <OnboardingView />
  {:else}
    <SettingsWindow />
  {/if}

  {#if showUpdateDialog && $updateAvailable}
    <UpdateDialog
      info={$updateAvailable}
      onclose={() => { showUpdateDialog = false }}
    />
  {/if}
{/if}
