<script lang="ts">
  import {
    app,
    setBoardLabels,
    setLocalePref,
    setReduceMotion,
    setTheme,
  } from '../lib/app.svelte';
  import { t, type Locale, type MessageKey } from '../lib/i18n/index.svelte';
  import type { ThemePref } from '../lib/theme';
  import type { BoardLabelMode } from '../lib/boardlabels';
  import { insideTelegram } from '../lib/telegram';
  import { insideVK } from '../lib/vk';
  import { offlineMode, setOfflineMode, requestOffline } from '../lib/offline.svelte';
  import { isStandalone } from '../lib/pwa';
  import InstallApp from '../components/InstallApp.svelte';

  // The offline toggle is for the installed web PWA with a confirmed email only: the service worker
  // that lets the app launch with no network runs only in a standalone web install (not a mini-app),
  // and a durable account (email) anchors the device-local games. Elsewhere the control is hidden.
  const offlineEligible = $derived(
    isStandalone() && !insideTelegram() && !insideVK() && !!app.profile?.email,
  );

  const themes: ThemePref[] = ['auto', 'light', 'dark'];
  const themeLabel: Record<ThemePref, MessageKey> = {
    auto: 'settings.themeAuto',
    light: 'settings.themeLight',
    dark: 'settings.themeDark',
  };
  const locales: Locale[] = ['en', 'ru'];
  const labelModes: BoardLabelMode[] = ['beginner', 'classic', 'none'];
  const labelModeKey: Record<BoardLabelMode, MessageKey> = {
    beginner: 'settings.labelsBeginner',
    classic: 'settings.labelsClassic',
    none: 'settings.labelsNone',
  };

  // The offline toggle gates entry on dictionary readiness: flipping to offline fetches the enabled
  // variants' dictionaries (cache-first) and waits at most a few seconds; if they cannot be made
  // available it stays online and shows the "needs internet" note, while the fetch keeps warming the
  // cache in the background so a later flip is instant. Leaving offline (-> online) is never gated.
  let checking = $state(false);
  let needsData = $state(false);

  async function goOffline(): Promise<void> {
    if (offlineMode.active || checking) return;
    needsData = false;
    checking = true;
    try {
      const ready = await requestOffline(app.profile);
      if (!ready) needsData = true;
    } finally {
      checking = false;
    }
  }
</script>

<div class="page">
  {#if !insideTelegram()}
    <section>
      <h3>{t('settings.theme')}</h3>
      <div class="seg">
        {#each themes as th (th)}
          <button class="opt" class:active={app.theme === th} onclick={() => setTheme(th)}>
            {t(themeLabel[th])}
          </button>
        {/each}
      </div>
    </section>
  {/if}

  <section>
    <h3>{t('settings.language')}</h3>
    <div class="seg">
      {#each locales as lc (lc)}
        <button class="opt" class:active={app.locale === lc} onclick={() => setLocalePref(lc)}>
          {t(lc === 'en' ? 'lang.en' : 'lang.ru')}
        </button>
      {/each}
    </div>
  </section>

  <section>
    <h3>{t('settings.boardStyle')}</h3>
    <div class="sub">{t('settings.boardLabels')}</div>
    <div class="seg">
      {#each labelModes as lm (lm)}
        <button class="opt" class:active={app.boardLabels === lm} onclick={() => setBoardLabels(lm)}>
          {t(labelModeKey[lm])}
        </button>
      {/each}
    </div>
  </section>

  <section>
    <label class="row">
      <span>{t('settings.reduceMotion')}</span>
      <input
        type="checkbox"
        checked={app.reduceMotion}
        onchange={(e) => setReduceMotion(e.currentTarget.checked)}
      />
    </label>
  </section>

  {#if offlineEligible}
    <section>
      <h3>{t('settings.offlineMode')}</h3>
      <div class="seg">
        <button
          class="opt"
          class:active={!offlineMode.active}
          disabled={checking}
          onclick={() => {
            needsData = false;
            setOfflineMode(false);
          }}
        >
          {t('settings.online')}
        </button>
        <button class="opt" class:active={offlineMode.active} disabled={checking} onclick={goOffline}>
          {t('settings.offline')}
        </button>
      </div>
      {#if checking}
        <p class="onote">{t('settings.offlineChecking')}</p>
      {:else if needsData}
        <p class="onote onote--warn" role="alert">{t('settings.offlineNeedsData')}</p>
      {/if}
    </section>
  {/if}

  <!-- Web-only install call-to-action at the bottom of Settings (renders nothing unless the app
       is installable here — see components/InstallApp.svelte / lib/pwa). -->
  <InstallApp />
</div>

<style>
  .page {
    padding: var(--pad);
    display: flex;
    flex-direction: column;
    gap: 20px;
  }
  h3 {
    margin: 0 0 8px;
    font-size: 0.95rem;
    color: var(--text-muted);
  }
  .sub {
    font-size: 0.85rem;
    color: var(--text-muted);
    margin-bottom: 6px;
  }
  .seg {
    display: flex;
    gap: 8px;
  }
  .opt {
    flex: 1;
    padding: 10px;
    border: 1px solid var(--border);
    background: var(--surface);
    color: var(--text);
    border-radius: var(--radius-sm);
    user-select: none;
  }
  .opt.active {
    background: var(--accent);
    color: var(--accent-text);
    border-color: var(--accent);
  }
  .opt:disabled {
    opacity: 0.55;
    cursor: default;
  }
  .onote {
    font-size: 0.85rem;
    color: var(--text-muted);
    margin: 8px 0 0;
  }
  .onote--warn {
    color: var(--warn);
  }
  .row {
    display: flex;
    align-items: center;
    justify-content: space-between;
  }
</style>
