using Quartz;

namespace Service.Jobs;

/// <summary>
/// 预算归档定时任务
/// </summary>
[DisallowConcurrentExecution]
public class BudgetArchiveJob(
    IServiceProvider serviceProvider,
    ILogger<BudgetArchiveJob> logger) : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        try
        {
            logger.LogInformation("开始执行预算归档任务");

            // 每个月1号执行，归档上个月的数据
            var targetDate = DateTime.Now.AddMonths(-1);
            var year = targetDate.Year;
            var month = targetDate.Month;

            using var scope = serviceProvider.CreateScope();
            var budgetService = scope.ServiceProvider.GetRequiredService<IBudgetService>();
            
            // 归档月度数据
            var result = await budgetService.ArchiveBudgetsAsync(year, month);

            if (string.IsNullOrEmpty(result))
            {
                logger.LogInformation("归档 {Year}年{Month}月 预算任务执行成功", year, month);
            }
            else
            {
                logger.LogWarning("归档 {Year}年{Month}月 预算任务提示: {Result}", year, month, result);
            }
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "预算归档任务执行出错");
        }
    }
}
