using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using DW5S.DTO;
using DW5S.Repostory;
using System.IO;
using DW5S.Entity;
using DW5S.WebApi;
using System.Diagnostics;
using System.Configuration;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using Microsoft.EntityFrameworkCore;
namespace DW5S.App.Controllers
{
    /// 
    /// 日志相关接口
    /// 
    public class LogController : BaseController
    {
        [Autowired]
        private readonly ILogger logger;
        [Autowired]
        private readonly UnitOfWork unitOfWork;
        /// 
        /// 将日志写入到平台
        /// 
        /// 日志信息
        /// 
        [HttpPost]
        public async Task Add(LogInfoDto dto)
        {
            try
            {
                var repsLog = unitOfWork.Of();
                await repsLog.AddOrUpdateAsync(new LogRes()
                {
                    LogTime = dto.LogTime,
                    Module = dto.Module,
                    LogType = (Entity.EnumLogType)(int)dto.LogType,
                    Msg = dto.Msg,
                });
                await unitOfWork.SaveAsync();
                return Success();
            }
            catch (Exception ex)
            {
                string msg = "日志信息写入异常";
                logger.Error(ex, msg);
                return Error(msg);
            }
        }
        /// 
        /// 查询日志信息
        /// 
        /// 日志查询参数
        /// 
        [HttpPost]
        public async Task>> Query(LogQueryDto dto)
        {
            try
            {
                var query = unitOfWork.Of().AsQueryable();
                if (!string.IsNullOrWhiteSpace(dto.Module) && dto.Module != "全部")
                    query = query.Where(p => p.Module == dto.Module);
                if (dto.LogTimeBegin != null && dto.LogTimeBegin != DateTime.MinValue)
                    query = query.Where(p => p.LogTime >= dto.LogTimeBegin);
                if (dto.LogTimeEnd != null && dto.LogTimeEnd != DateTime.MinValue)
                    query = query.Where(p => p.LogTime <= dto.LogTimeEnd);
                var res = await query.OrderBy(p => p.Module).ThenByDescending(t => t.LogTime).ToListAsync();
                var dtoRes = res.Select(t => new LogInfoDto
                {
                    ID = t.Id,
                    LogTime = t.LogTime,
                    LogType = (EnumLogTypeDto)(int)t.LogType,
                    Module = t.Module,
                    Msg = t.Msg,
                }).ToList();
                return Success(dtoRes);
            }
            catch (Exception ex)
            {
                string msg = "日志信息查询异常";
                logger.Error(ex, msg);
                return Error>(msg);
            }
        }
        /// 
        /// 获取所有日志模块
        /// 
        /// 
        [HttpPost]
        public async Task>> GetModules()
        {
            try
            {
                var repsLog = unitOfWork.Of();
                var res = await repsLog.GetDistinctAsync(p => p.Module);
                var dtoRes = res.Select(p => new LogModulesResDto()
                {
                    Module = p
                }).OrderBy(p => p.Module).ToList();
                return Success(dtoRes);
            }
            catch (Exception ex)
            {
                string msg = "日志模块查询异常";
                logger.Error(ex, msg);
                return Error>(msg);
            }
        }
        /// 
        /// 删除日志
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task Delete(IEnumerable dto)
        {
            if (dto == null || !dto.Any()) return Success();
            try
            {
                var repsLog = unitOfWork.Of();
                var ids = dto.Select(p => p.ID);
                await repsLog.DeleteAsync(p => ids.Contains(p.Id));
                await unitOfWork.SaveAsync();
                return Success();
            }
            catch (Exception ex)
            {
                string msg = "日志信息删除异常";
                logger.Error(ex, msg);
                return Error(msg);
            }
        }
    }
}