using Admin.Core.Model;
using Admin.Core.Common.Resource;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Admin.Core.Common;
using Admin.Core.IService.ISys;
using Admin.Core.Model.Sys;

namespace Admin.Core.Api
{
    /// <summary>
    /// SysNoticeController
    /// </summary>
	[Route("api/[controller]/[action]")]
    [ApiController]
    [Authorize(Permissions.Name)]
    public class SysNoticeController : BaseApiUserController
    {

        /// <summary>
        /// _sysNoticeService
        /// </summary>
        private readonly ISysNoticeService _sysNoticeService;

        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="SysNoticeService"></param>
        /// <param name="sysUserService"></param>
        public SysNoticeController(ISysNoticeService SysNoticeService, ISysUserService sysUserService) : base(sysUserService)
        {
            _sysUserService = sysUserService;
            _sysNoticeService = SysNoticeService;
        }

        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="pageQuery"></param>
        /// <returns></returns>
        [HttpPost]
        [Action("通知公告", ActionType.QUERY)]
        public async Task<MessageModel<PageModel<SysNotice>>> GetByPage([FromBody] PageQuery<SysNotice> pageQuery)
        {
            Expression<Func<SysNotice, bool>> whereExpression = x => true;
            if (pageQuery.Query.NoticeTitle.IsNotEmptyOrNull())
            {
                whereExpression = whereExpression.And(x => x.NoticeTitle.Contains(pageQuery.Query.NoticeTitle));
            }
            if (pageQuery.Query.NoticeType.IsNotEmptyOrNull())
            {
                whereExpression = whereExpression.And(x => x.NoticeType == pageQuery.Query.NoticeType);
            }
            if (pageQuery.Query.CreateBy.IsNotEmptyOrNull())
            {
                whereExpression = whereExpression.And(x => x.CreateBy.Contains(pageQuery.Query.CreateBy));
            }
            if (pageQuery.Query.Status.IsNotEmptyOrNull())
            {
                whereExpression = whereExpression.And(x => x.Status == pageQuery.Query.Status);
            }

            var data = await _sysNoticeService.QueryPageAsync(whereExpression, pageQuery.Page, pageQuery.PageSize, "UpdateTime desc");

            return Success(data);
        }

        /// <summary>
        /// 根据ID查询
        /// </summary>
        /// <param name="id">主键</param>
        /// <returns></returns>
        [HttpGet]
        [Action("通知公告", ActionType.QUERY)]
        public async Task<MessageModel<SysNotice>> GetByID(int id)
        {
            return new MessageModel<SysNotice>()
            {
                msg = Resource_SysBase.OprateSuccess,
                success = true,
                data = await _sysNoticeService.QueryByIdAsync(id)
            };
        }

        /// <summary>
        /// 新增一条数据
        /// </summary>
        /// <param name="request">SysNotice</param>
        /// <returns></returns>
        [HttpPost]
        [Action("通知公告", ActionType.ADD)]
        public async Task<MessageModel<int>> Add([FromBody] SysNotice request)
        {
            var data = new MessageModel<int>();
            request.CreateBy = CurrentUser.LoginName;
            request.UpdateBy = CurrentUser.LoginName;
            request.CreateTime = DateTime.Now;
            request.UpdateTime = DateTime.Now;
            data.data = await _sysNoticeService.AddAsync(request);
            if (data.success)
            {
                data.success = true;
                data.msg = Resource_SysBase.OprateSuccess;
            }
            else
            {
                data.success = false;
                data.msg = Resource_SysBase.OprateFail;
            }

            return data;
        }

        /// <summary>
        /// 更新一条数据
        /// </summary>
        /// <param name="request">SysNotice</param>
        /// <returns></returns>
        [HttpPost]
        [Action("通知公告", ActionType.UPDATE)]
        public async Task<MessageModel<bool>> Update([FromBody] SysNotice request)
        {
            var data = new MessageModel<bool>();
            request.UpdateBy = CurrentUser.LoginName;
            request.UpdateTime = DateTime.Now;
            data.success = await _sysNoticeService.UpdateAsync(request);
            if (data.success)
            {
                data.msg = Resource_SysBase.OprateSuccess;
            }
            else
            {
                data.msg = Resource_SysBase.OprateFail;
            }

            return data;
        }

        /// <summary>
        /// 删除一条数据
        /// </summary>
        /// <param name="ids">主键</param>
        /// <returns></returns>
        [HttpPost]
        [Action("通知公告", ActionType.DEL)]
        public async Task<MessageModel<bool>> Del(List<int> ids)
        {
            var data = new MessageModel<bool>();
            data.success = await _sysNoticeService.DeleteByIdAsync(ids);
            if (data.success)
            {
                data.msg = Resource_SysBase.OprateSuccess;
            }
            else
            {
                data.msg = Resource_SysBase.OprateFail;
            }

            return data;
        }
    }
}