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
}
};
}
}