using System;
using System.Text.Json;
using System.Text.Json.Nodes;
namespace UbisamBase.Core.Settings;
///
/// UiSettingsService.json 에서 한 항목만 읽고 고쳐 쓴다(MergeHub 11차 F-4).
///
/// 아래 탭 줄 접기는 누를 때마다 바로 기억해야 한다. 그런데 는
/// 지금 메모리의 값을 통째로 쓰므로, 설정 화면에서 바꾸고 아직 [저장] 하지 않은 테마 · 배율까지 함께 저장된다.
/// 그래서 파일의 다른 값(모르는 항목 포함)은 그대로 두고 이 항목만 바꾼다.
///
public static class UiSettingsFile
{
public const string NavCollapsedKey = "NavCollapsed";
private static readonly JsonSerializerOptions Indented = new() { WriteIndented = true };
/// 아래 탭 줄을 접어 둔 상태인지. 항목이 없거나 글이 망가졌으면 펼침(false).
public static bool ReadNavCollapsed(string? json)
{
try
{
return Parse(json) is JsonObject obj &&
obj[NavCollapsedKey] is JsonValue value &&
value.TryGetValue(out bool collapsed) && collapsed;
}
catch (Exception e) when (e is JsonException || e is InvalidOperationException || e is FormatException)
{
return false;
}
}
///
/// 접기 항목만 바꾼 글. 글이 없거나 망가졌으면 그 항목만 든 새 글 - 망가진 파일은 어차피
/// 가 무시하고 기본값을 쓴다.
///
public static string WithNavCollapsed(string? json, bool collapsed)
{
JsonObject obj;
try
{
obj = Parse(json) as JsonObject ?? new JsonObject();
}
catch (JsonException)
{
obj = new JsonObject();
}
obj[NavCollapsedKey] = collapsed;
return obj.ToJsonString(Indented);
}
private static JsonNode? Parse(string? json)
{
if (string.IsNullOrWhiteSpace(json)) return null;
return JsonNode.Parse(json!.TrimStart(''));
}
}