129 lines
3.7 KiB
C#
129 lines
3.7 KiB
C#
|
|
using System;
|
||
|
|
using System.IO;
|
||
|
|
using System.Linq;
|
||
|
|
using System.Text.Json;
|
||
|
|
using UnifiedFarmLauncher.Models;
|
||
|
|
|
||
|
|
namespace UnifiedFarmLauncher.Services
|
||
|
|
{
|
||
|
|
public class ConfigService
|
||
|
|
{
|
||
|
|
private static readonly JsonSerializerOptions JsonOptions = new()
|
||
|
|
{
|
||
|
|
WriteIndented = true,
|
||
|
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
|
||
|
|
};
|
||
|
|
|
||
|
|
private readonly string _configPath;
|
||
|
|
private ConfigRoot? _config;
|
||
|
|
|
||
|
|
public ConfigService()
|
||
|
|
{
|
||
|
|
var appDataPath = GetAppDataPath();
|
||
|
|
Directory.CreateDirectory(appDataPath);
|
||
|
|
_configPath = Path.Combine(appDataPath, "workers.json");
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string GetAppDataPath()
|
||
|
|
{
|
||
|
|
var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
|
||
|
|
return Path.Combine(localAppData, "UnifiedFarmLauncher");
|
||
|
|
}
|
||
|
|
|
||
|
|
public ConfigRoot Load()
|
||
|
|
{
|
||
|
|
if (_config != null)
|
||
|
|
return _config;
|
||
|
|
|
||
|
|
if (!File.Exists(_configPath))
|
||
|
|
{
|
||
|
|
_config = new ConfigRoot();
|
||
|
|
Save(_config);
|
||
|
|
return _config;
|
||
|
|
}
|
||
|
|
|
||
|
|
try
|
||
|
|
{
|
||
|
|
var json = File.ReadAllText(_configPath);
|
||
|
|
_config = JsonSerializer.Deserialize<ConfigRoot>(json, JsonOptions) ?? new ConfigRoot();
|
||
|
|
return _config;
|
||
|
|
}
|
||
|
|
catch (Exception ex)
|
||
|
|
{
|
||
|
|
throw new InvalidOperationException($"Failed to load configuration from {_configPath}: {ex.Message}", ex);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Save(ConfigRoot? config = null)
|
||
|
|
{
|
||
|
|
config ??= _config ?? new ConfigRoot();
|
||
|
|
_config = config;
|
||
|
|
|
||
|
|
try
|
||
|
|
{
|
||
|
|
var json = JsonSerializer.Serialize(config, JsonOptions);
|
||
|
|
File.WriteAllText(_configPath, json);
|
||
|
|
}
|
||
|
|
catch (Exception ex)
|
||
|
|
{
|
||
|
|
throw new InvalidOperationException($"Failed to save configuration to {_configPath}: {ex.Message}", ex);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Reload()
|
||
|
|
{
|
||
|
|
_config = null;
|
||
|
|
Load();
|
||
|
|
}
|
||
|
|
|
||
|
|
public WorkerConfig? GetWorker(int id)
|
||
|
|
{
|
||
|
|
return Load().Workers.FirstOrDefault(w => w.Id == id);
|
||
|
|
}
|
||
|
|
|
||
|
|
public WorkerConfig? GetWorkerByName(string name)
|
||
|
|
{
|
||
|
|
return Load().Workers.FirstOrDefault(w => w.Name == name);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void AddWorker(WorkerConfig worker)
|
||
|
|
{
|
||
|
|
var config = Load();
|
||
|
|
if (config.Workers.Any(w => w.Id == worker.Id || w.Name == worker.Name))
|
||
|
|
throw new InvalidOperationException($"Worker with ID {worker.Id} or name '{worker.Name}' already exists");
|
||
|
|
|
||
|
|
config.Workers.Add(worker);
|
||
|
|
Save(config);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void UpdateWorker(WorkerConfig worker)
|
||
|
|
{
|
||
|
|
var config = Load();
|
||
|
|
var index = config.Workers.FindIndex(w => w.Id == worker.Id);
|
||
|
|
if (index < 0)
|
||
|
|
throw new InvalidOperationException($"Worker with ID {worker.Id} not found");
|
||
|
|
|
||
|
|
config.Workers[index] = worker;
|
||
|
|
Save(config);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void DeleteWorker(int id)
|
||
|
|
{
|
||
|
|
var config = Load();
|
||
|
|
var worker = config.Workers.FirstOrDefault(w => w.Id == id);
|
||
|
|
if (worker == null)
|
||
|
|
throw new InvalidOperationException($"Worker with ID {id} not found");
|
||
|
|
|
||
|
|
config.Workers.Remove(worker);
|
||
|
|
Save(config);
|
||
|
|
}
|
||
|
|
|
||
|
|
public int GetNextWorkerId()
|
||
|
|
{
|
||
|
|
var config = Load();
|
||
|
|
return config.Workers.Count > 0 ? config.Workers.Max(w => w.Id) + 1 : 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|