using NetTaste;
using System.Drawing.Printing;

namespace OASystem.API.Controllers
{
    /// <summary>
    /// 资料相关
    /// </summary>
    //[Authorize]
    [Route("api/[controller]/[action]")]
    public class ResourceController : ControllerBase
    {
        private readonly IMapper _mapper;
        private readonly IConfiguration _config;
        private readonly CarDataRepository _carDataRep;
        private readonly LocalGuideDataRepository _localGuideDataRep;
        private readonly ThreeCodeRepository _ThreeCodeRep;
        private readonly HotelDataRepository _hotelDataRep;

        public ResourceController(IMapper mapper, IConfiguration config, CarDataRepository carDataRep, LocalGuideDataRepository localGuideDataRep, ThreeCodeRepository threeCodeRep, HotelDataRepository hotelDataRep)
        {
            _mapper = mapper;
            _config = config;
            _carDataRep = carDataRep;
            _localGuideDataRep = localGuideDataRep;
            _ThreeCodeRep = threeCodeRep;
            _hotelDataRep = hotelDataRep;
        }
        #region 车公司资料板块

        /// <summary>
        /// 车公司信息查询
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> QuertCarData(DtoBase dto)
        {
            try
            {
                if (dto.PortType==1)
                {
                    var carDada = _carDataRep.QueryDto<Res_CarData, CarDataView>().ToList();
                    if (carDada.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    carDada = carDada.OrderByDescending(s => s.CreateTime).ToList();
                    return Ok(JsonView(true, "查询成功", carDada));
                }
                else if(dto.PortType==2)
                {
                    var carDada = _carDataRep.QueryDto<Res_CarData, CarDataView>().ToList();
                    if (carDada.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    carDada=carDada.OrderByDescending(s=>s.CreateTime).ToList();
                    return Ok(JsonView(true, "查询成功", carDada));
                }
                else
                {
                    return Ok(JsonView(false, "请传入PortType参数!1:Web,2:Android,3:IOS"));
                }
               
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
           
            
        }

        /// <summary>
        /// 车公司信息添加
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> AddCarData(AddCarDataDto dto)
        {
            try
            {
                if (dto.UnitArea == "")
                {
                    return Ok(JsonView(false, "请检查单位区域是否填写!"));
                }
                if (dto.UnitName == "")
                {
                    return Ok(JsonView(false, "请检查单位名称是否填写!"));
                }
                if (dto.Contact == "")
                {
                    return Ok(JsonView(false, "请检查单位联系人是否填写!"));
                }
                if (dto.ContactTel == "")
                {
                    return Ok(JsonView(false, "请检查联系方式是否填写正确!"));
                }

                var carDada = _carDataRep.QueryDto<Res_CarData, CarDataView>(a=>a.UnitArea==dto.UnitArea && a.UnitName==dto.UnitName && a.Contact==dto.Contact && a.ContactTel==dto.ContactTel).ToList();
                if (carDada.Count!=0)
                {
                    return Ok(JsonView(false, "该信息已存在,请勿重复添加!"));
                }
                Res_CarData _CarData = _mapper.Map<Res_CarData>(dto);
                int id = await _carDataRep.AddAsyncReturnId(_CarData);
                if (id == 0) 
                {
                    return Ok(JsonView(false, "添加失败!"));
                }
                return Ok(JsonView(true, "添加成功", new { Id = id }));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }

        /// <summary>
        /// 车公司信息修改
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> UpCarData(UpCarDataDto dto)
        {
            try
            {
                if (dto.UnitArea == "")
                {
                    return Ok(JsonView(false, "请检查单位区域是否填写!"));
                }
                if (dto.UnitName == "")
                {
                    return Ok(JsonView(false, "请检查单位名称是否填写!"));
                }
                if (dto.Contact == "")
                {
                    return Ok(JsonView(false, "请检查单位联系人是否填写!"));
                }
                if (dto.ContactTel == "")
                {
                    return Ok(JsonView(false, "请检查联系方式是否填写正确!"));
                }
                bool res = await _carDataRep.UpdateAsync(a => a.Id == dto.Id, a => new Res_CarData
                {
                    UnitArea = dto.UnitArea,
                    UnitName = dto.UnitName,
                    Address = dto.Address,
                    Contact = dto.Contact,
                    ContactTel = dto.ContactTel,
                    ContactEmail = dto.ContactEmail,
                    ContactFax = dto.ContactFax,
                    CarDes = dto.CarDes,
                    CarPicPaths = dto.CarPicPaths,
                    OtherInfo = dto.OtherInfo,
                    Score = dto.Score,
                    QualificationScore = dto.QualificationScore,
                    CarAgeScore = dto.CarAgeScore,
                    CleanImgScore = dto.CleanImgScore,
                    SmellScore = dto.SmellScore,
                    WaterPaperScore = dto.WaterPaperScore,
                    HardwareScore = dto.HardwareScore,
                    TimeScore = dto.TimeScore,
                    SafetyScore = dto.SafetyScore,
                    DrivingAgeScore = dto.DrivingAgeScore,
                    Remark = dto.Remark,
                });
                if (!res) { return Ok(JsonView(false, "修改失败!")); }
                return Ok(JsonView(true, "修改成功"));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }
        /// <summary>
        /// 车公司信息删除
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> DelCarData(DelCarDataDto dto)
        {
            try
            {
                bool res = await _carDataRep.SoftDeleteByIdAsync<Res_CarData>(dto.Id.ToString(), dto.DeleteUserId);
                if (!res) { return Ok(JsonView(false, "删除失败!")); }
                return Ok(JsonView(true, "删除成功"));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }
        #endregion

        #region 导游地接资料板块
        /// <summary>
        /// 导游地接资料查询
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> QueryLocalGuide(DtoBase dto)
        {
            try
            {
                if (dto.PortType == 1)
                {
                    var LocalGuideData = _localGuideDataRep.QueryDto<Res_LocalGuideData, LocalGuideDataView>().ToList();
                    if (LocalGuideData.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    LocalGuideData = LocalGuideData.OrderByDescending(s => s.CreateTime).ToList();
                    return Ok(JsonView(true, "查询成功", LocalGuideData));
                }
                else if (dto.PortType == 2)
                {
                    var LocalGuideData = _localGuideDataRep.QueryDto<Res_LocalGuideData, LocalGuideDataView>().ToList();
                    if (LocalGuideData.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    LocalGuideData = LocalGuideData.OrderByDescending(s => s.CreateTime).ToList();
                    return Ok(JsonView(true, "查询成功", LocalGuideData));
                }
                else
                {
                    return Ok(JsonView(false, "请传入PortType参数!1:Web,2:Android,3:IOS"));
                }

            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }


        }

        /// <summary>
        /// 导游地接信息操作(Status:1.新增,2.修改)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> OperationLocalGuide(LocalGuideOperationDto dto)
        {
            try
            {
                if (dto.UnitArea == "")
                {
                    return Ok(JsonView(false, "请检查单位区域是否填写!"));
                }
                if (dto.UnitName == "")
                {
                    return Ok(JsonView(false, "请检查单位名称是否填写!"));
                }
                if (dto.Contact == "")
                {
                    return Ok(JsonView(false, "请检查单位联系人是否填写!"));
                }
                if (dto.ContactTel == "")
                {
                    return Ok(JsonView(false, "请检查联系方式是否填写正确!"));
                }

                Result result = await _localGuideDataRep.LocalGuideOperation(dto);
                if (result.Code != 0)
                {
                    return Ok(JsonView(false, result.Msg));
                }
                return Ok(JsonView(true, result.Msg));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }

        /// <summary>
        /// 导游地接信息操作(删除)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> DelLocalGuide(LocalGuideDelDto dto)
        {
            try
            {
                var res = await _localGuideDataRep.SoftDeleteByIdAsync<Res_LocalGuideData>(dto.Id.ToString(),dto.DeleteUserId);
                if (!res)
                {
                    return Ok(JsonView(false, "删除失败"));
                }
                return Ok(JsonView(true,"删除成功!"));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }
        #endregion

        #region 机场三字码信息
        /// <summary>
        /// 机场三字码查询
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> QueryThreeCode(DtoBase dto)
        {
            try
            {
                if (dto.PortType == 1)
                {
                    var ThreeCode = _localGuideDataRep.QueryDto<Res_ThreeCode, ThreeCodeView>().ToList();
                    if (ThreeCode.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    ThreeCode = ThreeCode.OrderByDescending(s => s.CreateTime).ToList();
                    return Ok(JsonView(true, "查询成功", ThreeCode));
                }
                else if (dto.PortType == 2)
                {
                    //分页写法
                    if (dto.PageIndex==0 || dto.PageSize==0)
                    {
                        return Ok(JsonView(false, "请传入PageIndex和PageSize参数"));
                    }
                    JsonView _ThreeCode = await _ThreeCodeRep.QuerThreeCode(dto.PageIndex, dto.PageSize);
                    if (_ThreeCode.Code != 0)
                    {
                        return Ok(JsonView(false, _ThreeCode.Msg));
                    }

                    return Ok(_ThreeCode);
                }
                else
                {
                    return Ok(JsonView(false, "请传入PortType参数!1:Web,2:Android,3:IOS"));
                }

            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }


        }

        /// <summary>
        /// 机场三字码资料操作(Status:1.新增,2.修改)
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> OperationThreeCode(ThreeCodeOperationDto dto)
        {
            try
            {
                if (dto.Three == "")
                {
                    return Ok(JsonView(false, "请检查三字码是否填写!"));
                }
                if (dto.Country == "")
                {
                    return Ok(JsonView(false, "请检查国家是否填写!"));
                }
                if (dto.City == "")
                {
                    return Ok(JsonView(false, "请检查城市是否填写正确!"));
                }
                if (dto.AirPort == "")
                {
                    return Ok(JsonView(false, "请检查机场是否填写正确!"));
                }

                Result result = await _ThreeCodeRep.ThreeCodeOperation(dto);
                if (result.Code != 0)
                {
                    return Ok(JsonView(false, result.Msg));
                }
                return Ok(JsonView(true, result.Msg));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }

        /// <summary>
        /// 机场三字码资料操作(删除)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> DelThreeCode(ThreeCodeDelDto dto)
        {
            try
            {
                var res = await _ThreeCodeRep.SoftDeleteByIdAsync<Res_ThreeCode>(dto.Id.ToString(), dto.DeleteUserId);
                if (!res)
                {
                    return Ok(JsonView(false, "删除失败"));
                }
                return Ok(JsonView(true, "删除成功!"));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }
        #endregion

        #region 酒店资料数据
        /// <summary>
        /// 酒店信息查询
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> QueryHotelData(DtoBase dto)
        {
            try
            {
                if (dto.PortType == 1)
                {
                    var HotelData = _localGuideDataRep.QueryDto<Res_HotelData, HotelDataView>().ToList();
                    if (HotelData.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    HotelData = HotelData.OrderByDescending(s => s.CreateTime).ToList();
                    return Ok(JsonView(true, "查询成功", HotelData));
                }
                else if (dto.PortType == 2)
                {
                    var HotelData = _localGuideDataRep.QueryDto<Res_HotelData, HotelDataView>().ToList();
                    if (HotelData.Count == 0)
                    {
                        return Ok(JsonView(false, "暂无数据!"));
                    }
                    HotelData = HotelData.OrderByDescending(s => s.CreateTime).ToList();
                    return Ok(JsonView(true, "查询成功", HotelData));
                }
                else
                {
                    return Ok(JsonView(false, "请传入PortType参数!1:Web,2:Android,3:IOS"));
                }

            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }


        }

        /// <summary>
        /// 酒店资料操作(Status:1.新增,2.修改)
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> OperationHotelData(OperationHotelData dto)
        {
            try
            {
                if (dto.City == "")
                {
                    return Ok(JsonView(false, "请检查酒店所在城市是否填写!"));
                }
                if (dto.Name == "")
                {
                    return Ok(JsonView(false, "请检查酒店名称是否填写!"));
                }
                if (dto.Address == "")
                {
                    return Ok(JsonView(false, "请检查酒店地址是否填写正确!"));
                }
                if (dto.Tel == "")
                {
                    return Ok(JsonView(false, "请检查酒店联系方式是否填写正确!"));
                }

                Result result = await _hotelDataRep.OperationHotelData(dto);
                if (result.Code != 0)
                {
                    return Ok(JsonView(false, result.Msg));
                }
                return Ok(JsonView(true, result.Msg));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }

        /// <summary>
        /// 酒店资料操作(删除)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> DelHotelData(DelHotelDataDto dto)
        {
            try
            {
                var res = await _ThreeCodeRep.SoftDeleteByIdAsync<Res_HotelData>(dto.Id.ToString(), dto.DeleteUserId);
                if (!res)
                {
                    return Ok(JsonView(false, "删除失败"));
                }
                return Ok(JsonView(true, "删除成功!"));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }
        #endregion
    }
}