/**
 * Config Service — 配置读写
 *
 * 管理 app_config 表的读写操作。
 * 所有配置值以 JSON 格式存储。
 *
 * @see docs/MetonaAI-Desktop 架构与交互设计.html — 数据库配置
 */

import type Database from 'better-sqlite3';
import log from 'electron-log';

export interface ConfigRow {
  key: string;
  value: string;
  category: string;
  updated_at: number;
}

export class ConfigService {
  constructor(private getDB: () => Database.Database) {}

  /**
   * 获取配置值
   */
  get<T = unknown>(key: string): T | null {
    const db = this.getDB();
    const row = db.prepare('SELECT value FROM app_config WHERE key = ?').get(key) as ConfigRow | undefined;

    if (!row) return null;

    try {
      return JSON.parse(row.value) as T;
    } catch {
      return row.value as T;
    }
  }

  /**
   * 设置配置值（保留已有 category）
   */
  set(key: string, value: unknown): void {
    const db = this.getDB();
    const jsonValue = typeof value === 'string' ? value : JSON.stringify(value);

    // 查询已有 category，避免 INSERT OR REPLACE 覆盖为默认值
    const existing = db.prepare('SELECT category FROM app_config WHERE key = ?').get(key) as ConfigRow | undefined;
    const category = existing?.category ?? 'general';

    db.prepare(`
      INSERT OR REPLACE INTO app_config (key, value, category, updated_at)
      VALUES (?, ?, ?, ?)
    `).run(key, jsonValue, category, Date.now());

    log.debug(`Config set: ${key}`);
  }

  /**
   * 获取所有配置
   */
  getAll(): Record<string, unknown> {
    const db = this.getDB();
    const rows = db.prepare('SELECT key, value FROM app_config').all() as ConfigRow[];

    const config: Record<string, unknown> = {};
    for (const row of rows) {
      try {
        config[row.key] = JSON.parse(row.value);
      } catch {
        config[row.key] = row.value;
      }
    }

    return config;
  }

  /**
   * 获取指定分类的所有配置
   */
  getByCategory(category: string): Record<string, unknown> {
    const db = this.getDB();
    const rows = db.prepare('SELECT key, value FROM app_config WHERE category = ?').all(category) as ConfigRow[];

    const config: Record<string, unknown> = {};
    for (const row of rows) {
      try {
        config[row.key] = JSON.parse(row.value);
      } catch {
        config[row.key] = row.value;
      }
    }

    return config;
  }

  /**
   * 删除配置
   */
  delete(key: string): boolean {
    const db = this.getDB();
    const result = db.prepare('DELETE FROM app_config WHERE key = ?').run(key);
    return result.changes > 0;
  }
}
