using Microsoft.AspNetCore.Mvc;
using NPOI.SS.Formula.Functions;
using OASystem.API.OAMethodLib.ALiYun;
using OASystem.API.OAMethodLib.ExcelOutput;
using OASystem.Domain.Common;
using OASystem.Domain.Dtos.Business;
using OASystem.Domain.Dtos.Financial;
using OASystem.Domain.Dtos.Groups;
using OASystem.Domain.Entities.Business;
using OASystem.Domain.Entities.Financial;
using OASystem.Domain.Entities.Groups;
using OASystem.Domain.Entities.Resource;
using OASystem.Domain.ViewModels.Business;
using OASystem.Domain.ViewModels.Financial;
using OASystem.Domain.ViewModels.Groups;
using OASystem.Infrastructure.Repositories.Business;
using OASystem.Infrastructure.Repositories.Groups;
using OASystem.Infrastructure.Repositories.System;
using Org.BouncyCastle.Asn1.Mozilla;

namespace OASystem.API.Controllers
{
    /// <summary>
    /// 通用业务操作
    /// </summary>
    [Route("api/[controller]/[action]")]
    public class BusinessController : ControllerBase
    {
        private readonly IMapper _mapper;
        private readonly CommonBusRepository _busRep;
        private readonly SetDataRepository _setDataRep;
        private readonly DelegationInfoRepository _groupRep;
        private readonly TeamRateRepository _teamRateRep;

        public BusinessController( IMapper mapper, CommonBusRepository busRep, SetDataRepository setDataRep, DelegationInfoRepository groupRep, TeamRateRepository teamRateRep)
        {
            _mapper = mapper;
            _busRep = busRep;
            _setDataRep = setDataRep;
            _groupRep = groupRep;
            _teamRateRep = teamRateRep;
        }

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

            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 _groupRep.GetGroupNameList(dto);
            if (groupData.Code != 0)
            {
                return Ok(JsonView(false, groupData.Msg));
            }

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

        #endregion

        #region 币种 List
        /// <summary>
        /// 币种 List
        /// </summary>
        /// <returns></returns>
        [HttpGet,HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostCurrencyList()
        {
            try
            {
                Result setData = await _setDataRep.GetSetDataBySTId(_setDataRep, 66); //币种类型
                if (setData.Code == 0)
                {
                    return Ok(JsonView(true, "查询成功", setData.Data));
                }
                else
                {
                    return Ok(JsonView(false, setData.Msg));
                }
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }
        }


        /// <summary>
        /// 团组汇率 币种 Item (来源:团组汇率)
        /// 根据 团组Id And 业务类型(CTable)Id
        /// </summary>
        /// <param name="portType"> 1 Web 2 Android 3 Ios; </param>
        /// <param name="diId"> 团组Id </param>
        /// <param name="CTbale"> CTableType Id  </param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostGroupTeamRateByDiIdAndCTableId(GeneralTeamRateInfoDto dto)
        {
            try
            {
                if (dto == null)
                {
                    return Ok(JsonView(false, "请输入参数!"));
                }

                if (dto.DiId == 0)
                {
                    return Ok(JsonView(false, "请输入正确的团组Id!"));
                }
                if (dto.CTbale == 0)
                {
                    return Ok(JsonView(false, "请输入正确的业务类型(CTable)Id!"));
                }


                if (dto.PortType == 1 || dto.PortType == 2 || dto.PortType == 3 )
                {
                    string teamRateInfoSql = string.Format(@"Select sd.Name,tr.* From Grp_TeamRate tr 
                                                     Left Join Sys_SetData  sd On sd.IsDel=0 And sd.STid=16  And tr.CTable = sd.Id 
                                                     Where tr.IsDel = 0 And tr.DiId = {0} And tr.CTable = {1}", dto.DiId,dto.CTbale);

                    var teamRateInfo = await _teamRateRep._sqlSugar.SqlQueryable<TeamRateInfoView>(teamRateInfoSql).ToListAsync();

                    #region 团组汇率

                    TeamRateModelGeneralView teamRateModels = new TeamRateModelGeneralView();


                    List<SetDataInfoView> currencyDatas = new List<SetDataInfoView>();    
                    #region 获取所有币种

                    string sql = string.Format(@"select * from Sys_SetData where STid = {0} and isdel = 0", 66);
                    var DBdata = await _setDataRep.GetListBySqlWithNolockAsync(sql);

                    if (DBdata == null || DBdata.Count == 0)
                    {
                        return Ok(JsonView(false, "所有币种获取失败!"));
                    }

                    currencyDatas = DBdata.Select(x => new SetDataInfoView
                    {
                        Name = x.Name,
                        Id = x.Id,
                        Remark = x.Remark,
                    }).ToList();

                    #endregion

                    foreach (TeamRateInfoView item in teamRateInfo)
                    {
                        TeamRateModelGeneralView teamRateModelInfo = new TeamRateModelGeneralView();

                        teamRateModelInfo.Id = item.Id;
                        teamRateModelInfo.CTableId = item.CTable;
                        teamRateModelInfo.CTableName = item.Name;
                        List<TeamRateDescAddCurrencyIdView> teamRateDescViews = new List<TeamRateDescAddCurrencyIdView>();

                        #region 拆分remark里的汇率

                        if (item.Remark.Contains("|"))
                        {
                            string[] currencyArr = item.Remark.Split("|");
                            foreach (string currency in currencyArr)
                            {
                                string[] currency1 = currency.Split(":");
                                string[] currency2 = currency1[0].Split("(");

                                string currencyCode = currency2[1].Replace(")", "").TrimEnd();
                                SetDataInfoView dataInfoView = new SetDataInfoView();
                                dataInfoView = currencyDatas.Where(it => it.Name == currencyCode).FirstOrDefault();
                                int currencyId = currencyDatas.Where(it => it.Name == currencyCode).FirstOrDefault().Id;
                                TeamRateDescAddCurrencyIdView rateDescView = new TeamRateDescAddCurrencyIdView()
                                {
                                    CurrencyId = dataInfoView.Id,
                                    CurrencyCode = currencyCode,
                                    CurrencyName = currency2[0],
                                    Rate = decimal.Parse(currency1[1]),
                                };
                                teamRateDescViews.Add(rateDescView);
                            }
                        }

                        #endregion

                        if (teamRateDescViews.Count > 0)
                        {
                            teamRateDescViews = teamRateDescViews.OrderBy(it => it.CurrencyId).ToList();
                        }

                        teamRateModelInfo.TeamRates = teamRateDescViews;
                        teamRateModels = teamRateModelInfo;
                    }

                    #endregion

                    return Ok(JsonView(true, "操作成功!", teamRateModels));

                }
                else
                {
                    return Ok(JsonView(false, "请输入正确的端口号! 1 Web 2 Android 3 Ios;"));
                }



            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, ex.Message));
            }
        }


        /// <summary>
        /// 根据团组Id币种Id及类型Id查询团组汇率
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpGet, HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostCurrencyByDiid(int DiId,int CId,int CurrencyId)
        {
            try
            {
                Result setData = await _setDataRep.PostCurrencyByDiid( DiId, CId, CurrencyId); //币种类型
                if (setData.Code == 0)
                {
                    return Ok(JsonView(true, "查询成功", setData.Data));
                }
                else
                {
                    return Ok(JsonView(false, setData.Msg));
                }
            }
            catch (Exception)
            {
                return Ok(JsonView(false, "程序错误!"));
                throw;
            }

        }
        #endregion

        #region 查询页面关联Ctable


        /// <summary>
        /// 页面关联Ctable
        /// 根据PageId 返回 CTable Id
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostPageLinkCTable(PageLinkCTableDto dto)
        {
            try
            {
                if (dto == null)
                {
                    return Ok(JsonView(false, "请求参数不能为空!"));
                }

                if (dto.PageId == 0)
                {
                    return Ok(JsonView(false, "页面Id不能为0!"));
                }

                List<CTableCorrelationPageDatas> data =  AppSettingsHelper.Get<CTableCorrelationPageDatas>("CTableCorrelationPageDatas");
                CTableCorrelationPageDatas correlationPageDatas = new CTableCorrelationPageDatas();

                foreach (var item in data)
                {
                    if (item.PageIdDatas != null)
                    {
                        var pageId = item.PageIdDatas.Where(it => it == dto.PageId).FirstOrDefault();
                        if (pageId != 0)
                        {
                            correlationPageDatas = item;
                            break;
                        }
                    }
                }

                if (correlationPageDatas.CTableId == 0)
                {
                    return Ok(JsonView(false, "您查询的页面Id,未配置AppSettings,请前往配置!"));
                }

                return Ok(JsonView(true, "操作成功",new { CTable = correlationPageDatas.CTableId }));
            }
            catch (Exception ex)
            {
                return Ok(JsonView(false, ex.Message));
            }
        }
        #endregion


        #region 会务物料单

        /// <summary>
        /// 获取会务活动列表
        /// </summary>
        /// <param name="paras"></param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostConferenceList()
        {
            List<Grp_DelegationInfo> listSource = _busRep.Query<Grp_DelegationInfo>(s => s.TeamDid == 691 && s.IsDel == 0).ToList();
            List<GroupNameView> viewList = new List<GroupNameView>();
            foreach (var group in listSource)
            {
                GroupNameView _view = new GroupNameView();
                _view.Id = group.Id;
                _view.GroupName = group.TeamName;
            }

            return Ok(JsonView(viewList));
        }

        /// <summary>
        /// 获取会务的采购物品计划清单
        /// </summary>
        /// <param name="ConfId">会务活动Id</param>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostConfItemList(int ConfId)
        {
            Bus_ConfItemListView view = new Bus_ConfItemListView();

            Bus_ConfItemListInfo _confListInfo = await _busRep.Query<Bus_ConfItemListInfo>(s => s.Diid == ConfId).FirstAsync();
            if (_confListInfo != null)
            {
                view.TotalCost = _confListInfo.TotalCost;

                string sqlItem = string.Format(@" Select c.Id,c.ItemId,d.ItemName,c.[Count],c.CurrCost,c.OpRemark
From Bus_ConfItem as c With(Nolock) 
Inner Join Res_ItemDetail as d with(Nolock) On c.ItemId=d.Id
Where c.ConfListId = {0}", ConfId);
                List<Bus_ConfItemView> confItemList = await _busRep._sqlSugar.SqlQueryable<Bus_ConfItemView>(sqlItem).ToListAsync();
                view.ItemList = new List<Bus_ConfItemView>(confItemList);
            }
            else
            {
                view.ItemList = new List<Bus_ConfItemView>();
                view.TotalCost = 0;
            }

            return Ok(JsonView(view));
        }

        /// <summary>
        /// 获取会务可采购的物料集合
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostOptionalItemList()
        {
            List<OptionalBusRangeView> result = await _busRep.GetViewList_OptionalItem();

            return Ok(JsonView(result));
        }

        /// <summary>
        /// 编辑物料采购清单
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> PostEditOptionalItemList(JsonDtoBase jsonDto)
        {
            if (string.IsNullOrEmpty(jsonDto.Paras))
            {
                return Ok(JsonView(false, "参数为空"));
            }
            Edit_OptionalItemListDto _dto = JsonConvert.DeserializeObject<Edit_OptionalItemListDto>(jsonDto.Paras);
            //Edit_OptionalItemListDto _dto = System.Text.Json.JsonSerializer.Deserialize<Edit_OptionalItemListDto>(jsonDto.Paras);

            if (_dto.DiId < 1)
            {
                return Ok(JsonView(false, "团组Id为空"));
            }

            if (_dto.ConfItemListId < 1)
            {
                //新增
                int rstInsert = await _busRep.Insert_ConfItemList(_dto);
                return Ok(JsonView(rstInsert == 0));
            }
            else
            {
                //修改
                int rstUpdate = await _busRep.Edit_ConfItemList(_dto);
                return Ok(JsonView(rstUpdate == 0));
            }

            return Ok(JsonView(false));
        }

        /// <summary>
        /// 获取会务采购物料清单Excel
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> Excel_ConfItemList(JsonDtoBase jsonDto)
        {
            if (string.IsNullOrEmpty(jsonDto.Paras))
            {
                return Ok(JsonView(false, "参数为空"));
            }

            dynamic confList = JsonConvert.DeserializeObject<dynamic>(jsonDto.Paras);
            int confListId = confList.ConfListId;
            Bus_ConfItemListInfo _entityConfList = await _busRep.Query<Bus_ConfItemListInfo>(s => s.Id == confListId).FirstAsync();
            if (_entityConfList != null)
            {
                string result = new Excel_BusConfItemList().Excel(_entityConfList);


            }
            else
            {
                return Ok(JsonView(false, "请先保存数据"));
            }

            return Ok(JsonView(false));
        }

        #endregion

        #region 阿里云短信测试

        /// <summary>
        /// 编辑物料采购清单
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
        public async Task<IActionResult> AliMessageTest(string mobile)
        {

            string add2dayZH = DateTime.Now.AddDays(2).ToString("yyyy年MM月dd日");
            string templateParam = JsonConvert.SerializeObject(new { teams = "测试团组", date = add2dayZH });
            AliMessagePost.PostMessage(mobile, "泛美国际团组", "SMS_461575447", templateParam);
            return Ok(JsonView(true));
        }

        #endregion
    }
}