/**
 * 系统设置工具
 *
 * 数据库优先，.env 兜底
 * - getSetting(key): 从 DB 读取，没有则回退到 process.env[key]
 * - setSetting(key, value): 写入 DB
 * - getAllSettings(): 获取所有设置（脱敏）
 */

const db = require('../db');

/**
 * 获取设置值（DB 优先，.env 兜底）
 * @param {string} key 设置键名
 * @param {string} fallback 手动指定的兜底值
 * @returns {string|null}
 */
function getSetting(key, fallback) {
  // 1. 先查数据库
  const row = db.prepare('SELECT value FROM settings WHERE key = ?').get(key);
  if (row && row.value !== undefined && row.value !== null && row.value !== '') {
    return row.value;
  }
  // 2. 回退到 .env
  if (process.env[key] !== undefined && process.env[key] !== '') {
    return process.env[key];
  }
  // 3. 手动兜底
  return fallback ?? null;
}

/**
 * 写入设置到数据库
 * @param {string} key
 * @param {string} value
 */
function setSetting(key, value) {
  db.prepare(`
    INSERT INTO settings (key, value, updated_at) VALUES (?, ?, datetime('now'))
    ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = datetime('now')
  `).run(key, value ?? '');
}

/**
 * 获取所有设置（带脱敏）
 * @returns {object}
 */
function getAllSettings() {
  const rows = db.prepare('SELECT key, value FROM settings').all();
  const result = {};

  // 从 DB 读取的
  for (const row of rows) {
    result[row.key] = row.value;
  }

  // 敏感字段列表（需要脱敏）
  const sensitiveKeys = ['TG_BOT_TOKEN', 'SESSION_SECRET', 'ADMIN_PASSWORD'];

  // 返回完整设置对象（前台展示时脱敏由调用方处理）
  return result;
}

/**
 * 获取 Telegram Bot Token（DB 优先）
 */
function getTgBotToken() {
  return getSetting('TG_BOT_TOKEN');
}

/**
 * 获取默认频道 ID（DB 优先）
 */
function getTgDefaultChannelId() {
  return getSetting('TG_DEFAULT_CHANNEL_ID');
}

/**
 * 获取站点名称
 */
function getSiteName() {
  return getSetting('SITE_NAME', 'VPS补货监控');
}

/**
 * 获取 Telegram 频道/群链接
 */
function getSiteTgUrl() {
  return getSetting('SITE_TG_URL', '');
}

/**
 * 脱敏显示 token（只显示前6位和后4位）
 */
function maskToken(token) {
  if (!token || token.length < 12) return '******';
  return token.slice(0, 6) + '****' + token.slice(-4);
}

module.exports = {
  getSetting,
  setSetting,
  getAllSettings,
  getTgBotToken,
  getTgDefaultChannelId,
  getSiteName,
  getSiteTgUrl,
  maskToken,
};
