import { BrowserView } from 'electrobun/bun'
import { startAppUpdate } from './appupdate.js'
import { setSidebarViewMenu } from './menu.js'
import { sendToRenderer } from './notify.js'
import { resizeSpotlightWindow } from './spotlight.js'
import {
  clearAuthSession,
  getAppSettings,
  getAuthSession,
  setAppSettings,
  setAuthSession
} from './store.js'
import {
  getMainWindow,
  getWindowState,
  handleWindowControl,
  openExternalUrl,
  openInternalUrl
} from './window.js'

export function createAppRpc() {
  return BrowserView.defineRPC({
    maxRequestTime: 30000,
    handlers: {
      requests: {
        getOsInfo: async () => ({
          platform: process.platform
        }),
        getWindowState: async () => getWindowState(),
        windowControl: async ({ action }) => {
          handleWindowControl(action)
          return { ok: true }
        },
        openExternalUrl: async ({ url }) => {
          openExternalUrl(url)
          console.log('openExternalUrl', url)
          return { ok: true }
        },
        openInternalUrl: async ({ url }) => ({
          ok: openInternalUrl(url)
        }),
        getAuthSession: async () => getAuthSession(),
        setAuthSession: async ({ session }) => ({
          ok: await setAuthSession(session)
        }),
        clearAuthSession: async () => ({
          ok: await clearAuthSession()
        }),
        getAppSettings: async () => getAppSettings(),
        setAppSettings: async ({ settings }) => ({
          ok: await setAppSettings(settings)
        }),
        startAppUpdate: async ({ update }) => {
          const mainWindow = getMainWindow()
          const sendProgress = (payload) => {
            sendToRenderer('appUpdateProgress', {
              timestamp: new Date().toISOString(),
              ...payload
            })
          }

          // Updates can take several minutes; return immediately and report
          // progress via appUpdateProgress messages instead of blocking RPC.
          void startAppUpdate(mainWindow, update, sendProgress).catch((error) => {
            console.error('App update failed:', error)
          })
          return { ok: true }
        },
        resizeSpotlightWindow: async ({ height }) => ({
          ok: resizeSpotlightWindow(height)
        }),
        setSidebarViewMenu: async ({ sections }) => ({
          ok: setSidebarViewMenu(sections)
        }),
        getAppVersion: async () => process.env.ELECTROBUN_VERSION || 'desktop'
      },
      messages: {}
    }
  })
}
