using System.Net;
using NPin.Framework.AuditLogging.Domain.Entities;
using NPin.Framework.AuditLogging.Domain.Events;
using NPin.Framework.SqlSugarCore.Abstractions;
using Volo.Abp.Auditing;

namespace NPin.Framework.AuditLogging.Domain.Repositories;

public interface IAuditLogRepository : ISqlSugarRepository<AuditLogAggregateRoot, Guid>
{
    /// <summary>
    /// 获取每日平均执行时长
    /// </summary>
    /// <param name="startDate"></param>
    /// <param name="endDate"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<Dictionary<DateTime, double>> GetAverageExecutionDurationPerDayAsync(DateTime startDate, DateTime endDate,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取数量
    /// </summary>
    /// <param name="startTime"></param>
    /// <param name="endTime"></param>
    /// <param name="httpMethod"></param>
    /// <param name="url"></param>
    /// <param name="userId"></param>
    /// <param name="userName"></param>
    /// <param name="applicationName"></param>
    /// <param name="clientIpAddress"></param>
    /// <param name="correlationId"></param>
    /// <param name="maxExecutionDuration"></param>
    /// <param name="minExecutionDuration"></param>
    /// <param name="hasException"></param>
    /// <param name="httpStatusCode"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<long> GetCountAsync(DateTime? startTime = null, DateTime? endTime = null, string httpMethod = null,
        string url = null, Guid? userId = null, string userName = null, string applicationName = null,
        string clientIpAddress = null, string correlationId = null, int? maxExecutionDuration = null,
        int? minExecutionDuration = null, bool? hasException = null, HttpStatusCode? httpStatusCode = null,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取实体改变日志
    /// </summary>
    /// <param name="entityChangeId"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<EntityChangeEntity> GetEntityChange(Guid entityChangeId, CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取实体改变日志数量
    /// </summary>
    /// <param name="auditLogId"></param>
    /// <param name="startTime"></param>
    /// <param name="endTime"></param>
    /// <param name="changeType"></param>
    /// <param name="entityId"></param>
    /// <param name="entityTypeFullName"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<long> GetEntityChangeCountAsync(Guid? auditLogId = null, DateTime? startTime = null, DateTime? endTime = null,
        EntityChangeType? changeType = null, string entityId = null, string entityTypeFullName = null,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取实体改变日志列表
    /// </summary>
    /// <param name="sorting"></param>
    /// <param name="maxResultCount"></param>
    /// <param name="skipCount"></param>
    /// <param name="auditLogId"></param>
    /// <param name="startTime"></param>
    /// <param name="endTime"></param>
    /// <param name="changeType"></param>
    /// <param name="entityId"></param>
    /// <param name="entityTypeFullName"></param>
    /// <param name="includeDetails"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<EntityChangeEntity>> GetEntityChangeListAsync(string sorting = null, int maxResultCount = 50,
        int skipCount = 0, Guid? auditLogId = null, DateTime? startTime = null, DateTime? endTime = null,
        EntityChangeType? changeType = null, string entityId = null, string entityTypeFullName = null,
        bool includeDetails = false, CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取用户名改变日志列表
    /// </summary>
    /// <param name="entityId"></param>
    /// <param name="entityTypeFullName"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<EntityChangeWithUsername>> GetEntityChangesWithUsernameAsync(string entityId, string entityTypeFullName,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取用户名改变日志
    /// </summary>
    /// <param name="entityChangeId"></param>
    /// <returns></returns>
    Task<EntityChangeWithUsername> GetEntityChangeWithUsernameAsync(Guid entityChangeId);

    /// <summary>
    /// 获取审计日志列表
    /// </summary>
    /// <param name="sorting"></param>
    /// <param name="maxResultCount"></param>
    /// <param name="skipCount"></param>
    /// <param name="startTime"></param>
    /// <param name="endTime"></param>
    /// <param name="httpMethod"></param>
    /// <param name="url"></param>
    /// <param name="userId"></param>
    /// <param name="userName"></param>
    /// <param name="applicationName"></param>
    /// <param name="clientIpAddress"></param>
    /// <param name="correlationId"></param>
    /// <param name="maxExecutionDuration"></param>
    /// <param name="minExecutionDuration"></param>
    /// <param name="hasException"></param>
    /// <param name="httpStatusCode"></param>
    /// <param name="includeDetails"></param>
    /// <returns></returns>
    Task<List<AuditLogAggregateRoot>> GetListAsync(string sorting = null, int maxResultCount = 50, int skipCount = 0,
        DateTime? startTime = null, DateTime? endTime = null, string httpMethod = null, string url = null,
        Guid? userId = null, string userName = null, string applicationName = null, string clientIpAddress = null,
        string correlationId = null, int? maxExecutionDuration = null, int? minExecutionDuration = null,
        bool? hasException = null, HttpStatusCode? httpStatusCode = null, bool includeDetails = false);
}