using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using CounterDrone.Core.Models;
using CounterDrone.Core.Repository;
using CounterDrone.Core.Services;
using SQLite;
namespace CounterDrone.Core
{
/// 数据库管理器 — 建表 / 连接管理
public class DatabaseManager
{
private readonly IPathProvider _paths;
public DatabaseManager(IPathProvider paths)
{
_paths = paths;
}
/// 初始化主数据库(建表 + 种子数据)
public SQLiteConnection OpenMainDb()
{
var dbPath = _paths.GetMainDbPath();
var db = new SQLiteConnection(dbPath);
CreateMainTables(db);
SeedDefaultData(db);
SeedDefaultScenarios(db);
return db;
}
/// 创建/打开任务帧数据库
public SQLiteConnection OpenFrameDb(string scenarioId)
{
var dbPath = Path.Combine(_paths.GetFramesDir(), $"{scenarioId}.db");
var db = new SQLiteConnection(dbPath);
db.CreateTable();
db.CreateIndex("SimFrameRecord", new[] { "ScenarioId", "FrameIndex" });
return db;
}
/// 删除任务帧数据库文件
public void DeleteFrameDb(string scenarioId)
{
var dbPath = Path.Combine(_paths.GetFramesDir(), $"{scenarioId}.db");
if (File.Exists(dbPath))
File.Delete(dbPath);
}
private void SeedDefaultData(SQLiteConnection db)
{
db.CreateTable();
var defaults = DefaultData.Load(_paths);
var currentVersion = db.Table()
.FirstOrDefault(m => m.Key == "defaultsVersion")?.Value;
// 版本未变且数据已存在 → 跳过
if (currentVersion == defaults.Version && db.Table().Count() > 0)
return;
// 插入或更新默认数据(按 Id 覆盖,不删除用户自建数据)
foreach (var a in defaults.Ammunition) db.InsertOrReplace(a);
foreach (var f in defaults.FireUnits) db.InsertOrReplace(f);
foreach (var d in defaults.Drones) db.InsertOrReplace(d);
foreach (var s in defaults.Sensors) db.InsertOrReplace(s);
foreach (var e in defaults.Environments) db.InsertOrReplace(e);
foreach (var f in defaults.Formations) db.InsertOrReplace(f);
foreach (var r in defaults.Routes)
{
r.WaypointsJson = System.Text.Json.JsonSerializer.Serialize(r.Waypoints);
db.InsertOrReplace(r);
}
db.InsertOrReplace(new MetaEntry { Key = "defaultsVersion", Value = defaults.Version });
}
private void SeedDefaultScenarios(SQLiteConnection db)
{
var currentVersion = db.Table()
.FirstOrDefault(m => m.Key == "scenariosVersion")?.Value;
// 版本未变 → 跳过
if (currentVersion == "3") return;
var defaults = DefaultData.Load(_paths);
var scenario = new ScenarioService(
new ScenarioRepository(db), new CombatSceneRepository(db),
new ControlZoneRepository(db), new DroneProfileRepository(db),
new EquipmentDeploymentRepository(db), new CloudDispersalRepository(db),
new RoutePlanRepository(db), new WaypointRepository(db));
DefaultScenarios.Seed(scenario, defaults);
db.InsertOrReplace(new MetaEntry { Key = "scenariosVersion", Value = "3" });
}
private void CreateMainTables(SQLiteConnection db)
{
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateIndex("RoutePlan", new[] { "ScenarioId", "WaveId" }, true);
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateTable();
db.CreateIndex("Scenario", "TaskNumber");
db.CreateIndex("ControlZone", "ScenarioId");
db.CreateIndex("DroneProfile", "ScenarioId");
db.CreateIndex("EquipmentDeployment", "ScenarioId");
db.CreateIndex("Waypoint", "ScenarioId");
db.CreateIndex("SimulationReport", "ScenarioId");
}
}
}