using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Serialization;
using OASystem.API.OAMethodLib;
using OASystem.Domain.Dtos.Groups;
using OASystem.Domain.Entities.Groups;
using OASystem.Domain.ViewModels.Groups;
using OASystem.Infrastructure.Repositories.Groups;

namespace OASystem.API.Controllers
{
    /// <summary>
    /// 团组相关
    /// </summary>
    //[Authorize]
    [Route("api/[controller]/[action]")]
    public class GroupsController : ControllerBase
    {
        private readonly GrpScheduleRepository _grpScheduleRep;
        private readonly IMapper _mapper;
        private readonly DelegationInfoRepository _groupRepository;

        public GroupsController(IMapper mapper, GrpScheduleRepository grpScheduleRep, DelegationInfoRepository groupRepository)
        {
            _mapper = mapper;
            _grpScheduleRep = grpScheduleRep;
            _groupRepository = groupRepository;
        }

        #region 流程管控

        /// <summary>
        /// 获取团组流程管控信息
        /// </summary>
        /// <param name="paras">参数Json字符串</param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostSearchGrpSchedule(JsonDtoBase _jsonDto)
        {
            if (string.IsNullOrEmpty(_jsonDto.Paras))
            {
                return Ok(JsonView(false, "参数为空"));
            }

            Grp_ScheduleDto _ScheduleDto = JsonConvert.DeserializeObject<Grp_ScheduleDto>(_jsonDto.Paras);
            if (_ScheduleDto != null)
            {
                if (_ScheduleDto.SearchType == 2)//获取列表
                {
                    List<Grp_ScheduleView> _grpScheduleViewList = await _grpScheduleRep.GetViewList_GrpSchedule(_ScheduleDto);
                    return Ok(JsonView(_grpScheduleViewList));
                }
                else//获取对象
                {
                    Grp_ScheduleCombinView _grpScheduleView = await _grpScheduleRep.GetView_GrpSchedule(_ScheduleDto);
                    if (_grpScheduleView != null)
                    {
                        return Ok(JsonView(_grpScheduleView));
                    }
                }
            }
            else
            {
                return Ok(JsonView(false, "参数反序列化失败"));
            }

            return Ok(JsonView(false, "暂无数据!"));
        }

        /// <summary>
        /// 修改团组流程管控详细表数据
        /// </summary>
        /// <param name="paras"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostUpdateGrpScheduleDetail(Grp_ScheduleDetailUpdDto dto)
        {
            Grp_ScheduleDetailInfo _detail = _mapper.Map<Grp_ScheduleDetailInfo>(dto);
            var result = await _grpScheduleRep._sqlSugar.Updateable<Grp_ScheduleDetailInfo>()
                .SetColumns(it => it.Duty == _detail.Duty)
                .SetColumns(it => it.ExpectBeginDt == _detail.ExpectBeginDt)
                .SetColumns(it => it.ExpectEndDt == _detail.ExpectEndDt)
                .SetColumns(it => it.JobContent == _detail.JobContent)
                .SetColumns(it => it.Remark == _detail.Remark)
                .SetColumns(it => it.StepStatus == _detail.StepStatus)
                .Where(s => s.Id == dto.Id)

                //.UpdateColumns(s => new { s.Duty, s.ExpectBeginDt, s.ExpectEndDt, s.JobContent, s.Remark, s.StepStatus })
                .ExecuteCommandAsync();
            if (result > 0)
            {
                return Ok(JsonView(true, "保存成功!"));
            }

            return Ok(JsonView(false, "保存失败!"));
        }

        /// <summary>
        /// 删除团组流程管控详细表数据,删除人Id请放在Duty
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<ActionResult> PostDeleteGrpScheduleDetail(Grp_ScheduleDetailUpdDto dto)
        {
            Grp_ScheduleDetailInfo _detail = _mapper.Map<Grp_ScheduleDetailInfo>(dto);
            _detail.IsDel = 1;
            _detail.DeleteUserId = dto.Duty;
            _detail.DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            var result = await _grpScheduleRep._sqlSugar.Updateable<Grp_ScheduleDetailInfo>()
               .SetColumns(it => it.IsDel == _detail.IsDel)
               .SetColumns(it => it.DeleteUserId == _detail.DeleteUserId)
               .SetColumns(it => it.DeleteTime == _detail.DeleteTime)
               .Where(it => it.Id == dto.Id)

               //.UpdateColumns(s => new { s.IsDel, s.DeleteUserId, s.DeleteTime })
               //.WhereColumns(s => s.Id == dto.Id)
               .ExecuteCommandAsync();
            if (result > 0)
            {
                return Ok(JsonView(true, "删除成功!"));
            }

            return Ok(JsonView(false, "删除失败!"));
        }

        /// <summary>
        /// 增加团组流程管控详细表数据
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<ActionResult> PostInsertGrpScheduleDetail(Grp_ScheduleDetailInsertDto dto)
        {
            Grp_ScheduleDetailInfo _detail = _mapper.Map<Grp_ScheduleDetailInfo>(dto);
            if (DateTime.Now < _detail.ExpectBeginDt)
            {
                _detail.StepStatus = 0;
            }
            else
            {//若大于设置时间,不考虑设置的预计结束日期,统一视为进行中
                _detail.StepStatus = 1;
            }
            var result = await _grpScheduleRep._sqlSugar.Insertable(_detail).ExecuteReturnIdentityAsync();
            if (result > 0)
            {
                return Ok(JsonView(true, "添加成功!"));
            }

            return Ok(JsonView(false, "添加失败!"));
        }

        #endregion

        #region 团组基本信息

        /// <summary>
        ///  接团信息列表
        /// </summary>
        /// <param name="dto">团组列表请求dto</param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetGroupList(GroupListDto dto)
        {
            var groupData = await _groupRepository.GetGroupList(dto);
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }

            return Ok(JsonView(groupData.Data));
        }

        /// <summary>
        ///  接团信息详情
        /// </summary>
        /// <param name="dto">团组info请求dto</param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetGroupInfo(GroupInfoDto dto)
        {
            var groupData = await _groupRepository.GetGroupInfo(dto);
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }

            return Ok(JsonView(groupData.Data));
        }

        /// <summary>
        /// 接团信息 编辑添加
        /// 基础信息数据源
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GroupEditBasicSource(GroupListDto dto)
        {

            var groupData = await _groupRepository.GroupEditBasicSource(dto);
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }
            return Ok(JsonView(groupData.Data));

        }

        /// <summary>
        /// 接团信息 操作(增改)
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GroupOperation(GroupOperationDto dto)
        {
            try
            {
                var groupData = await _groupRepository.GroupOperation(dto);
                if (groupData.Code != 0)
                {
                    return Ok(JsonView(false, groupData.Msg));
                }

                return Ok(JsonView(true));
            }
            catch (Exception ex)
            {

                Logs("[response]" + JsonConvert.SerializeObject(dto));
                Logs(ex.Message);
                return Ok(JsonView(false, ex.Message));
            }
        }

        /// <summary>
        /// 接团信息 操作(删除)
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GroupDel(GroupDelDto dto)
        {
            try
            {
                var groupData = await _groupRepository.GroupDel(dto);
                if (groupData.Code != 0)
                {
                    return Ok(JsonView(false, groupData.Msg));
                }

                return Ok(JsonView(true));
            }
            catch (Exception ex)
            {

                Logs("[response]" + JsonConvert.SerializeObject(dto));
                Logs(ex.Message);
                return Ok(JsonView(false, ex.Message));
            }
        }

        /// <summary>
        /// 获取团组销售报价号
        /// 团组添加时 使用
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetGroupSalesQuoteNo()
        {
            var groupData = await _groupRepository.GetGroupSalesQuoteNo();
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }
            object salesQuoteNo = new
            {
                SalesQuoteNo = groupData.Data
            };

            return Ok(JsonView(salesQuoteNo));
        }

        /// <summary>
        /// 设置确认出团
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> SetConfirmationGroup(ConfirmationGroupDto dto)
        {
            var groupData = await _groupRepository.ConfirmationGroup(dto);
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }

            GroupStepForDelegation.CreateWorkStep(dto.GroupId); //创建管控流程

            return Ok(JsonView(groupData.Data));
        }

        /// <summary>
        /// 获取团组名称 List
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetGroupNameList(GroupNameDto dto)
        {
            var groupData = await _groupRepository.GetGroupNameList(dto);
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }

            return Ok(JsonView(groupData.Data, groupData.Data.Count));
        }

        /// <summary>
        /// 获取团组名称data  And 签证国别Data
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetGroupNameAndVisaNationality(GroupNameDto dto)
        {
            var groupData = await _groupRepository.GetGroupNameAndVisaNationality(dto);
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }


            return Ok(JsonView(groupData.Data));
        }

        #endregion

        #region 团组&签证

        /// <summary>
        ///  根据团组Id获取签证客户信息List
        /// </summary>
        /// <param name="dto">请求dto</param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetCrmByGroupId(ClientByGroupIdDto dto)
        {
            var groupData = await _groupRepository.GetCrmByGroupId(dto);
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }

            return Ok(JsonView(groupData.Data));
        }



        #endregion
    }
}