/**
 * preload.js — POS Electron 预加载脚本
 *
 * 通过 contextBridge 安全暴露 electronAPI 给渲染进程，
 * Flutter Web 通过 dart:js_interop 访问 window.electronAPI
 */

const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('electronAPI', {
  // ── 电子秤 API ──────────────────────────────────
  scale: {
    /** 列出可用串口 → Promise<{success, ports}> */
    listPorts: () => ipcRenderer.invoke('scale:listPorts'),

    /** 连接电子秤 → Promise<{success}> */
    connect: (options) => ipcRenderer.invoke('scale:connect', options),

    /** 断开电子秤 → Promise<{success}> */
    disconnect: () => ipcRenderer.invoke('scale:disconnect'),

    /** 获取当前状态 → Promise<{connected, weight}> */
    getStatus: () => ipcRenderer.invoke('scale:getStatus'),

    /** 去皮 → Promise */
    tare: () => ipcRenderer.invoke('scale:tare'),

    /** 置零 → Promise */
    zero: () => ipcRenderer.invoke('scale:zero'),

    /**
     * 注册重量变化回调
     * @param {Function} callback - (data: {weight, stable, stableWeight, unit}) => void
     */
    onWeight: (callback) => {
      ipcRenderer.on('scale:weight', (_event, data) => {
        try { callback(data); } catch (e) { console.error('scale:weight callback error:', e); }
      });
    },

    /**
     * 注册状态变化回调
     * @param {Function} callback - (data: {status, message}) => void
     */
    onStatus: (callback) => {
      ipcRenderer.on('scale:status', (_event, data) => {
        try { callback(data); } catch (e) { console.error('scale:status callback error:', e); }
      });
    },
  },

  // ── 打印机 API ────────────────────────────────
  printer: {
    /** 列出所有可用打印机 → Promise<{success, printers}> */
    list: () => ipcRenderer.invoke('printer:list'),

    /** 测试打印 → Promise<{success}> */
    test: (printerName) => ipcRenderer.invoke('printer:test', { printerName }),
    openDrawer: () => ipcRenderer.invoke('printer:openDrawer'),
  },

  // ── 应用信息 ────────────────────────────────────
  app: {
    getVersion: () => ipcRenderer.invoke('app:getVersion'),
  },

  // ── 平台信息 ────────────────────────────────────
  platform: process.platform,

  // ── 自动更新 ────────────────────────────────────
  updater: {
    /** 仅检查更新 → Promise<{hasUpdate, manifest}> */
    check: () => ipcRenderer.invoke('updater:check'),

    /** 启动完整更新流程（检查→下载→解压→安装→重启） */
    start: () => ipcRenderer.invoke('updater:start'),

    /** 跳过可选更新 */
    skip: () => ipcRenderer.invoke('updater:skip'),

    /** 监听更新进度 → callback({stage, percent, message, ...}) */
    onProgress: (callback) => {
      const handler = (_event, data) => {
        try { callback(data); } catch (e) { console.error('updater:progress cb error:', e); }
      };
      ipcRenderer.on('update:progress', handler);
      // Return unsubscribe function
      return () => ipcRenderer.removeListener('update:progress', handler);
    },
  },

  // ── 窗口控制 ────────────────────────────────────
  window: {
    minimize: () => ipcRenderer.send('window:minimize'),
    maximize: () => ipcRenderer.send('window:maximize'),
    close: () => ipcRenderer.send('window:close'),
    move: (dx, dy) => ipcRenderer.send('window:move', dx, dy),
  },

  // ── 双屏顾客显示 ──────────────────────────────
  customer: {
    /** 推送购物车快照（JSON 字符串） → main 进程转发给顾客窗口 */
    push: (data) => ipcRenderer.send('customer:push', data),

    /** 打开顾客屏（在副屏/主屏右侧创建第二窗口） */
    open: () => ipcRenderer.invoke('customer:open'),

    /** 关闭顾客屏 */
    close: () => ipcRenderer.invoke('customer:close'),

    /** 查询是否已打开 */
    isOpen: () => ipcRenderer.invoke('customer:isOpen'),

    /**
     * 顾客窗口自身用来接收快照更新
     * @param {Function} callback - (data: string, JSON) => void
     */
    onUpdate: (callback) => {
      const handler = (_event, data) => {
        try { callback(data); } catch (e) { console.error('customer:update cb error:', e); }
      };
      ipcRenderer.on('customer:update', handler);
      return () => ipcRenderer.removeListener('customer:update', handler);
    },

    /** 顾客窗口加载后主动要一次当前快照 */
    request: () => ipcRenderer.send('customer:request'),
  },
});
