using Model;
using Model.Entity;
using Model.Models;
using ORM;
using Service.Interface;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static System.Formats.Asn1.AsnWriter;

namespace Service.Implement
{
    public class TestReportService : BaseService<TestReportEntity>, ITestReportService
    {
        public TestReportService(SqlSugarRepository<TestReportEntity> repository) : base(repository)
        {
        }

        /// <summary>
        /// 根据 TestRoundId 获取符合条件的测试步骤
        /// </summary>
        public async Task<Result<List<TestReportEntity>>> GetByTestRoundIdAsync(Guid testRoundId)
        {
            try
            {
                var list = await _repository.Entities
                    .Where(x => x.TestRoundId == testRoundId)
                    .ToListAsync();

                return Result<List<TestReportEntity>>.Success(list);
            }
            catch (Exception ex)
            {
                return Result<List<TestReportEntity>>.Error("根据 TestRoundId 查询数据失败", ex);
            }
        }

        /// <summary>
        /// 根据 TestRoundId 分组，获取唯一记录并按分组统计最大与最小时间，
        /// 支持按日期范围与台架名称筛选。
        /// </summary>
        public async Task<Result<IList<TestReportModel>>> GetFilterList(DateTime? startTime = null, DateTime? endTime = null, string? scope = null)
        {
            try
            {
                // 使用 SqlSugar 的 GroupBy 查询，聚合最大/最小时间
                // 推荐采用这种按组投影的方式，将分组计算交由数据库处理，性能最佳
                var query = _repository.Context.Queryable<TestReportEntity>();

                // 日期范围筛选
                if (startTime.HasValue)
                    query = query.Where(x => x.CreateTime >= startTime.Value);
                if (endTime.HasValue)
                    query = query.Where(x => x.CreateTime <= endTime.Value);

                // 台架名称筛选
                if (!string.IsNullOrEmpty(scope))
                    query = query.Where(x => x.Scope == scope);

                var list = await query
                    .GroupBy(x => x.TestRoundId)
                    .Select(x => new TestReportModel
                    {
                        TestRoundId = x.TestRoundId,
                        StartTime = SqlFunc.AggregateMin(x.CreateTime),
                        EndTime = SqlFunc.AggregateMax(x.CreateTime),
                        Scope = x.Scope,
                        FileName = x.FileName,
                    })
                    .ToListAsync();

                return Result<IList<TestReportModel>>.Success(list);
            }
            catch (Exception ex)
            {
                return Result<IList<TestReportModel>>.Error("获取分组过滤列表失败", ex);
            }
        }
        /// <summary>
        /// 根据日期和台架名称筛选获取完整的测试步骤实体列表（无分组，用于导出）
        /// </summary>
        public async Task<Result<List<TestReportEntity>>> GetEntitiesByFilter(DateTime? startTime = null, DateTime? endTime = null, string? scope = null)
        {
            try
            {
                var query = _repository.Context.Queryable<TestReportEntity>();

                if (startTime.HasValue)
                    query = query.Where(x => x.CreateTime >= startTime.Value);
                if (endTime.HasValue)
                    query = query.Where(x => x.CreateTime <= endTime.Value);
                if (!string.IsNullOrEmpty(scope))
                    query = query.Where(x => x.Scope == scope);

                var list = await query
                    .OrderBy(x => x.CreateTime)
                    .ToListAsync();

                return Result<List<TestReportEntity>>.Success(list);
            }
            catch (Exception ex)
            {
                return Result<List<TestReportEntity>>.Error("获取导出数据失败", ex);
            }
        }
    }
}