using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using SqlKata; 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 operations. /// public class KeyboardShortcutService : BaseDatabaseService, IKeyboardShortcutService { public KeyboardShortcutService(IDatabaseService databaseService) : base(databaseService) { } /// /// Gets all available keyboard shortcuts. /// public async Task> GetKeyboardShortcutsAsync() { var query = new Query(nameof(KeyboardShortcut)) .OrderBy(nameof(KeyboardShortcut.MailOperation)); return await Connection.QueryAsync(query.GetRawQuery()); } /// /// Gets enabled keyboard shortcuts only. /// public async Task> GetEnabledKeyboardShortcutsAsync() { var query = new Query(nameof(KeyboardShortcut)) .Where(nameof(KeyboardShortcut.IsEnabled), true) .OrderBy(nameof(KeyboardShortcut.MailOperation)); return await Connection.QueryAsync(query.GetRawQuery()); } /// /// 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); } else { await Connection.UpdateAsync(shortcut); } return shortcut; } /// /// Deletes a keyboard shortcut. /// public async Task DeleteKeyboardShortcutAsync(Guid shortcutId) { var query = new Query(nameof(KeyboardShortcut)) .Where(nameof(KeyboardShortcut.Id), shortcutId); await Connection.ExecuteAsync($"DELETE FROM {nameof(KeyboardShortcut)} WHERE {nameof(KeyboardShortcut.Id)} = ?", shortcutId); } /// /// Gets the mail operation for the given key combination. /// public async Task GetMailOperationForKeyAsync(string key, ModifierKeys modifierKeys) { var query = new Query(nameof(KeyboardShortcut)) .Where(nameof(KeyboardShortcut.Key), key) .Where(nameof(KeyboardShortcut.ModifierKeys), (int)modifierKeys) .Where(nameof(KeyboardShortcut.IsEnabled), true); var shortcut = await Connection.FindWithQueryAsync(query.GetRawQuery()); return shortcut?.MailOperation; } /// /// Checks if a key combination is already assigned to another shortcut. /// public async Task IsKeyCombinationInUseAsync(string key, ModifierKeys modifierKeys, Guid? excludeShortcutId = null) { var query = new Query(nameof(KeyboardShortcut)) .Where(nameof(KeyboardShortcut.Key), key) .Where(nameof(KeyboardShortcut.ModifierKeys), (int)modifierKeys); if (excludeShortcutId.HasValue) { query = query.WhereNot(nameof(KeyboardShortcut.Id), excludeShortcutId.Value); } var shortcut = await Connection.FindWithQueryAsync(query.GetRawQuery()); 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.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, MailOperation = MailOperation.SoftDelete, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "Delete", ModifierKeys = ModifierKeys.Shift, MailOperation = MailOperation.HardDelete, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "A", ModifierKeys = ModifierKeys.Control, MailOperation = MailOperation.Archive, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "R", ModifierKeys = ModifierKeys.Control, MailOperation = MailOperation.MarkAsRead, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "U", ModifierKeys = ModifierKeys.Control, MailOperation = MailOperation.MarkAsUnread, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "F", ModifierKeys = ModifierKeys.Control, MailOperation = MailOperation.SetFlag, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "F", ModifierKeys = ModifierKeys.Control | ModifierKeys.Shift, MailOperation = MailOperation.ClearFlag, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "J", ModifierKeys = ModifierKeys.Control, MailOperation = MailOperation.MoveToJunk, IsEnabled = true }, new KeyboardShortcut { Id = Guid.NewGuid(), Key = "M", ModifierKeys = ModifierKeys.Control, MailOperation = MailOperation.Move, IsEnabled = true } }; } }