using System;
using System.Collections.Generic;
using System.IO;
namespace SimTools
{
///
/// Lightweight INI reader/writer. Stored at: {AppDirectory}\settings.ini
/// Supports [Section] / Key=Value format. Lines starting with ; or # are comments.
///
public static class IniHelper
{
public static readonly string IniPath =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "settings.ini");
// ── Internal: load entire file into nested dictionary ──────────────────
private static Dictionary> LoadAll()
{
var data = new Dictionary>(StringComparer.OrdinalIgnoreCase);
if (!File.Exists(IniPath)) return data;
string? section = null;
foreach (var raw in File.ReadLines(IniPath))
{
var line = raw.Trim();
if (line.Length == 0 || line.StartsWith(';') || line.StartsWith('#')) continue;
if (line.StartsWith('[') && line.EndsWith(']'))
{
section = line[1..^1].Trim();
if (!data.ContainsKey(section))
data[section] = new Dictionary(StringComparer.OrdinalIgnoreCase);
continue;
}
if (section is null) continue;
var eq = line.IndexOf('=');
if (eq < 0) continue;
data[section][line[..eq].Trim()] = line[(eq + 1)..].Trim();
}
return data;
}
// ── Internal: write entire dictionary back to file ─────────────────────
private static void SaveAll(Dictionary> data)
{
var lines = new List();
foreach (var (section, keys) in data)
{
lines.Add($"[{section}]");
foreach (var (k, v) in keys)
lines.Add($"{k}={v}");
lines.Add(string.Empty);
}
File.WriteAllLines(IniPath, lines);
}
// ── Public API ─────────────────────────────────────────────────────────
public static string Read(string section, string key, string defaultValue = "")
{
var data = LoadAll();
return data.TryGetValue(section, out var sec) && sec.TryGetValue(key, out var val)
? val : defaultValue;
}
public static void Write(string section, string key, string value)
{
var data = LoadAll();
if (!data.ContainsKey(section))
data[section] = new Dictionary(StringComparer.OrdinalIgnoreCase);
data[section][key] = value;
SaveAll(data);
}
public static bool ReadBool(string section, string key, bool defaultValue = false) =>
Read(section, key, defaultValue.ToString())
.Equals("true", StringComparison.OrdinalIgnoreCase);
public static void WriteBool(string section, string key, bool value) =>
Write(section, key, value ? "true" : "false");
}
}