using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Services.Extensions; namespace Wino.Services; /// /// Service for managing keyboard shortcuts for mail and calendar actions. /// public class KeyboardShortcutService : BaseDatabaseService, IKeyboardShortcutService { public KeyboardShortcutService(IDatabaseService databaseService) : base(databaseService) { } /// /// Gets all available keyboard shortcuts. /// public async Task> GetKeyboardShortcutsAsync() { return await Connection.QueryAsync( "SELECT * FROM KeyboardShortcut ORDER BY Mode, Action"); } /// /// Gets enabled keyboard shortcuts only. /// public async Task> GetEnabledKeyboardShortcutsAsync() { return await Connection.QueryAsync( "SELECT * FROM KeyboardShortcut WHERE IsEnabled = ? ORDER BY Mode, Action", true); } /// /// Creates or updates a keyboard shortcut. /// public async Task SaveKeyboardShortcutAsync(KeyboardShortcut shortcut) { if (shortcut.Id == Guid.Empty) { shortcut.Id = Guid.NewGuid(); shortcut.CreatedAt = DateTime.UtcNow; await Connection.InsertAsync(shortcut, typeof(KeyboardShortcut)); } else { await Connection.UpdateAsync(shortcut, typeof(KeyboardShortcut)); } return shortcut; } /// /// Deletes a keyboard shortcut. /// public async Task DeleteKeyboardShortcutAsync(Guid shortcutId) { await Connection.ExecuteAsync($"DELETE FROM {nameof(KeyboardShortcut)} WHERE {nameof(KeyboardShortcut.Id)} = ?", shortcutId); } /// /// Gets the shortcut for the given key combination. /// public async Task GetShortcutForKeyAsync(WinoApplicationMode mode, string key, ModifierKeys modifierKeys) { const string query = "SELECT * FROM KeyboardShortcut WHERE Mode = ? AND Key = ? AND ModifierKeys = ? AND IsEnabled = ? LIMIT 1"; return await Connection.FindWithQueryAsync(query, (int)mode, key, (int)modifierKeys, 1); } /// /// Checks if a key combination is already assigned to another shortcut. /// public async Task IsKeyCombinationInUseAsync(WinoApplicationMode mode, string key, ModifierKeys modifierKeys, Guid? excludeShortcutId = null) { string query; KeyboardShortcut shortcut; if (excludeShortcutId.HasValue) { query = "SELECT * FROM KeyboardShortcut WHERE Mode = ? AND Key = ? AND ModifierKeys = ? AND Id != ? LIMIT 1"; shortcut = await Connection.FindWithQueryAsync(query, (int)mode, key, (int)modifierKeys, excludeShortcutId.Value); } else { query = "SELECT * FROM KeyboardShortcut WHERE Mode = ? AND Key = ? AND ModifierKeys = ? LIMIT 1"; shortcut = await Connection.FindWithQueryAsync(query, (int)mode, key, (int)modifierKeys); } return shortcut != null; } /// /// Creates default keyboard shortcuts for common mail operations. /// public async Task CreateDefaultShortcutsAsync() { var defaultShortcuts = GetDefaultShortcuts(); foreach (var shortcut in defaultShortcuts) { // Only create if it doesn't exist already var exists = await IsKeyCombinationInUseAsync(shortcut.Mode, shortcut.Key, shortcut.ModifierKeys); if (!exists) { await SaveKeyboardShortcutAsync(shortcut); } } } /// /// Resets all shortcuts to defaults. /// public async Task ResetToDefaultShortcutsAsync() { // Delete all existing shortcuts await Connection.ExecuteAsync($"DELETE FROM {nameof(KeyboardShortcut)}"); // Create default shortcuts await CreateDefaultShortcutsAsync(); } /// /// Gets the default keyboard shortcuts. /// private static List GetDefaultShortcuts() { return new List { new KeyboardShortcut { Id = Guid.NewGuid(), Key = "Delete", ModifierKeys = ModifierKeys.None, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.Delete, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "N", ModifierKeys = ModifierKeys.Control, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.NewMail, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "A", ModifierKeys = ModifierKeys.Control, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.ToggleArchive, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "R", ModifierKeys = ModifierKeys.Control, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.ToggleReadUnread, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "F", ModifierKeys = ModifierKeys.Control, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.ToggleFlag, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "M", ModifierKeys = ModifierKeys.Control, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.Move, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "R", ModifierKeys = ModifierKeys.Control, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.Reply, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "R", ModifierKeys = ModifierKeys.Control | ModifierKeys.Shift, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.ReplyAll, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "Enter", ModifierKeys = ModifierKeys.Control, Mode = WinoApplicationMode.Mail, Action = KeyboardShortcutAction.Send, IsEnabled = true } }; } }