using System.IO; using System.Text.Json; namespace Housing.Services; public sealed class LoginSelectionOptions { private const string DefaultContent = """ { "loginAccounts": [ { "id": "su", "password": "su" } ], "makers": [ "AMO", "ABC" ], "models": [ "MODEL-1" ], "variant1Values": [], "variant2Values": [], "lineValues": [ "LINE-1" ], "jigNoValues": [ "JIG-1" ] } """; public IReadOnlyList Makers { get; init; } = Array.Empty(); public IReadOnlyList Models { get; init; } = Array.Empty(); public IReadOnlyList Variant1Values { get; init; } = Array.Empty(); public IReadOnlyList Variant2Values { get; init; } = Array.Empty(); public IReadOnlyList LineValues { get; init; } = Array.Empty(); public IReadOnlyList JigNoValues { get; init; } = Array.Empty(); public IReadOnlyList LoginAccounts { get; init; } = Array.Empty(); public static LoginSelectionOptions Load(string filePath) { EnsureFileExists(filePath); try { var json = File.ReadAllText(filePath); var data = JsonSerializer.Deserialize( json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }) ?? new LoginSelectionOptionsData(); return new LoginSelectionOptions { LoginAccounts = NormalizeLoginAccounts(data.LoginAccounts), Makers = NormalizeValues(data.Makers), Models = NormalizeValues(data.Models), Variant1Values = NormalizeValues(data.Variant1Values, includeBlank: true), Variant2Values = NormalizeValues(data.Variant2Values, includeBlank: true), LineValues = NormalizeValues(data.LineValues), JigNoValues = NormalizeValues(data.JigNoValues) }; } catch { return new LoginSelectionOptions { Variant1Values = new[] { string.Empty }, Variant2Values = new[] { string.Empty } }; } } public static void CreateDefaultFile(string filePath) { var directory = Path.GetDirectoryName(filePath); if (!string.IsNullOrWhiteSpace(directory)) { Directory.CreateDirectory(directory); } File.WriteAllText(filePath, DefaultContent); } private static void EnsureFileExists(string filePath) { if (File.Exists(filePath)) { return; } CreateDefaultFile(filePath); } private static IReadOnlyList NormalizeValues( IReadOnlyList? source, bool includeBlank = false) { var values = new List(); if (includeBlank) { values.Add(string.Empty); } if (source is null) { return values; } foreach (var rawValue in source) { var value = rawValue.Trim(); if (string.IsNullOrWhiteSpace(value)) { continue; } if (!values.Any(existing => string.Equals(existing, value, StringComparison.OrdinalIgnoreCase))) { values.Add(value); } } return values; } private static IReadOnlyList NormalizeLoginAccounts( IReadOnlyList? source) { if (source is null) { return Array.Empty(); } var accounts = new List(); foreach (var account in source) { var id = account.Id?.Trim() ?? string.Empty; var password = account.Password ?? string.Empty; if (string.IsNullOrWhiteSpace(id) || string.IsNullOrWhiteSpace(password)) { continue; } if (accounts.Any(existing => string.Equals(existing.Id, id, StringComparison.OrdinalIgnoreCase))) { continue; } accounts.Add(new LoginAccountOption(id, password)); } return accounts; } private sealed class LoginSelectionOptionsData { public List? LoginAccounts { get; set; } public List? Makers { get; set; } public List? Models { get; set; } public List? Variant1Values { get; set; } public List? Variant2Values { get; set; } public List? LineValues { get; set; } public List? JigNoValues { get; set; } } private sealed class LoginAccountOptionData { public string? Id { get; set; } public string? Password { get; set; } } } public sealed record LoginAccountOption(string Id, string Password);