using System; using System.Linq; using DanroJump.Prizes; using DanroJump.Prizes.Qr; namespace DanroJump.Settings { /// /// Маршрутизирует кнопки сервисного меню в понятные оператору действия. /// public static class ServiceSettingsActionRouter { public static ServiceSettingsActionResult Execute( ServiceSettingDefinition definition, IReadOnlyServiceSettings settings) { if (definition == null) { return ServiceSettingsActionResult.Unknown( "Неизвестное действие", "Кнопка сервисного меню не содержит описания действия."); } return definition.Key switch { ServiceSettingsKeys.StatisticsButton => BuildStatistics(settings), ServiceSettingsKeys.PhoneNumberButton => OpenSettingEditor( "Номер телефона", "Открыто служебное окно номера телефона для QR-призов.", ServiceSettingsKeys.PrizePhoneNumber), ServiceSettingsKeys.BigPrizeButton => OpenSettingEditor( "Суперприз", "Открыто служебное окно настройки суперприза.", ServiceSettingsKeys.BigPrize), ServiceSettingsKeys.SupportNumberButton => OpenSettingEditor( "Номер поддержки", "Открыто служебное окно номера поддержки автомата.", ServiceSettingsKeys.SupportNumber), ServiceSettingsKeys.CurrencyButton => OpenSettingEditor( "Валюта баланса", "Открыто служебное окно валюты денежного баланса.", ServiceSettingsKeys.Currency), ServiceSettingsKeys.HopperTestButton => ServiceSettingsActionResult.Success( "Тест выдачи", "Тест выдачи подготовлен. Аппаратная команда будет подключена через призовой контур.", "Проверка hopper/выдачи"), ServiceSettingsKeys.LevelsPrizesButton => ServiceSettingsActionResult.Success( "Настройки призов", BuildPrizeSummary(settings), ServiceSettingsKeys.PrizeLevels), ServiceSettingsKeys.QrSettingsButton => ServiceSettingsActionResult.Success( "Настройки QR", BuildQrSummary(settings), "QR-выдача"), ServiceSettingsKeys.StandSettingsButton => ServiceSettingsActionResult.Success( "Настройки витрины", "Открыт раздел призовой витрины. Следующий шаг - подключить статусы ячеек и команды тестовой выдачи.", "Призовая витрина"), _ => ServiceSettingsActionResult.Unknown( definition.DisplayName, string.IsNullOrWhiteSpace(definition.ButtonData) ? "Для этой кнопки пока нет маршрута действия." : $"Для этой кнопки пока нет маршрута действия: {definition.ButtonData}.") }; } private static ServiceSettingsActionResult BuildStatistics(IReadOnlyServiceSettings settings) { var snapshot = settings?.Snapshot(); var totalSettings = snapshot?.Count ?? 0; var visibleDefinitions = settings?.Database?.Entries.Count(entry => entry.ShownInServiceMenu) ?? 0; var startCost = settings != null ? Math.Max(0, settings.GetInt(ServiceSettingsKeys.StartGameCost)) : 0; var freePlay = settings != null && settings.GetBool(ServiceSettingsKeys.FreePlay); var priceText = freePlay ? "free play" : $"{startCost}"; return ServiceSettingsActionResult.Success( "Статистика", $"Настроек загружено: {totalSettings}. Видимых пунктов: {visibleDefinitions}. Стоимость старта: {priceText}.", "Статистика"); } private static ServiceSettingsActionResult OpenSettingEditor(string title, string status, string settingKey) { return ServiceSettingsActionResult.Success(title, status, settingKey); } private static string BuildPrizeSummary(IReadOnlyServiceSettings settings) { if (settings == null) { return "Раздел призов открыт. Сервис настроек пока недоступен."; } var smallPrize = settings.GetBool(ServiceSettingsKeys.GiveSmallPrize) ? "включён" : "выключен"; var bigPrize = settings.GetBool(ServiceSettingsKeys.GiveBigPrize) ? "включён" : "выключен"; var levels = PrizeLevelTable.FromJson(settings.GetString(ServiceSettingsKeys.PrizeLevels)); if (levels.Count > 0) { return $"Раздел призов открыт. Настроено уровней: {levels.Count}."; } return $"Раздел призов открыт. Таблица уровней пустая. Legacy: малый приз {smallPrize}, большой приз {bigPrize}."; } private static string BuildQrSummary(IReadOnlyServiceSettings settings) { if (settings == null) { return "Раздел QR открыт. Сервис настроек пока недоступен."; } var showQrErrors = settings.GetBool(ServiceSettingsKeys.ShowPrizeError) ? "показывать" : "скрывать"; var phone = settings.GetString(ServiceSettingsKeys.PrizePhoneNumber); var phoneDigits = TelegramPrizeQrPayloadBuilder.NormalizePhoneDigits(phone); var phoneText = string.IsNullOrWhiteSpace(phone) ? "не задан" : phone; var template = settings.GetString(ServiceSettingsKeys.QrMessageTemplate); var templateText = string.IsNullOrWhiteSpace(template) ? "стандартный" : "настроен"; var messageTemplate = string.IsNullOrWhiteSpace(template) ? TelegramPrizeQrPayloadBuilder.DefaultMessageTemplate : template; var preview = TelegramPrizeQrPayloadBuilder.FormatMessageTemplate( messageTemplate, new PrizeFlowResult(PrizeRewardKind.QRCode, 100, 0, 50f), phone); var qrState = string.IsNullOrWhiteSpace(phoneDigits) ? "QR не готов: не задан телефон." : "QR готов к показу."; return $"Раздел QR открыт. {qrState} Ошибки QR: {showQrErrors}. Телефон: {phoneText}. Шаблон сообщения: {templateText}. Пример сообщения: {preview}"; } } public readonly struct ServiceSettingsActionResult { private ServiceSettingsActionResult(bool handled, string title, string status, string focusKey) { Handled = handled; Title = string.IsNullOrWhiteSpace(title) ? "Служебное действие" : title; Status = status ?? string.Empty; FocusKey = focusKey ?? string.Empty; } public bool Handled { get; } public string Title { get; } public string Status { get; } public string FocusKey { get; } public static ServiceSettingsActionResult Success(string title, string status, string focusKey) { return new ServiceSettingsActionResult(true, title, status, focusKey); } public static ServiceSettingsActionResult Unknown(string title, string status) { return new ServiceSettingsActionResult(false, title, status, string.Empty); } } }