<?php

/* PHP SDK
 * @version 2.0.0
 * @author magicsky0@163.com
 * @copyright © 2014, Ctrip Corporation. All rights reserved.
 */

class OAE_IntlFlightSearch {

    public $open_api = '/Flight/IntlFlight/OAE_IntlFlightSearch.asmx';
    public $page_size = 2000;
    public $page_number = 1;
    public $order_name = 'Price';
    public $order_type = 'ASC';
    public $RouteSearchMode='None';
    public $RouteSearchToken='';
    public $dest_request_list = array();

    public function __construct($open_api, $args) {
        //今后需要考虑多程问题
        $this->dest_request_list = array(array('orig' => $args['intflight_form_city'], 'dest' => $args['intflight_to_city'], 'date' => $args['intflight_date']));
        if ($args['return_date']) {
            $this->dest_request_list[] = array('orig' => $args['intflight_to_city'], 'dest' => $args['intflight_form_city'], 'date' => $args['return_date']);
        }
        if (array_key_exists('page_size', $args) && isset($args['page_size'])) {
            $this->page_size = $args['page_size'];
        }
        if (array_key_exists('page_number', $args) && isset($args['page_number'])) {
            $this->page_number = $args['page_number'];
        }
        if (array_key_exists('order_name', $args) && isset($args['order_name'])) {
            $this->order_name = $args['order_name'];
        }
        if (array_key_exists('order_type', $args) && isset($args['order_type'])) {
            $this->order_type = $args['order_type'];
        }
        if (array_key_exists('route_rearch_token', $args) && isset($args['route_rearch_token'])) {
            $this->RouteSearchToken = $args['route_rearch_token'];
            $this->RouteSearchMode  = 'AllOrigDestsStrict';
        }
        $this->open_api = $open_api . $this->open_api; // TODO:检测open api，如果不合法则覆盖重写
    }

    /**
     * 构造请求xml字符串
     * @param int $uid
     * @param int $sid
     * @param string $stmp
     * @param string $sign
     * @param stirng $type
     */
    public function request_xml($uid, $sid, $stmp, $sign, $type) {
        $dest_string = '';
        foreach ($this->dest_request_list as $item) {
            $date = $item['date'];
            $orig = $item['orig'];
            $dest = $item['dest'];
            $dest_string.="<OrigDestRequest>
                        <!--出发日期-->
                        <Date>$date</Date>
                        <!--出发城市-->
                        <ORIG>$orig</ORIG>
                        <!--到达城市-->
                        <DEST>$dest</DEST>
                        </OrigDestRequest>";
        }

        $request_xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<!--接口提供方：携程；调用方：合作方-->
<Request>
<!--AllianceID:分销商ID;SID:站点ID;TimeStamp:响应时间戳（从1970年到现在的秒数）;RequestType:请求接口的类型;Signature:MD5加密串-->
<Header  AllianceID=\"$uid\" SID=\"$sid\" TimeStamp=\"$stmp\"  RequestType=\"OAE_IntlFlightSearch\" Signature=\"$sign\" />
<IntlFlightSearchRequest>
<!--最终用户直接设定的参数-->
<SearchCriteria>
<OrigDestRequestList>$dest_string</OrigDestRequestList>
<!--乘客信息-->
<TravelerRequestList>
<TravelerRequest>
<!--乘客类别：成人Adult/儿童Child/婴儿（不占座）InfantInLap/婴儿（占座）InfantInSeat/老人Senior-->
<TravelerCategoryCode>Adult</TravelerCategoryCode>
<!--乘客人数-->
<TravelerCount>1</TravelerCount>
<!--乘客资质：ALL 全部 ADT 普通成人 CHD 儿童 EMI 移民 LAB 劳务人员 NEW 新移民 SEA 海员 SRC 老年人 STU 学生 TAI 台商 VFR 探亲访友 WOM 女士 YTH 青年-->
<TravelerEligibilityCode>ALL</TravelerEligibilityCode>
</TravelerRequest>
</TravelerRequestList>
<!--舱等：经济舱Economy/超级经济舱Premium/商务舱Business/头等舱First-->
<CabinClass>Economy</CabinClass>
<!--为true时结果只返回用户指定舱位等级-->
<RequestedCabinClassOnly>false</RequestedCabinClassOnly>
<!--机票配送城市ID-->
<TicketDeliveryCityID>0</TicketDeliveryCityID>
</SearchCriteria>
<!--结果控制-->
<ResultControl>
<!--指定请问返回结果数目-->
<MaxResultCount>100</MaxResultCount>
<!--结果排序参数-->
<SortInstruction>
<!--Price,DepartureTime,ArrivalTime,FlightDuration.-->
<SortingField>$this->order_name</SortingField>
<!--ASC,DESC-->
<Direction>$this->order_type</Direction>
<!--结果排序参数-->
</SortInstruction>
<!--中转类型：0 – 返回所有数据
                1 – 仅返回直飞数据，即往返程查询返回：（直飞，直飞）；单程查询返回：直飞
                2 – 仅返回非直飞数据，即往返程查询返回：（非直飞，非直飞）；单程查询返回：非直飞
                4 – 仅在往返程查询下起作用，返回：（直飞，非直飞）和（非直飞，直飞）；单程查询这个参数不起作用
                5 – 仅返回一程中转，即往返程查询返回：（一程中转，一程中转）；单程查询返回：一程中转
                6 – 往返程查询返回：（直飞，一程中转）和（一程中转，直飞）；单程查询返回：直飞或一程中转
                7 – 往返程查询返回：（直飞，直飞）、（一程中转，一程中转）、（直飞，一程中转）和（一程中转，直飞），即1,5,6的并集；单程查询返回：直飞或一程中转，在单程查询中，6和7的意义相同
                8 – 往返程查询返回：（非“直飞或一程中转”，非“直飞或一程中转”）、（直飞，非“直飞或一程中转”）、（一程中转，非“直飞或一程中转”）、（非“直飞或一程中转”，直飞）和（非“直飞或一程中转”、一程中转）；单程查询返回：非“直飞或一程中转”-->
<TransferType>
0
</TransferType>
<!--是否只返回每个PU下的默认票台价格的PriceInfo-->
<DefaultPriceOnly>false</DefaultPriceOnly>
<!--是否只返回每个FlightProductGroup下的最低价格的Price-->
<LowestPriceOnly>false</LowestPriceOnly>
</ResultControl>
<!--查询情景信息-->
<SearchContext>
<!--全舱查询Token（暂时只有TSK使用）-->
<AllClassesSearchToken></AllClassesSearchToken>
<!--基于路由的分段/反查控制-->
<RouteSearchControl>
    <RouteSearchMode>$this->RouteSearchMode</RouteSearchMode>
    <RouteSearchToken>$this->RouteSearchToken</RouteSearchToken>
</RouteSearchControl>
<!--分批查询控制-->
<PartitionSearchControl>
<!--是否需要分批查询-->
<NeedPartitionedSearchResults>false</NeedPartitionedSearchResults>
<!--分批查询Token，由Response输出
                PartitionSearchToken使用场景：
                每批的Token，第一次分批查询时为空，Aggregator会返回第一批结果，同时将所有的剩余分批Token（SearchResult.PartitionSearchTokenList）返回给调用方；然后调用方对每个剩余分批Token执行一次后续分批查询（将分批Token带入PartitionSearchToken参数）获取分批结果。有多个分批Token时可通过并行或串行方式执行后续分批查询，推荐使用并行方式，加快查询速度。如果第一次反批查询返回的分批Token列表为空，表示无后续分批查询。-->
<PartitionSearchToken></PartitionSearchToken>
</PartitionSearchControl>
</SearchContext>
</IntlFlightSearchRequest>
</Request>

                ";

       //echo $request_xml;
        // 需要将此处的xml嵌入到外层xml中，故需要将其转义
        $request_xml = str_replace("<", @"&lt;", $request_xml);
        $request_xml = str_replace(">", @"&gt;", $request_xml);

        return $request_xml;
    }

    public function respond_xml($string) {
        // 将内层xmll中转义的符号恢复
        $string = str_replace("&lt;", "<", $string);
        $string = str_replace("&gt;", ">", $string);

        return simplexml_load_string($string);
    }

}
