using Ewide.NbzsZheliban.Entity;
using Ewide.NbzsZheliban.Entity.Base;
using Ewide.NbzsZheliban.Entity.Extends;
using Ewide.NbzsZheliban.Tools;
using Furion;
using Furion.DataEncryption;
using Furion.FriendlyException;
using Furion.JsonSerialization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ewide.NbzsZheliban.Service
{
    [ApiDescriptionSettings(Name = "数据接口")]
    public class DataService : Furion.DynamicApiController.IDynamicApiController///: BaseService
    {
        private readonly ISqlSugarRepository repository;
        private readonly SqlSugarClient db;
        private readonly IJsonSerializerProvider _jsonSerializer;
        public DataService(ISqlSugarRepository sqlSugarRepository, IJsonSerializerProvider jsonSerializer)
        {
            repository = sqlSugarRepository;
            db = repository.Context;
            _jsonSerializer = jsonSerializer;
        }
        /// <summary>
        /// 被征收人关联的项目列表
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        [HttpPost("/project/list")]
        [Microsoft.AspNetCore.Authorization.AllowAnonymous]
        public async Task<dynamic> PrjList([FromBody] JObject args)
        {
            #region 票据
            var ticket = args.GetJsonValue("ticket", isThrowExp: true);
            //var ticket = Request.Query["ticket"];
            if (!string.IsNullOrWhiteSpace(ticket))
            {
                var time = DateTime.Now.ToString("yyyyMMddHHmmss");
                var servicecode = App.Configuration["zlb_setting:servicecode"];
                var servicepwd = App.Configuration["zlb_setting:servicepwd"];
                var sign = MD5Encryption.Encrypt(servicecode + servicepwd + time);
                var datatype = "json";
                var url = App.Configuration["zlb_setting:ticket_url"]
                    .Replace("{servicecode}", servicecode)
                    .Replace("{time}", time)
                    .Replace("{sign}", sign)
                    .Replace("{ticket}", ticket)
                    .Replace("{datatype}", datatype)
                    ;
                var tickerRsltStr = Ewide.NbzsZheliban.Tools.HttpHelper.CallUrl(url, "");
                JObject ticketObj = null;
                try
                {
                    ticketObj = JObject.Parse(tickerRsltStr);
                }
                catch (Newtonsoft.Json.JsonReaderException)
                {
                    throw Oops.Oh($"ticket接口返回值有误,[{tickerRsltStr}]");
                }
                if (ticketObj["result"].Value<int>() != 0)
                    throw Oops.Oh($"ticket接口返回值有误,[{tickerRsltStr}]");
                time = DateTime.Now.ToString("yyyyMMddHHmmss");
                sign = MD5Encryption.Encrypt(servicecode + servicepwd + time);
                url = App.Configuration["zlb_setting:token_url"]
                    .Replace("{servicecode}", servicecode)
                    .Replace("{time}", time)
                    .Replace("{sign}", sign)
                    .Replace("{token}", ticketObj["token"].ToString())
                    .Replace("{datatype}", datatype)
                    ;
                var userinfoRsltStr = Ewide.NbzsZheliban.Tools.HttpHelper.CallUrl(url, "");
                JObject userinfoObj = null;
                try
                {
                    userinfoObj = JObject.Parse(userinfoRsltStr);
                }
                catch (Newtonsoft.Json.JsonReaderException)
                {
                    throw Oops.Oh($"token接口返回值有误,[{tickerRsltStr}]");
                }
                if (userinfoObj["result"].Value<int>() != 0)
                    throw Oops.Oh($"ticket接口返回值有误,[{tickerRsltStr}]");
                var cardno = userinfoObj["idnum"].ToString();
                var username = userinfoObj["username"].ToString();

                #endregion
                //var cardno = args.GetJsonValue("cardno", isThrowExp: true);
                //住宅调查表
                var list_zz_dcb = await db.Ado.SqlQueryAsync<Dcbs>("select ID dcbId,ProjectId PrjId from InvestigateTable b where b.ExpropriatedCardNo=@ExpropriatedCardNo", new List<SugarParameter> { new SugarParameter("ExpropriatedCardNo", cardno, System.Data.DbType.String) }.ToArray());
                //非住宅调查表
                var list_fzz_dcb = await db.Ado.SqlQueryAsync<Dcbs>("select ID dcbId,ProjectId PrjId from NonResidentialInvestigateTable b where b.PropertyRightCardNo=@ExpropriatedCardNo", new List<SugarParameter> { new SugarParameter("ExpropriatedCardNo", cardno, System.Data.DbType.String) }.ToArray());
                //调查表集合
                var list_dcbs = list_zz_dcb.Concat(list_fzz_dcb);
                //项目列表
                var list_projects = await db.Ado.SqlQueryAsync<H5IndexPrjModel>("select a.ID Prjid,a.area,a.HouseAcquisitionDepartment as zsbm,a.CollectDecisionNo1 as year,(isnull(a.CollectDecisionNoHeadName,'')+'['+cast(a.CollectDecisionNo1 as varchar)+']'+ isnull(cast(a.CollectDecisionNo2 as varchar),'')+'号') zsjdh,dbo.get_current_state(a.ID) CurrentState from Projects a where ID in ('" + string.Join("','", list_dcbs.Select(p => p.PrjId)) + "') ");
                //分户评估
                var InvestigateTableID_param = "'" + string.Join("','", list_dcbs.Select(p => p.dcbId)) + "'";
                var list_fhpgs = await db.Ado.SqlQueryAsync<Fhpgs>("select   e.ProjectId as PrjId ,d.AssessmentNo,e.HouseAddress,d.countValue from InvestigateTable_Assessment d inner join InvestigateTable e on d.InvestigateTableId=e.ID where d.InvestigateTableID in ( " + InvestigateTableID_param + " ) union all select e.ProjectId as PrjId ,AssessmentNo, e.HouseAddress, d.countValue from NonInvestigateTable_Assessment d inner join NonResidentialInvestigateTable e on d.NonInvestigateTableID = e.ID where d.NonInvestigateTableID in ( " + InvestigateTableID_param + " ) ;");
                //补偿协议 
                var list_bcxys = await db.Ado.SqlQueryAsync<Bcxy>("select isnull(d.CollectDecisionNoHeadName,'')+isnull(d.No1,'')+'-'+isnull(d.No2,'')+(case when (d.No3 is null or d.No3 = '') then '' else ('-'+d.No3) end ) XyNo,d.SwitchProductionWay,e.HouseAddress,d.SummationShouldCompensateMoney,e.ProjectId as PrjId from ResidentialAgreement d inner join InvestigateTable e on d.InvestigateTableId=e.ID where d.InvestigateTableID in ( " + InvestigateTableID_param + " ) union all select isnull(d.CollectDecisionNoHeadName, '') + isnull(d.No2, '') + '-' + isnull(d.No3, '') XyNo , d.SwitchProductionWay, e.HouseAddress, d.SummationShouldCompensateMoney, e.ProjectId as PrjId from NonResidentialAgreement d inner join NonResidentialInvestigateTable e on d.NonInvestigateTableID = e.ID where d.NonInvestigateTableID in ( " + InvestigateTableID_param + " ); ");

                list_projects.ForEach(p =>
                {
                    p.FhpgList = list_fhpgs.Where(a => a.PrjId == p.PrjId);
                    p.BcxyList = list_bcxys.Where(a => a.PrjId == p.PrjId);
                });
                H5IndexModel h5IndexModel = new()
                {
                    PrjList = list_projects,
                    IdCard = cardno,
                    UserName = username
                };
                return h5IndexModel;
            }
            else
            {
                throw Oops.Oh("无效访问");
            }
        }
        /// <summary>
        /// 被征收人关联的项目列表
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        [HttpPost("/project/list2")]
        [Microsoft.AspNetCore.Authorization.AllowAnonymous]
        public async Task<dynamic> PrjList2([FromBody] JObject args)
        {
            var cardno = "341203199206303411";
            var username = "张三丰";

            //var cardno = args.GetJsonValue("cardno", isThrowExp: true);
            //住宅调查表
            var list_zz_dcb = await db.Ado.SqlQueryAsync<Dcbs>("select ID dcbId,ProjectId PrjId from InvestigateTable b where b.ExpropriatedCardNo=@ExpropriatedCardNo", new List<SugarParameter> { new SugarParameter("ExpropriatedCardNo", cardno, System.Data.DbType.String) }.ToArray());
            //非住宅调查表
            var list_fzz_dcb = await db.Ado.SqlQueryAsync<Dcbs>("select ID dcbId,ProjectId PrjId from NonResidentialInvestigateTable b where b.PropertyRightCardNo=@ExpropriatedCardNo", new List<SugarParameter> { new SugarParameter("ExpropriatedCardNo", cardno, System.Data.DbType.String) }.ToArray());
            //调查表集合
            var list_dcbs = list_zz_dcb.Concat(list_fzz_dcb);
            //项目列表
            var list_projects = await db.Ado.SqlQueryAsync<H5IndexPrjModel>("select a.ID Prjid,a.area,a.HouseAcquisitionDepartment as zsbm,a.CollectDecisionNo1 as year,(isnull(a.CollectDecisionNoHeadName,'')+'['+cast(a.CollectDecisionNo1 as varchar)+']'+ isnull(cast(a.CollectDecisionNo2 as varchar),'')+'号') zsjdh,dbo.get_current_state(a.ID) CurrentState from Projects a where ID in ('" + string.Join("','", list_dcbs.Select(p => p.PrjId)) + "') ");
            //分户评估
            var InvestigateTableID_param = "'" + string.Join("','", list_dcbs.Select(p => p.dcbId)) + "'";
            var list_fhpgs = await db.Ado.SqlQueryAsync<Fhpgs>("select   e.ProjectId as PrjId ,d.AssessmentNo,e.HouseAddress,d.countValue from InvestigateTable_Assessment d inner join InvestigateTable e on d.InvestigateTableId=e.ID where d.InvestigateTableID in ( " + InvestigateTableID_param + " ) union all select e.ProjectId as PrjId ,AssessmentNo, e.HouseAddress, d.countValue from NonInvestigateTable_Assessment d inner join NonResidentialInvestigateTable e on d.NonInvestigateTableID = e.ID where d.NonInvestigateTableID in ( " + InvestigateTableID_param + " ) ;");
            //补偿协议 
            var list_bcxys = await db.Ado.SqlQueryAsync<Bcxy>("select isnull(d.CollectDecisionNoHeadName,'')+isnull(d.No1,'')+'-'+isnull(d.No2,'')+(case when (d.No3 is null or d.No3 = '') then '' else ('-'+d.No3) end ) XyNo,d.SwitchProductionWay,e.HouseAddress,d.SummationShouldCompensateMoney,e.ProjectId as PrjId from ResidentialAgreement d inner join InvestigateTable e on d.InvestigateTableId=e.ID where d.InvestigateTableID in ( " + InvestigateTableID_param + " ) union all select isnull(d.CollectDecisionNoHeadName, '') + isnull(d.No2, '') + '-' + isnull(d.No3, '') XyNo , d.SwitchProductionWay, e.HouseAddress, d.SummationShouldCompensateMoney, e.ProjectId as PrjId from NonResidentialAgreement d inner join NonResidentialInvestigateTable e on d.NonInvestigateTableID = e.ID where d.NonInvestigateTableID in ( " + InvestigateTableID_param + " ); ");

            list_projects.ForEach(p =>
            {
                p.FhpgList = list_fhpgs.Where(a => a.PrjId == p.PrjId);
                p.BcxyList = list_bcxys.Where(a => a.PrjId == p.PrjId);
            });
            H5IndexModel h5IndexModel = new()
            {
                PrjList = list_projects,
                IdCard = cardno,
                UserName = username
            };
            return h5IndexModel;

        }
    }
}
