/// <summary>
 /// 酒店所在城市ID,酒店名称、酒店星级等查询酒店信息列表
 /// </summary>
 /// <param name="availableOnlyIndicator"></param>
 /// <param name="hotelCityID"></param>
 /// <returns></returns>
 public static OTA_HotelSearchReturnEntity OTA_HotelSearch(bool availableOnlyIndicator, int hotelCityID)
 {
     OTA_HotelSearchCallEntity callEntity = new OTA_HotelSearchCallEntity();
     callEntity.HotelCityCode = hotelCityID;
     callEntity.AvailableOnlyIndicator = availableOnlyIndicator;
     return hotelOTAService.OTA_HotelSearch(callEntity);
 }
        /// <summary>
        /// 酒店所在城市ID,酒店名称、酒店星级等查询酒店信息列表
        /// </summary>
        /// <param name="callEntity"></param>
        /// <returns></returns>
        public OTA_HotelSearchReturnEntity OTA_HotelSearch(OTA_HotelSearchCallEntity req)
        {
            OTA_HotelSearchReturnEntity rep = new OTA_HotelSearchReturnEntity();
            
            if (req.AreaID == null && req.HotelCityCode == null && (req.HotelName == null || req.HotelName == "") && (req.HotelStarLevel == null || req.StarScore == null))
            {
                rep.ValidateResult = false;
                rep.ValidateResultMessage = "请求信息不全";
                return rep;
            }
            StringBuilder reqXml = new StringBuilder();
            reqXml.AppendFormat("<ns:OTA_HotelSearchRQ Version=\"1.0\" PrimaryLangID=\"zh\" xsi:schemaLocation=\"http://www.opentravel.org/OTA/2003/05 OTA_HotelSearchRQ.xsd\" xmlns=\"http://www.opentravel.org/OTA/2003/05\">");
            reqXml.Append("<ns:Criteria>");
            reqXml.AppendFormat("<ns:Criterion>");
            reqXml.Append("<ns:HotelRef ");
            if (req.HotelCityCode != null)
            {
                reqXml.AppendFormat(" HotelCityCode=\"{0}\"", req.HotelCityCode);
            }
            if (req.AreaID != null)
            {
                reqXml.AppendFormat(" AreaID=\"{0}\"", req.AreaID);
            }
            if (!string.IsNullOrEmpty(req.HotelName))
            {
                reqXml.AppendFormat(" HotelName=\"{0}\"", req.HotelName);
            }
            reqXml.Append(" />");

            if (req.PositionTypeCode!=null)
            {
                reqXml.AppendFormat("<ns:Position PositionTypeCode=\"{0}\" />", req.PositionTypeCode);
            }
            if (req.HotelStarLevel != null && req.StarScore != null)
            {
                reqXml.AppendFormat("<ns:Award Provider=\"{0}\" Rating=\"{1}\"/>", req.HotelStarLevel, req.StarScore);
            }

            reqXml.Append("</ns:Criterion>");
            reqXml.Append("</ns:Criteria>");
            reqXml.Append("</ns:OTA_HotelSearchRQ>");
            req.RequestContent = reqXml.ToString();
            string repXml = HotelApiCall(req);

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(repXml);
            GetHeaderResult(xmlDoc, rep);
            List<CtripHotelRepEntity> hotelList = new List<CtripHotelRepEntity>();
            List<ZoneTypeInfo> zoneinfos;
            ZoneTypeInfo zoneInfo;
            var hotelNodes = xmlDoc.SelectNodes("/Response/HotelResponse/OTA_HotelSearchRS/Properties/Property");
            CtripHotelRepEntity entity = null;
            foreach (XmlElement el in hotelNodes)
            {
                entity = new CtripHotelRepEntity();
                entity.AddressLine = el.SelectSingleNode("Address/AddressLine").InnerText.Trim();
                entity.AreaID = el.GetAttribute("AreaID").Trim().ToInt32();
                entity.BrandCode = el.GetAttribute("BrandCode") == "" ? 0 : el.GetAttribute("BrandCode").ToInt32();
                entity.CityName = el.SelectSingleNode("Address/CityName").InnerText.Trim();
                entity.HotelName = el.GetAttribute("HotelName").Trim();
                entity.PostCode = el.SelectSingleNode("Address/PostalCode").InnerText.Trim();
                entity.HotelCode = el.GetAttribute("HotelCode").Trim().ToInt32();
                entity.HotelId = el.GetAttribute("HotelId").Trim().ToInt32();
                entity.HotelCityCode = el.GetAttribute("HotelCityCode").Trim().ToInt32();

                var awardNodes = el.SelectNodes("Award");
                foreach (XmlElement al in awardNodes)
                {
                    string provider = al.GetAttribute("Provider");
                    if (provider != "" && provider == "HotelStarRate")
                    {
                        entity.HotelStarRate = al.GetAttribute("Rating").Trim().ToDecimal();
                    }
                    if (provider != "" && provider == "CtripStarRate")
                    {
                        entity.CtripStarRate = al.GetAttribute("Rating").Trim().ToDecimal();
                    }
                    if (provider != "" && provider == "CtripRecommendRate")
                    {
                        entity.CtripRecommendRate = al.GetAttribute("Rating").Trim().ToDecimal();
                    }
                    if (provider != "" && provider == "CtripCommRate")
                    {
                        entity.CtripCommRate = al.GetAttribute("Rating").Trim().ToDecimal();
                    }
                    if (provider != "" && provider == "CommSurroundingRate")
                    {
                        entity.CommSurroundingRate = al.GetAttribute("Rating").Trim().ToDecimal();
                    }
                    if (provider != "" && provider == "CommFacilityRate")
                    {
                        entity.CommFacilityRate = al.GetAttribute("Rating").Trim().ToDecimal();
                    }
                    if (provider != "" && provider == "CommCleanRate")
                    {
                        entity.CommCleanRate = al.GetAttribute("Rating").Trim().ToDecimal();
                    }
                    if (provider != "" && provider == "CommServiceRate")
                    {
                        entity.CommServiceRate = al.GetAttribute("Rating").Trim().ToDecimal();
                    }
                }

                var relativePositionNodes = el.SelectNodes("RelativePosition");
                List<RelativePosition> relatives = new List<RelativePosition>();
                foreach (XmlElement rl in relativePositionNodes)
                {
                    relatives.Add(new RelativePosition()
                    {
                        Distance = rl.GetAttribute("Distance").Trim().ToDecimal(),
                        Name = rl.GetAttribute("Name").Trim(),
                        UnitOfMeasureCode = rl.GetAttribute("UnitOfMeasureCode").Trim().ToInt32()
                    });
                }
                entity.RelativePositions = relatives;


                List<VendorMessage> vendorMessages = new List<VendorMessage>();

                var VendorMessageNodes = el.SelectNodes("VendorMessages/VendorMessage");

                if (VendorMessageNodes != null && VendorMessageNodes.Count > 0)
                {
                    VendorMessage vendorMessage = null;
                    foreach (XmlNode v in VendorMessageNodes)
                    {
                        vendorMessage = new VendorMessage();
                        vendorMessage.InfoType = ((XmlElement)v).GetAttribute("InfoType").ToInt32();
                        var vText = v.SelectSingleNode("SubSection/Paragraph/Text");
                        if (vText != null)
                        {
                            vendorMessage.Paragraph = vText.InnerText.Trim();
                        }
                        vendorMessages.Add(vendorMessage);
                    }

                    entity.VendorMessages = vendorMessages;
                }

                XmlNode imgText = el.SelectSingleNode("VendorMessages/VendorMessage/SubSection/Paragraph/Text");
                if (imgText != null)
                {
                    entity.ImgText = imgText.InnerText;
                }
                else
                {
                    entity.ImgText = "";
                }
                XmlNode positionNode = el.SelectSingleNode("Position");
                entity.Longitude = ((XmlElement)positionNode).GetAttribute("Longitude");
                entity.Latitude = ((XmlElement)positionNode).GetAttribute("Latitude");
                entity.PositionTypeCode = ((XmlElement)positionNode).GetAttribute("PositionTypeCode");

                var zongTypeNodes = el.SelectNodes("TPA_Extensions/Zone/ZoneType");
                zoneinfos = new List<ZoneTypeInfo>();
                if(zongTypeNodes!=null)
                {
                    
                    foreach(XmlElement xe in zongTypeNodes)
                    {
                        zoneInfo = new ZoneTypeInfo();
                        zoneInfo.ZoneID = xe.GetAttribute("ZoneID").Trim().ToInt32();
                        zoneInfo.ZoneName = xe.GetAttribute("ZoneName").Trim();
                        zoneinfos.Add(zoneInfo);
                    }
                }
                entity.Zones = zoneinfos;

                hotelList.Add(entity);
            }
            rep.HotelList = hotelList;
            return rep;


        }