using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.APIEnum;
using WIDESEA_Core.Helper;
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_External.ERPService
{
    /// 
    /// 调用ERP接口
    /// 
    public class InvokeERPService : IInvokeERPService
    {
        private readonly IApiInfoRepository _apiInfoRepository;
        public InvokeERPService(IApiInfoRepository apiInfoRepository)
        {
            _apiInfoRepository = apiInfoRepository;
        }
        // 创建一个使用小驼峰命名法的序列化设置
        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        /// 
        /// ERP收货单接口调用
        /// 
        /// 
        /// 
        public string InvokeMatReceiveApi(ERPReceiveModel receiveModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = receiveModel,
                Desc = "WMS收货单推送",
                Type = "toTCWMSReceive",
                SecurityCode = "TeChuang"
            };
            
            string request = JsonConvert.SerializeObject(model, settings);
            
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP物料IQC检验单接口调用
        /// 
        /// 
        /// 
        public string InvokeCheckOrderApi(ERPCheckModel checkModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = checkModel,
                Desc = "物料IQC检验单",
                Type = "toTCWMSIQCTest",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP物料送检接口调用
        /// 
        public string InvokeInspectApi(ERPInspectModel eRPInspectModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = eRPInspectModel,
                Desc = "物料出仓检验单",
                Type = "toTCWMSOUTTest",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP物料入库单接口调用
        /// 
        /// 
        /// 
        public string InvokeInboundOrderApi(ERPInboundModel inboundModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = inboundModel,
                Desc = "物料入库单",
                Type = "toTCWMSMaterialWarehousing",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP领料通知单出库
        /// 
        public string InvokeOutStandardsApi(ERPIssueModel issueModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = issueModel,
                Desc = "领料出库通知单",
                Type = "toStandardPickList",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings).Replace("issitem", "Issitem");
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP退料上报接口调用
        /// 
        public string InvokeReturnApi(ERPReturnModel returnModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = returnModel,
                Desc = "材料退库",
                Type = "importMaterialsIssueNoteWMS",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings).Replace("issitem", "Issitem");
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP盘赢/亏上报接口调用
        /// 
        public string InvokeTakeStockApi(ERPTakeStockModel takeModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = takeModel,
                Desc = "材料盘点",
                Type = "toTCWMSMaterialCounting",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP成品出库上报接口调用
        /// 
        public string InvokeProOutApi(ERPProOutOrderModel outOrderModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = outOrderModel,
                Desc = "出库成品通知",
                Type = "toOrderAssignment",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP成品订单客户查询接口调用
        /// 
        /// 
        /// 
        public string InvokeProSaleCustomer(string saleOrderNo)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpSaleCustomApi.ToString());
            object saleObj = new { soNumber=saleOrderNo };
            string request = JsonConvert.SerializeObject(saleObj, settings);
            Dictionary requestHeader =new Dictionary
            {
                { "AccessToken", "TCKJF60B03C07E8E41B0B3CF759B7B01AB81HATC"},
            };
            string response = HttpHelper.Post(apiInfo.ApiAddress, request,headers:requestHeader);
            return response;
        }
        /// 
        /// ERP成品订单出库库存查询
        /// 
        /// 
        public string InvokeOutProErpSync(string outProOrderNo)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpOutProErpSyncApi.ToString());
            object outNoObj = new { shippingNumber = outProOrderNo };
            string request = JsonConvert.SerializeObject(outNoObj, settings);
            Dictionary requestHeader = new Dictionary
            {
                { "AccessToken", "TCKJF60B03C07E8E41B0B3CF759B7B01AB81HATC"},
            };
            string response = HttpHelper.Post(apiInfo.ApiAddress, request, headers: requestHeader);
            return response;
        }
        /// 
        /// ERP成品入库产品型号面积查询
        /// 
        /// 
        public string InvokeProInErpStatic(string partNum,string partNumWithRev)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeProInErpStatic.ToString());
            object inObj = new { partNum, partNumWithRev };
            string request = JsonConvert.SerializeObject(inObj, settings);
            Dictionary requestHeader = new Dictionary
            {
                { "AccessToken", "TCKJF60B03C07E8E41B0B3CF759B7B01AB81HATC"},
            };
            string response = HttpHelper.Post(apiInfo.ApiAddress, request, headers: requestHeader);
            return response;
        }
        /// 
        /// ERP成品入库上报接口调用
        /// 
        public string InvokeProInApi(ERPProInboundModel inboundModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = inboundModel,
                Desc = "成品入库",
                Type = "toWOStockForm",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// 成品仓检报废出库推送ERP
        /// 
        /// 
        /// 
        public string InvokeProCheckApi(ERPProductCheckModel checkModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = checkModel,
                Desc = "成品检验单",
                Type = "toFGIIqcChecked",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// 成品超周期报废推送ERP
        /// 
        /// 
        /// 
        public string InvokeProScrapSheetApi(ERPScrapSheetModel sheetModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = sheetModel,
                Desc = "成品报废单",
                Type = "toFGIScrapSheet",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// 成品盘点盘赢/盘亏
        /// 
        /// 
        /// 
        public string InvokeProStockCheckApi(ERPProStockCheckModel stockCheckModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel model = new ERPBaseModel()
            {
                Data = stockCheckModel,
                Desc = "成品盘点单",
                Type = "toStockCheck",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings);
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// 
        /// ERP物料出库接口调用
        /// 
        /// 
        /// 
        #region 弃用
        //public string InvokeOutboundOrderApi(ERPOutboundModel outboundModel)
        //{
        //    Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
        //    ERPBaseModel model = new ERPBaseModel()
        //    {
        //        Data = outboundModel,
        //        Desc = "材料出库",
        //        Type = "toBomMaterialOutTC",
        //        SecurityCode = "TeChuang"
        //    };
        //    string request = JsonConvert.SerializeObject(model, settings);
        //    string response = HttpHelper.Post(apiInfo.ApiAddress, request);
        //    return response;
        //}
        #endregion
    }
}