import { existsSync, readFileSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';

import { app } from 'electron';
import log from 'electron-log/main';

/**
 * 桌面端本地设置持久化（userData/desktop-settings.json）
 * 为什么不用 electron-store：目前只需存打印机等少量键值，直接读写 JSON 文件即可，
 * 避免引入额外依赖（electron-store 新版为纯 ESM，与 CJS 主进程产物不兼容，还会拖入 ajv 等重依赖）。
 */

/** 桌面端设置项定义 */
export interface DesktopSettings {
  /** 静默打印使用的打印机名称，空串表示未选择 */
  printerName: string;
  /** 是否启用静默打印（true 时打印处方不弹系统打印对话框） */
  silentPrint: boolean;
}

const DEFAULT_SETTINGS: DesktopSettings = {
  printerName: '',
  silentPrint: false,
};

/** 内存缓存，避免每次 IPC 调用都读磁盘 */
let cache: DesktopSettings | null = null;

/** 设置文件落在 userData 目录，随应用卸载数据目录一起清理 */
function getSettingsFilePath(): string {
  return join(app.getPath('userData'), 'desktop-settings.json');
}

/**
 * 读取设置：文件不存在或解析失败时回退默认值，保证任何情况下不影响应用启动
 */
export function getSettings(): DesktopSettings {
  if (cache) return cache;
  try {
    const filePath = getSettingsFilePath();
    if (existsSync(filePath)) {
      // JSON.parse 返回 any，显式收窄成 Partial 再与默认值合并，保证字段完整
      const parsed = JSON.parse(readFileSync(filePath, 'utf8')) as Partial<DesktopSettings>;
      const merged: DesktopSettings = { ...DEFAULT_SETTINGS, ...parsed };
      cache = merged;
      return merged;
    }
  } catch (error) {
    log.warn('读取桌面端设置失败，回退默认值', error);
  }
  cache = { ...DEFAULT_SETTINGS };
  return cache;
}

/**
 * 增量更新设置并写盘：写盘失败只告警（内存态仍生效），下次成功写入时自动恢复
 */
export function updateSettings(patch: Partial<DesktopSettings>): DesktopSettings {
  const next = { ...getSettings(), ...patch };
  cache = next;
  try {
    writeFileSync(getSettingsFilePath(), JSON.stringify(next, null, 2), 'utf8');
  } catch (error) {
    log.warn('写入桌面端设置失败', error);
  }
  return next;
}
