using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DirectoryDownload
{
    //该类主要将下载业务封装起来
    class Business
    {
        private JObject importDrugByTxt(string[] arr)
        {
            dynamic jsonTemp = new JObject();
            jsonTemp.ID = "";
            jsonTemp.HospitalID = GlobalVariables.hospitalNO;
            jsonTemp.InterfaceID = GlobalVariables.InterfaceID;
            jsonTemp.Code = arr[0];
            jsonTemp.Name = arr[1];
            jsonTemp.ChinaApprovedDrugCode = arr[2];
            jsonTemp.ChinaApprovedDrugName = arr[3];
            jsonTemp.ChemicalName = arr[4];
            jsonTemp.Alias = arr[5];
            jsonTemp.EnglishName = arr[6];
            jsonTemp.RegisteredName = arr[7];
            jsonTemp.DrugSafetyStandardCode = arr[8];
            jsonTemp.DosageForm = arr[9];
            jsonTemp.DosageFormName = arr[10];
            jsonTemp.DrugCategory = arr[11];
            jsonTemp.DrugCategoryName = arr[12];
            jsonTemp.Specification = arr[13];
            jsonTemp.SpecificationCode = arr[14];
            jsonTemp.RegistrationDosageForm = arr[15];
            jsonTemp.RegisteredSpecification = arr[16];
            jsonTemp.RegisteredSpecificationCode = arr[17];
            jsonTemp.OnceDosage = arr[18];
            jsonTemp.Frequency = arr[19];
            jsonTemp.Acidradicalbase = arr[20];
            jsonTemp.NationalDrugCode = arr[21];
            jsonTemp.Usage = arr[22];
            jsonTemp.ChinesePatentDrugSign = arr[23];
            jsonTemp.ProducerCategory = arr[24];
            jsonTemp.ProducerCategoryName = arr[25];
            jsonTemp.UnitType = arr[26];
            jsonTemp.OverTheCounterFlag = arr[27];
            jsonTemp.OverTheCounterName = arr[28];
            jsonTemp.PackingMaterial = arr[29];
            jsonTemp.PackingMaterialName = arr[30];
            jsonTemp.PackingSpecification = arr[31];
            jsonTemp.NumberofPackages = arr[32];
            jsonTemp.MainIdications = arr[33];
            jsonTemp.Route = arr[34];
            jsonTemp.Instruction = arr[35];
            jsonTemp.StartDate = arr[36];
            jsonTemp.EndDate = arr[37];
            jsonTemp.SmallestUnitUsing = arr[38];
            jsonTemp.SmallestUnitOfSales = arr[39];
            jsonTemp.SmallestUnitOfMeasurement = arr[40];
            jsonTemp.MinimumNumberOfPackages = arr[41];
            jsonTemp.SmalleStunitOfPackaging = arr[42];
            jsonTemp.SmallestUnitOfPreparation = arr[43];
            jsonTemp.SmallestPackingUnitName = arr[44];
            jsonTemp.MinimumPreparationUnitName = arr[45];
            jsonTemp.ConversionRatio = arr[46];
            jsonTemp.ExpirationDate = arr[47];
            jsonTemp.SmallestUnitOfValuation = arr[48];
            jsonTemp.WubiSearchCode = arr[49];
            jsonTemp.PinyinSearchCode = arr[50];
            jsonTemp.PointsPackingFactory = arr[51];
            jsonTemp.ProductionEnterpriseNO = arr[52];
            jsonTemp.ProductionentErpriseName = arr[53];
            jsonTemp.SpecialLimitedPriceDrugSign = arr[54];
            jsonTemp.SpecialDrugSign = arr[55];
            jsonTemp.LimitRange = arr[56];
            jsonTemp.LimitSign = arr[57];
            jsonTemp.DrugRegistrationNO = arr[58];
            jsonTemp.DrugRegistrationNOStartDate = arr[59];
            jsonTemp.DrugRegistrationNOEndDate = arr[60];
            jsonTemp.ApprovalNO = arr[61];
            jsonTemp.ApprovalNOStartDate = arr[62];
            jsonTemp.ApprovalNOStartDateEndDate = arr[63];
            jsonTemp.MarketState = arr[64];
            jsonTemp.MarketStateName = arr[65];
            jsonTemp.RegCertArchive = arr[66];
            jsonTemp.ApprovalCertArchive = arr[67];
            jsonTemp.Nationalhealthcaremedicinedirectoryremark = arr[68];
            jsonTemp.BasicDrugLabel = arr[69];
            jsonTemp.EssentialDrugsLogo = arr[70];
            jsonTemp.VATDrugSign = arr[71];
            jsonTemp.VATDRugName = arr[72];
            jsonTemp.Thelisteddrugsdirectorysetdrugs = arr[73];
            jsonTemp.NegotiationsDrugFlag = arr[74];
            jsonTemp.NegotiationsDrugName = arr[75];
            jsonTemp.HealthCommitteeDrugCode = arr[76];
            jsonTemp.Note = arr[77];
            jsonTemp.ValiadFlag = arr[78];
            jsonTemp.OnlyRecordNO = arr[79];
            jsonTemp.DataCreatTime = arr[80];
            jsonTemp.DataUpdateTime = arr[81];
            jsonTemp.VersionNO = arr[82];
            jsonTemp.VersionName = arr[83];
            jsonTemp.ChildrenDrugs = arr[84];
            jsonTemp.Company = arr[85];
            jsonTemp.ConsistencyEvaluation = arr[86];
            jsonTemp.SaleEnterprise = arr[87];
            jsonTemp.EnterpriseContacts = arr[88];
            jsonTemp.EnterpriseAuthElecArch = arr[89];
            jsonTemp.NationalMedDosageForm = arr[90];
            jsonTemp.ClassABSign = arr[91];
            jsonTemp.Type = "DrugDirectory";
            jsonTemp.UseFlag = "1";
            //jsonTemp.XH = i.ToString();
            return jsonTemp;
        }

        private JObject imoportMedicalServicesByTxt(string[] arr)
        {
            dynamic jsonTemp = new JObject();
            jsonTemp.ID = "";
            jsonTemp.HospitalID = GlobalVariables.hospitalNO;
            jsonTemp.InterfaceID = GlobalVariables.InterfaceID;
            jsonTemp.Code = arr[0];
            jsonTemp.ChargeUnit = arr[1];
            jsonTemp.ChargeUnitName = arr[2];
            jsonTemp.Instructions = arr[3];
            jsonTemp.ExceptContent = arr[4];
            jsonTemp.Connotation = arr[5];
            jsonTemp.ValidFlag = arr[6];
            jsonTemp.Note = arr[7];
            jsonTemp.ServiceCategory = arr[8];
            jsonTemp.Name = arr[9];
            jsonTemp.Description = arr[10];
            jsonTemp.StartDate = arr[11];
            jsonTemp.EndDate = arr[12];
            jsonTemp.OnlyRecordNO = arr[13];
            jsonTemp.VersionNO = arr[14];
            jsonTemp.VersionName = arr[15];
            jsonTemp.UseFlag = arr[16];

            jsonTemp.Type = "MedicalServicesDirectory";
            jsonTemp.UseFlag = "1"; 
            return jsonTemp;
        }

        private JObject importMaterialByTxt(string[] arr)
        {
            dynamic jsonTemp = new JObject();
            jsonTemp.ID = "";
            jsonTemp.HospitalID = "66";
            jsonTemp.InterfaceID = "CD02";
            jsonTemp.Code = arr[0];
            jsonTemp.Name = arr[1];
            jsonTemp.OnlyIdentificationCode = arr[2];
            jsonTemp.ChinaApprovedDrugCode = arr[3];
            jsonTemp.ChinaApprovedDrugName = arr[4];
            jsonTemp.ProductModel = arr[5];
            jsonTemp.SpecificationCode = arr[6];
            jsonTemp.Specification = arr[7];
            jsonTemp.Classification = arr[8];
            jsonTemp.SpecificationsModel = arr[9];
            jsonTemp.MaterialQualityCode = arr[10];
            jsonTemp.MaterialQuality = arr[11];
            jsonTemp.PackingSpecification = arr[12];
            jsonTemp.NumberOfPackage = arr[13];
            jsonTemp.PackMaterialQuality = arr[14];
            jsonTemp.PackingUnit = arr[15];
            jsonTemp.ConversionRatio = arr[16];
            jsonTemp.SmallestUnitUsing = arr[17];
            jsonTemp.ProducerCategory = arr[18];
            jsonTemp.ProducerCategoryname = arr[19];
            jsonTemp.ProductStandards = arr[20];
            jsonTemp.ExpirationDate = arr[21];
            jsonTemp.PerformanceStructureAndComposition = arr[22];
            jsonTemp.UseRange = arr[23];
            jsonTemp.ProductUseMethod = arr[24];
            jsonTemp.ProductPicturesNO = arr[25];
            jsonTemp.ProductQualityStandard = arr[26];
            jsonTemp.Instructions = arr[27];
            jsonTemp.OtherDocuments = arr[28];
            jsonTemp.SpecialMachineUseSign = arr[29];
            jsonTemp.SpecialMachineName = arr[30];
            jsonTemp.GroupName = arr[31];
            jsonTemp.MachineMark = arr[32];
            jsonTemp.LimitSign = arr[33];
            jsonTemp.LimitedInscope = arr[34];
            jsonTemp.SmallestUnitOfSales = arr[35];
            jsonTemp.HighValueSign = arr[36];
            jsonTemp.MedClassificationCode = arr[37];
            jsonTemp.ImplantMaterialsAndInhumaNorgansSign = arr[38];
            jsonTemp.SterilizationSign = arr[39];
            jsonTemp.SterilizationLabel = arr[40];
            jsonTemp.ImplantedOrInvolvementSign = arr[41];
            jsonTemp.ImplantedOrInvolvementName = arr[42];
            jsonTemp.DisposableUseSign = arr[43];
            jsonTemp.DisposableUseSignName = arr[44];
            jsonTemp.RegisteredName = arr[45];
            jsonTemp.StartDate = arr[46];
            jsonTemp.EndDate = arr[47];
            jsonTemp.ManagementCategory = arr[48];
            jsonTemp.ManagementCategoryName = arr[49];
            jsonTemp.RegistrationNO = arr[50];
            jsonTemp.RegistrationName = arr[51];
            jsonTemp.StructureAndComposition = arr[52];
            jsonTemp.OtherContent = arr[53];
            jsonTemp.ApprovalDate = arr[54];
            jsonTemp.RegisterAddress = arr[55];
            jsonTemp.RegistStartTime = arr[56];
            jsonTemp.RegistEndTime = arr[57];
            jsonTemp.ProductionEnterpriseNO = arr[58];
            jsonTemp.ProductionEnterpriseName = arr[59];
            jsonTemp.ProductionAddress = arr[60];
            jsonTemp.AgententErprise = arr[61];
            jsonTemp.AgententErpriseAddress = arr[62];
            jsonTemp.ProducerorRegion = arr[63];
            jsonTemp.AfterSalesServiceAgencies = arr[64];
            jsonTemp.RegistrationCertArchives = arr[65];
            jsonTemp.ProductImage = arr[66];
            jsonTemp.ValidFlga = arr[67];
            jsonTemp.OnlyRecordNO = arr[68];
            jsonTemp.VersionNO = arr[69];
            jsonTemp.VersionName = arr[70];
            jsonTemp.UseFlag = arr[71];
            jsonTemp.Type = "MaterialDirectory";
            jsonTemp.UseFlag = "1";
            return jsonTemp;
        }

        private JObject importDiagnoseByTxt(string[] arr)
        {
            dynamic jsonTemp = new JObject();
            jsonTemp.ID = "";
            jsonTemp.HospitalID = GlobalVariables.hospitalNO;
            jsonTemp.InterfaceID = GlobalVariables.InterfaceID;
            jsonTemp.Code = arr[0];
            jsonTemp.Chapter = arr[1];
            jsonTemp.ChapterRange = arr[2];
            jsonTemp.ChapterName = arr[3];
            jsonTemp.SectionRange = arr[4];
            jsonTemp.SectionName = arr[5];
            jsonTemp.CategoryCode = arr[6];
            jsonTemp.CategoryName = arr[7];
            jsonTemp.SuborderCode = arr[8];
            jsonTemp.SuborderName = arr[9];
            jsonTemp.Diagnosticcode = arr[10];
            jsonTemp.Name = arr[12];
            jsonTemp.UseTag = arr[13];
            jsonTemp.NationalStandardCode = arr[14];
            jsonTemp.NationalStandardName = arr[15];
            jsonTemp.ClinicalCode = arr[16];
            jsonTemp.ClinicalName = arr[17];
            jsonTemp.Note = arr[18];
            jsonTemp.ValiadFlag = arr[19];
            jsonTemp.OnlyRecordNO = arr[20];
            jsonTemp.DataCreatTime = arr[21];
            jsonTemp.DataUpdateTime = arr[22];
            jsonTemp.VersionNO = arr[23];
            jsonTemp.VersionName = arr[24];
            jsonTemp.Type = "Diagnose";
            jsonTemp.UseFlag = "1";
            return jsonTemp;
        }

        private JObject importOperationByTxt(string[] arr)
        {
            dynamic jsonTemp = new JObject();
            jsonTemp.ID = "";
            jsonTemp.HospitalID = GlobalVariables.hospitalNO;
            jsonTemp.InterfaceID = GlobalVariables.InterfaceID;
            jsonTemp.Code = arr[0];
            jsonTemp.Chapter = arr[1];
            jsonTemp.ChapterRange = arr[2];
            jsonTemp.ChapterName = arr[3];
            jsonTemp.CategoryCode = arr[4];
            jsonTemp.CategoryName = arr[5];
            jsonTemp.SuborderCode = arr[6];
            jsonTemp.SuborderName = arr[7];
            jsonTemp.Diagnosticcode = arr[8];
            jsonTemp.SuborderName = arr[9];
            jsonTemp.Diagnosticcode = arr[10];
            jsonTemp.Name = arr[11];
            jsonTemp.UseTag = arr[12];
            jsonTemp.NationalStandardCode = arr[13];
            jsonTemp.NationalStandardName = arr[14];
            jsonTemp.ClinicalCode = arr[15];
            jsonTemp.ClinicalName = arr[16];
            jsonTemp.Note = arr[17];
            jsonTemp.ValiadFlag = arr[18];
            jsonTemp.OnlyRecordNO = arr[19];
            jsonTemp.DataCreatTime = arr[20];
            jsonTemp.DataUpdateTime = arr[21];
            jsonTemp.VersionNO = arr[22];
            jsonTemp.VersionName = arr[23];
            jsonTemp.Type = "Operation";
            jsonTemp.UseFlag = "1";

            return jsonTemp;
        }

        private JObject importDaySurgeryByTxt(string[] arr)
        {
            dynamic jsonTemp = new JObject();
            jsonTemp.ID = "";
            jsonTemp.HospitalID = GlobalVariables.hospitalNO;
            jsonTemp.InterfaceID = GlobalVariables.InterfaceID;
            jsonTemp.Code = arr[0];
            jsonTemp.CategoryCode = arr[1];
            jsonTemp.CategoryName = arr[2];
            jsonTemp.Note = arr[9];
            jsonTemp.UseTag = arr[3];
            jsonTemp.OnlyRecordNO = arr[4];
            jsonTemp.DataCreatTime = arr[5];
            jsonTemp.DataUpdateTime = arr[6];
            jsonTemp.VersionNO = arr[7];
            jsonTemp.Content = arr[8];
            jsonTemp.VersionName = arr[10];
            jsonTemp.NationalStandardCode = arr[13];
            jsonTemp.NationalStandardName = arr[14];
            jsonTemp.Type = "DaySurgery";
            jsonTemp.UseFlag = "1";

            return jsonTemp;
        }

        private JObject importChronicDiseaseByTxt(string[] arr)
        {
            dynamic jsonTemp = new JObject();
            jsonTemp.ID = "";
            jsonTemp.HospitalID = GlobalVariables.hospitalNO;
            jsonTemp.InterfaceID = GlobalVariables.InterfaceID;
            jsonTemp.Code = arr[0];
            jsonTemp.Chapter = arr[3];
            jsonTemp.CategoryName = arr[1];
            jsonTemp.SuborderName = arr[2];
            jsonTemp.Note = arr[4];
            jsonTemp.UseTag = arr[5];
            jsonTemp.OnlyRecordNO = arr[6];
            jsonTemp.DataCreatTime = arr[7];
            jsonTemp.DataUpdateTime = arr[8];
            jsonTemp.VersionNO = arr[9];
            jsonTemp.Content = arr[10];
            jsonTemp.VersionName = arr[11];
            jsonTemp.NationalStandardCode = arr[14];
            jsonTemp.NationalStandardName = arr[15];
            jsonTemp.Type = "ChronicDisease";
            jsonTemp.UseFlag = "1";

            return jsonTemp;
        }

        private JObject importDRGsByTxt(string[] arr)
        {
            dynamic jsonTemp = new JObject();
            jsonTemp.ID = "";
            jsonTemp.HospitalID = GlobalVariables.hospitalNO;
            jsonTemp.InterfaceID = GlobalVariables.InterfaceID;
            jsonTemp.Code = arr[0];
            jsonTemp.CategoryCode = arr[1];
            jsonTemp.CategoryName = arr[2];
            jsonTemp.SuborderCode = arr[3];
            jsonTemp.SuborderName = arr[4];
            jsonTemp.UseTag = arr[5];
            jsonTemp.OnlyRecordNO = arr[6];
            jsonTemp.DataCreatTime = arr[7];
            jsonTemp.DataUpdateTime = arr[8];
            jsonTemp.VersionNO = arr[9];
            jsonTemp.Content = arr[10];
            jsonTemp.Note = arr[11];
            jsonTemp.VersionName = arr[12];
            jsonTemp.Type = "DRGs";
            jsonTemp.UseFlag = "1";

            return jsonTemp;
        }



        private string applyData(string code, JArray jaParam)
        {
            JObject joIn = new JObject();
            joIn.Add(new JProperty("params", jaParam));
            joIn.Add("code", code);
            IrisServices HisREST = new IrisServices();
            string sInput = joIn.ToString();
            string sRtn = HisREST.Invoke(sInput);
            
            return sRtn;
        }

        public string importByTxt(string txtPath, int singleRows, int direcType, Sunny.UI.UIProcessBar processBar)
        {
            string[] lines = System.IO.File.ReadAllLines(txtPath);
            dynamic jaParams = new JArray();
            int rows = lines.Length;
            processBar.Maximum = rows;
            for (int i = 0; i < rows; i++)
            {
                processBar.Value = i + 1;
                Application.DoEvents();
                string lineTmp = lines[i];

                string[] arr = lineTmp.Split('\t');
                DataImoport di = new DataImoport();
                //判断是哪种目录类型
                string code = string.Empty;
                switch (direcType)
                {
                    //药品
                    case 1:
                        {
                            jaParams.Add(di.GetDrugsJsonByTxt(arr));
                            code = "09010008";
                            break;
                        }
                    //诊疗
                    case 2:
                        {
                            jaParams.Add(imoportMedicalServicesByTxt(arr));
                            code = "09010009";
                            break;
                        }
                    //材料
                    case 3:
                        {
                            jaParams.Add(importMaterialByTxt(arr));
                            code = "09010010";
                            break;
                        }
                    //诊断
                    case 4:
                        {
                            jaParams.Add(importDiagnoseByTxt(arr));
                            code = "09010007";
                            break;
                        }
                    //手术
                    case 5:
                        {
                            jaParams.Add(importOperationByTxt(arr));
                            code = "09010007";
                            break;
                        }
                    //慢性病
                    case 6:
                        {
                            jaParams.Add(importChronicDiseaseByTxt(arr));
                            code = "09010007";
                            break;
                        }
                    //DRGs
                    case 7:
                        {
                            jaParams.Add(importDRGsByTxt(arr));
                            code = "09010007";
                            break;
                        }

                    //日间手术
                    case 8:
                        {
                            jaParams.Add(importDaySurgeryByTxt(arr));
                            code = "09010007";
                            break;
                        }
                }

                code = "09010035";
                //每50行提交一次给后台
                int currentRows = i + 1;
                if ((currentRows % singleRows == 0) && (i != 0))
                {
                    string sRtn =applyData(code, jaParams);
                    JObject joRtn = new JObject();
                    joRtn = JObject.Parse(sRtn);
                    if (joRtn["errorCode"].ToString() != "0")
                    {
                        MessageBox.Show(joRtn["errorMessage"].ToString()); 
                    }
                    jaParams = new JArray();
                }

                if ((currentRows == rows) && (currentRows % singleRows != 0))
                {
                    string sRtn = applyData(code, jaParams);
                    JObject joRtn = new JObject();
                    joRtn = JObject.Parse(sRtn);
                    if (joRtn["errorCode"].ToString() != "0")
                    {
                        MessageBox.Show(joRtn["errorMessage"].ToString());
                    }
                    jaParams = new JArray();
                }
            }
            return "";
        }

        public void importDictionaryByRtnString(string rtnStr)
        {
            JObject joRtn = JObject.Parse(rtnStr);

            JArray jsonList = new JArray();
            jsonList = (JArray)joRtn["output"]["list"];
            dynamic jaParams = new JArray();
            for (int i = 0; i < jsonList.Count; i++)
            {
                dynamic jsonTemp = new JObject();
                jsonTemp.ID = "";
                jsonTemp.HospitalID = "66";
                jsonTemp.InterfaceID = "CD02";
                jsonTemp.Type = jsonList[i]["type"].ToString();
                jsonTemp.NO = jsonList[i]["value"].ToString();
                jsonTemp.Name = jsonList[i]["label"].ToString();
                jsonTemp.PinyinSearchCode = SpellCodeHelper.GetFirstPYLetter(jsonList[i]["label"].ToString());
                jsonTemp.ValiFlag = jsonList[i]["vali_flag"].ToString();
                jsonTemp.UseFlag = "1";
                jsonTemp.XH = i.ToString();
                jaParams.Add(jsonTemp);

                string code = "09010011";
                //每10行提交一次给后台
                int currentRows = i + 1;
                if ((currentRows % 10 == 0) && (i != 0))
                {
                    applyData(code, jaParams);
                    jaParams = new JArray();
                }

                if ((currentRows == jsonList.Count) && (currentRows % 10 != 0))
                {
                    applyData(code, jaParams);
                    jaParams = new JArray();
                }
            }

        }
    }
}
