using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Znyc.Admin.AspNetCore.Controllers;
using Znyc.Admin.AspNetCore.Entitys;
using Znyc.Admin.AspNetCore.Mvc;
using Znyc.Admin.Commons.Entitys;
using Znyc.Admin.Commons.Mapping;
using Znyc.Admin.Commons.Pages;
using Znyc.Admin.Security.Dtos;
using Znyc.Admin.Security.Entitys;
using Znyc.Admin.Security.IServices;

namespace Znyc.Admin.WebApi.Controllers
{
    /// <summary>
    /// 车辆
    /// </summary>
    [ApiController]
    [Route("api/Security/[controller]")]
    public class VehicleController : AreaApiController<Vehicle, VehicleOutputDto, VehicleInPutDto, IVehicleService, long>
    {
        private readonly IVehicleService _vehicleServices;

        /// <summary>
        /// 构造函数
        /// </summary>
        public VehicleController(
            IVehicleService vehicleServices
        ) : base(vehicleServices)
        {
            _vehicleServices = vehicleServices;
        }

        /// <summary>
        /// 新增前处理数据
        /// </summary>
        /// <param name="info"></param>
        protected override void OnBeforeInsert(Vehicle info)
        {
            info.Id = 0;
            info.CreatedTime = DateTime.Now;
            info.CreatedUserId = CurrentUser.UserId;
            info.IsDeleted = false;
        }

        /// <summary>
        /// 在更新数据前对数据的修改操作
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        protected override void OnBeforeUpdate(Vehicle info)
        {
            info.CreatedUserId = CurrentUser.UserId;
            info.ModifiedUserId = CurrentUser.UserId;
            info.ModifiedTime = DateTime.Now;
        }

        /// <summary>
        /// 在软删除数据前对数据的修改操作
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        protected override void OnBeforeSoftDelete(Vehicle info)
        {
            info.IsDeleted = true;
        }

        /// <summary>
        /// 异步分页查询
        /// </summary>
        /// <param name="search"></param>
        /// <returns></returns>
        [HttpPost("FindWithPagerSearchAsync")]
        [FunctionAuthorize("List")]
        public async Task<IActionResult> FindWithPagerSearchAsync(SearchVehicleModel search)
        {
            CommonResult<PageResult<VehicleOutputDto>> result = new CommonResult<PageResult<VehicleOutputDto>>
            {
                ResData = await _vehicleServices.FindWithPagerSearchAsync(search),
                ErrCode = ErrCode.successCode
            };
            return ToJsonContent(result);
        }

        /// <summary>
        ///     异步新增数据
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("InsertAsync")]
        [FunctionAuthorize("Add")]
        public new async Task<IActionResult> InsertAsync(VehicleInPutDto input)
        {
            CommonResult result = new CommonResult();
            Vehicle vehicle = input.MapTo<Vehicle>();
            OnBeforeInsert(vehicle);
            result = await _vehicleServices.InsertAsync(vehicle);

            if (result.Success)
            {
                result.ErrCode = ErrCode.successCode;
                result.ErrMsg = ErrCode.err0;
            }
            else
            {
                result.ErrMsg = result.ErrMsg;
                result.ErrCode = "43002";
            }
            return ToJsonContent(result);
        }

        /// <summary>
        /// 异步更新数据
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("UpdateAsync")]
        [FunctionAuthorize("Edit")]
        public async Task<IActionResult> UpdateAsync(VehicleUpdateInPutDto input)
        {
            CommonResult result = new CommonResult();
            Vehicle vehicle = input.MapTo<Vehicle>();
            OnBeforeUpdate(vehicle);
            vehicle.Id = input.Id;
            result = await _vehicleServices.UpdateAsync(vehicle);
            if (result.Success)
            {
                result.ErrCode = ErrCode.successCode;
                result.ErrMsg = ErrCode.err0;
            }
            else
            {
                result.ErrMsg = result.ErrMsg;
                result.ErrCode = "43002";
            }

            return ToJsonContent(result);
        }

        /// <summary>
        /// 修改车辆状态
        /// </summary>
        /// <param name="id"></param>
        /// <param name="status"></param>
        /// <returns></returns>
        [HttpPut("UpdateStatusAsync")]
        [FunctionAuthorize("")]
        public async Task<IActionResult> UpdateStatusAsync(long id, int status)
        {
            CommonResult result = new CommonResult();
            result = await _vehicleServices.UpdateStatusAsync(id, status);
            if (result.Success)
            {
                result.ErrCode = ErrCode.successCode;
                result.ErrMsg = ErrCode.err0;
            }
            else
            {
                result.ErrMsg = ErrCode.err43002;
                result.ErrCode = "43002";
            }
            return ToJsonContent(result);
        }

        /// <summary>
        /// 修改车辆是否激活
        /// </summary>
        /// <param name="id"></param>
        /// <param name="isActivate"></param>
        /// <returns></returns>
        [HttpPut("UpdateIsActivateAsync")]
        [FunctionAuthorize("")]
        public async Task<IActionResult> UpdateIsActivateAsync(long id, bool isActivate)
        {
            CommonResult result = new CommonResult();
            result = await _vehicleServices.UpdateIsActivateAsync(id, isActivate);
            if (result.Success)
            {
                result.ErrCode = ErrCode.successCode;
                result.ErrMsg = ErrCode.err0;
            }
            else
            {
                result.ErrMsg = ErrCode.err43002;
                result.ErrCode = "43002";
            }
            return ToJsonContent(result);
        }

        /// <summary>
        /// 修改车辆是否开启GPS
        /// </summary>
        /// <param name="id"></param>
        /// <param name="isGps"></param>
        /// <returns></returns>
        [HttpPut("UpdateIsGpsAsync")]
        [FunctionAuthorize("")]
        public async Task<IActionResult> UpdateIsGpsAsync(long id, bool isGps)
        {
            CommonResult result = new CommonResult();
            result = await _vehicleServices.UpdateIsGpsAsync(id, isGps);
            if (result.Success)
            {
                result.ErrCode = ErrCode.successCode;
                result.ErrMsg = ErrCode.err0;
            }
            else
            {
                result.ErrMsg = ErrCode.err43002;
                result.ErrCode = "43002";
            }
            return ToJsonContent(result);
        }
    }
}