using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using BetterGenshinImpact.Model.Gear.Triggers;
using BetterGenshinImpact.Model;
using BetterGenshinImpact.Helpers.Extensions;
using CommunityToolkit.Mvvm.ComponentModel;
using Quartz;
namespace BetterGenshinImpact.ViewModel.Pages.Component;
///
/// 触发器ViewModel
///
public partial class GearTriggerViewModel : ObservableObject
{
[ObservableProperty]
private string _name = string.Empty;
[ObservableProperty]
private bool _isEnabled = true;
[ObservableProperty]
private bool _isSelected = false;
[ObservableProperty]
private string? _cronExpression;
partial void OnCronExpressionChanged(string? value)
{
UpdateNextRunTime();
}
[ObservableProperty]
private DateTime _createdTime = DateTime.Now;
[ObservableProperty]
private DateTime _modifiedTime = DateTime.Now;
///
/// 触发器类型
///
[ObservableProperty]
private TriggerType _triggerType = TriggerType.Timed;
///
/// 任务引用名称
///
[ObservableProperty]
private string _taskDefinitionName = string.Empty;
// 热键触发器属性
[ObservableProperty]
private HotKey? _hotkey;
///
/// 快捷键类型 (全局热键/键鼠监听)
///
[ObservableProperty]
private HotKeyTypeEnum _hotkeyType = HotKeyTypeEnum.KeyboardMonitor;
///
/// 快捷键类型名称 (中文显示)
///
public string HotkeyTypeName => HotkeyType.ToChineseName();
[ObservableProperty]
private DateTime? _nextRunTime;
[ObservableProperty]
private DateTime? _lastRunTime;
public void UpdateNextRunTime()
{
if (TriggerType == TriggerType.Timed && !string.IsNullOrWhiteSpace(CronExpression))
{
try
{
var cron = new CronExpression(CronExpression);
var next = cron.GetNextValidTimeAfter(DateTimeOffset.Now);
NextRunTime = next?.LocalDateTime;
}
catch
{
NextRunTime = null;
}
}
else
{
NextRunTime = null;
}
}
public GearTriggerViewModel()
{
}
public GearTriggerViewModel(string name, TriggerType triggerType)
{
Name = name;
TriggerType = triggerType;
}
///
/// 获取触发器类型显示名称
///
public string TriggerTypeDisplayName => TriggerType switch
{
TriggerType.Timed => "定时触发",
TriggerType.Hotkey => "热键触发",
_ => "未知类型"
};
///
/// 获取热键显示文本
///
public string HotkeyDisplayText => Hotkey?.ToString() ?? "未设置";
///
/// 转换为对应的触发器实例
///
public GearBaseTrigger ToTrigger()
{
GearBaseTrigger trigger = TriggerType switch
{
TriggerType.Timed => new QuartzCronGearTrigger
{
CronExpression = CronExpression
},
TriggerType.Hotkey => new HotkeyGearTrigger
{
Hotkey = Hotkey
},
_ => throw new ArgumentOutOfRangeException()
};
trigger.Name = Name;
trigger.IsEnabled = IsEnabled;
trigger.TaskDefinitionName = TaskDefinitionName;
return trigger;
}
}
///
/// 触发器类型枚举
///
public enum TriggerType
{
///
/// 定时触发
///
[Description("定时触发")]
Timed,
///
/// 热键触发
///
[Description("热键触发")]
Hotkey
}