/**
 * GET /api/mobile/app-version — current LogShip Mobile release manifest for the in-app updater.
 *
 * With a session: served from the server-side channel (data/mobile-releases/, see
 * server/utils/mobileReleases.ts) with an absolute, expiring download URL — Android's
 * DownloadManager sends no auth header, so the URL is the credential.
 * Without a session (old app builds during the transition): the legacy public manifest on
 * www.logyou.de/logship is proxied unchanged (relative apkUrl → resolved by the app against that
 * host). Disable with MOBILE_APP_LEGACY_FALLBACK=false once every device runs a build that
 * authenticates its update check.
 */
import { readManifest, manifestWithSignedUrl, enrichManifest, legacyFallbackEnabled, isServiceTokenRequest } from '../../utils/mobileReleases'

const LEGACY_URL = 'https://www.logyou.de/logship/version.json'

export default defineEventHandler(async (event) => {
  setHeader(event, 'Cache-Control', 'no-store')
  const token = await getTokenHelper(event)
  const authed = !!token || isServiceTokenRequest(event)

  if (authed) {
    const manifest = readManifest()
    if (manifest) {
      try {
        return manifestWithSignedUrl(enrichManifest(manifest))
      } catch (err: any) {
        console.error('[app-version] cannot sign download url:', err?.message || err)
        setResponseStatus(event, 500)
        return { status: 500, message: err?.message || 'Download URL not available' }
      }
    }
    if (!legacyFallbackEnabled()) {
      setResponseStatus(event, 404)
      return { status: 404, message: 'No release published' }
    }
    // no local release yet → legacy channel below
  } else if (!legacyFallbackEnabled()) {
    setResponseStatus(event, 401)
    return { status: 401, message: 'Not authenticated' }
  }

  try {
    const response = await fetch(LEGACY_URL, { cache: 'no-store' } as any)
    if (!response.ok) throw new Error(`Failed to fetch version: ${response.status}`)
    return await response.json()
  } catch (error: any) {
    console.error('Error fetching app version:', error)
    throw createError({ statusCode: 500, message: error.message || 'Failed to fetch version info' })
  }
})
