//    var google_tag_params = {
        //    flight_originid : 'IST',
        //    flight_destid : 'JFK',
        //    flight_startdate : '2016-07-12',
        //    flight_enddate : '2016-07-19',
        //    flight_pagetype : 'availabilityInt'
        //};
        public AvailabilityFightListResponse ParseAvailabilityResults(AvailabilityFightListRequest request, OTA_AirAvailAndFaresRSType response)
        {
            //TODO : : OK::NOT:: bu iki bilgi requestin içine eklenebilir requet içinde code değilde airport eklenebilir bu sayede. bir ön mekenazima yapılıp onun istekleri yapmadan önce ilgili düzenlemeleri yapması istenebiir :)
            Airport departure = new Airport(request.origin, request.origin, "TR");
            Airport arrival = new Airport(request.destination, request.destination, "TR");

            AvailabilityFightListResponse formedResponse = new AvailabilityFightListResponse();

            if (response.Success && response.OriginDestinationOptionsExt.OriginDestinationOptionExt.Length > 0)
            {
                bool isDomestic = FlightHelper.FlightHelpers.IsFlightInTurkeyOrECN(departure, arrival);

                //string[] promoClasses = new string[0];
                if (isDomestic)
                {
                    //promoClasses = this.ProviderModel.GetDelimitedValues("DomesticPromoClasses", null, ';');
                }
                else
                {
                    //promoClasses = this.ProviderModel.GetDelimitedValues("InternationalPromoClasses", null, ';');
                }
                int nonInfants = request.adult + request.child + request.tsk + request.ogr; //FlightHelpers.GetNonInfantPassengerCounts(query);
                List<BookingClassAvailExtType> cheapestBookingClasses = new List<BookingClassAvailExtType>();
                OriginDestinationOptionExtType[] originDestinationOptionExt = response.OriginDestinationOptionsExt.OriginDestinationOptionExt;
                for (int i = 0; i < originDestinationOptionExt.Length; i++)
                {
                    OriginDestinationOptionExtType option = originDestinationOptionExt[i];
                    if (!request.directFlightsOnly || option.FlightSegmentExt.Length <= 1)
                    {
                        if (!option.FlightSegmentExt.Any((FlightSegmentExtType x) => x.BookingClassAvailExt == null))
                        {
                            FlightOption pgsOption = new FlightOption();
                            pgsOption.BookingProviderId = this.ProviderModel.ProviderNo;
                            pgsOption.BookingProviderCode = this.ProviderModel.ProviderCode;
                            pgsOption.RelatedQueryObject = query;
                            pgsOption.OptionFlag = "OW";
                            pgsOption.OriginDestinationFlag = string.Format("{0}-{1}", option.FlightSegmentExt.First<FlightSegmentExtType>().DepartureAirport.LocationCode, option.FlightSegmentExt.Last<FlightSegmentExtType>().ArrivalAirport.LocationCode);
                            pgsOption.TripType = E_TripTypes.OneWay;
                            pgsOption.FreeBaggageAllowance = new FreeBaggageAllowance[]
                            {
                                Common.GetBaggageAllowance(query, isDomestic)
                            };
                            pgsOption.Segments = new List<Segment>();
                            pgsOption.SegmentAvailabilities = new List<SegmentAvailability>();
                            int segmentIndex = 1;
                            FlightSegmentExtType[] flightSegmentExt = option.FlightSegmentExt;
                            for (int j = 0; j < flightSegmentExt.Length; j++)
                            {
                                FlightSegmentExtType segment = flightSegmentExt[j];
                                IEnumerable<BookingClassAvailExtType> availableBookingClasses =
                                    from x in segment.BookingClassAvailExt
                                    where x.ResBookDesigQuantity >= nonInfants
                                    select x;
                                SegmentAvailability pgsSegmentAvailability = new SegmentAvailability
                                {
                                    SegmentIndex = segmentIndex,
                                    BookingClasses = new List<BookingClassAvailability>()
                                };
                                foreach (BookingClassAvailExtType bookingClass in availableBookingClasses)
                                {
                                    pgsSegmentAvailability.BookingClasses.Add(new BookingClassAvailability
                                    {
                                        Code = bookingClass.ResBookDesigCode,
                                        AvailableSeats = bookingClass.ResBookDesigQuantity,
                                        IsPromo = promoClasses.Contains(bookingClass.ResBookDesigCode)
                                    });
                                }
                                pgsOption.SegmentAvailabilities.Add(pgsSegmentAvailability);
                                Segment pgsSegment = new Segment();
                                pgsSegment.Index = segmentIndex;
                                pgsSegment.OriginAirport = segment.DepartureAirport.LocationCode;
                                pgsSegment.DestinationAirport = segment.ArrivalAirport.LocationCode;
                                pgsSegment.OD_OriginAirport = option.FlightSegmentExt.First<FlightSegmentExtType>().DepartureAirport.LocationCode;
                                pgsSegment.OD_DestinationAirport = option.FlightSegmentExt.Last<FlightSegmentExtType>().ArrivalAirport.LocationCode;
                                pgsSegment.DepartureDateTime = DateTime.Parse(segment.DepartureDateTime);
                                pgsSegment.ArrivalDateTime = DateTime.Parse(segment.ArrivalDateTime);
                                pgsSegment.FlightNumber = segment.MarkettingAirline.CompanyShortName + segment.FlightNumber;
                                pgsSegment.MarketingAirline = segment.MarkettingAirline.CompanyShortName;
                                pgsSegment.OperatingAirline = pgsSegment.MarketingAirline;
                                pgsSegment.Equipment = segment.Equipment.AirEquipType;
                                BookingClassAvailExtType cheapestBookingClass = availableBookingClasses.FirstOrDefault((BookingClassAvailExtType x) => x.ResBookDesigCode == pgsSegmentAvailability.BookingClasses.Last<BookingClassAvailability>().Code);
                                cheapestBookingClasses.Add(cheapestBookingClass);
                                pgsSegment.BookingClassCode = cheapestBookingClass.ResBookDesigCode;
                                pgsSegment.FareBasisCode = pgsSegment.BookingClassCode;
                                pgsSegment.FareReference = cheapestBookingClass.FareDisplayInfos.FareDisplayInfo.Last<FareDisplayInfoType>().FareReference;
                                pgsSegment.FareReferenceId = cheapestBookingClass.FareDisplayInfos.FareDisplayInfo.Last<FareDisplayInfoType>().FareReferenceID;
                                pgsOption.Segments.Add(pgsSegment);
                                segmentIndex++;
                            }
                            result.FlightOptions.Add(pgsOption);
                        }
                    }
                }
                foreach (FlightOption pgsoption in result.FlightOptions)
                {
                    this.GetFareTypesInParallelThread(pgsoption);
                }
                this.CalculateFares(query, result, isDomestic, cheapestBookingClasses);
            }
            else
            {
                result.FlightOptions = null;
                result.HasError = true;
            }
            return result;
        }
        public List<OTA_AirAvailAndFaresRQType> CreateAvailabilityRequests(AvailabilityFightListRequest request)
        {
            //airport listesi elimizde olsaydı metadata gibi linq ile sorgu atabilirdik. veya db den soracağız. hava alanı listesini istek oluştururken static bir şekildede oluşturabiliriz.
            //query.IntendedSegments.First<AirQuery_Segment>().Destination;
            //buarada biz metadatadan arama yaparken sadece Airport Code üzerinden sorgu atıp diğer bilgileri oradan bulacağız ben şimdilik elle salladım.

            Airport departure = new Airport(request.origin, request.origin, "TR");
            Airport arrival = new Airport(request.destination, request.destination, "TR");

            string[] origins = new string[]
            {
                departure.Code
            };

            //IsCity deki amaç istanbuldan ankaraya uçacak ve istanbulda 2 ankarada 3 hava alanı var. kullanıcı ayrım yapmadan sorgulama yapmak istiyor. yani SAW (sabiha) veya burada amaç
            if (departure.IsCity && Common.CityAirports.ContainsKey(departure.Code))
            {
                origins = Common.CityAirports[departure.Code];
            }
            string[] destinations = new string[]
            {
                arrival.Code
            };
            if (arrival.IsCity && Common.CityAirports.ContainsKey(arrival.Code))
            {
                destinations = Common.CityAirports[arrival.Code];
            }

            return new List<OTA_AirAvailAndFaresRQType>
            {
                new OTA_AirAvailAndFaresRQType
                {
                    SequenceNmbr = 1,
                    SequenceNmbrSpecified = true,
                    PrimaryLangID = "1",
                    DirectFlightsOnly = request.directFlightsOnly,
                    DirectFlightsOnlySpecified = true,

                    POS = Common.GetPOSType(),
                    TravelerInfoSummary = new TravelerInfoSummaryType
                    {
                        AirTravelerAvail = new AirTravelerAvailType
                        {
                            PassengerTypeQuantity = this.GetPassengerQuantities(request),
                            temp = "temp"
                        }
                    },

                    OriginDestinationInformation = new OriginDestinationInformationType
                    {
                        OriginLocation = new LocationType
                        {
                            LocationCode = origins.First<string>()
                        },
                        DestinationLocation = new LocationType
                        {
                            LocationCode = destinations.First<string>()
                        },
                        DepartureDateTime =  request.date.ToString("yyyy-MM-dd")
                    }
                }
            };
        }
        //        public static string GetCountryCode(string phoneNumber)
        //        {
        //            return phoneNumber.Split(new char[]
        //            {
        //                '-'
        //            }).First<string>().Replace("+", "00");
        //        }
        //        public static string GetPhoneNumber(string phoneNumber)
        //        {
        //            return phoneNumber.Split(new char[]
        //            {
        //                '-'
        //            }).Last<string>();
        //        }
        //        public static string GetRawFlightNumber(string flightNumber)
        //        {
        //            int length = flightNumber.Length;
        //            return flightNumber.Substring(2, length - 2);
        //        }
        //        public static int[] GetPassengerCounts(AirQuery query)
        //        {
        //            AirQuery_PaxItem adultCount = query.Paxes.FirstOrDefault((AirQuery_PaxItem p) => p.PaxType == "ADT");
        //            AirQuery_PaxItem childCount = query.Paxes.FirstOrDefault((AirQuery_PaxItem p) => p.PaxType == "CHD");
        //            AirQuery_PaxItem infantCount = query.Paxes.FirstOrDefault((AirQuery_PaxItem p) => p.PaxType == "INF");
        //            AirQuery_PaxItem studentCount = query.Paxes.FirstOrDefault((AirQuery_PaxItem p) => p.PaxType == "STD");
        //            AirQuery_PaxItem seniorCount = query.Paxes.FirstOrDefault((AirQuery_PaxItem p) => p.PaxType == "SRC");
        //            AirQuery_PaxItem militaryCount = query.Paxes.FirstOrDefault((AirQuery_PaxItem p) => p.PaxType == "MIL");
        //            int adt = (adultCount != null) ? adultCount.Count : 0;
        //            int chd = (childCount != null) ? childCount.Count : 0;
        //            int inf = (infantCount != null) ? infantCount.Count : 0;
        //            int std = (studentCount != null) ? studentCount.Count : 0;
        //            int src = (seniorCount != null) ? seniorCount.Count : 0;
        //            int mil = (militaryCount != null) ? militaryCount.Count : 0;
        //            adt += std + src + mil;
        //            return new int[]
        //            {
        //                adt,
        //                chd,
        //                inf
        //            };
        //        }
        //        public static int GetNonInfantPassengerCounts(AirQuery query)
        //        {
        //            return (
        //                from x in query.Paxes
        //                where x.PaxType != "INF"
        //                select x).Sum((AirQuery_PaxItem y) => y.Count);
        //        }
        //        public static bool IsFlightInTurkey(AirQuery query)
        //        {
        //            bool isDomestic = false;
        //            AirQuery_Segment route = query.IntendedSegments[0];
        //            if (route.Origin.CountryCode == "TR" && route.Destination.CountryCode == "TR")
        //            {
        //                isDomestic = true;
        //            }
        //            return isDomestic;
        //        }
        public static bool IsFlightInTurkeyOrECN(Airport Origin, Airport Destination )
        {
            bool isDomestic = false;
            if ((Origin.CountryCode == "TR" || Origin.Code == "ECN") && (Destination.CountryCode == "TR" || Destination.Code == "ECN"))
            {
                isDomestic = true;
            }

            return isDomestic;
        }