<?php 
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class intelTrainSearch extends CI_Controller{
	
	public function __construct(){
		parent::__construct();
		header('Access-Control-Allow-Origin:*');
	    header('Access-Control-Allow-Methods:POST, GET');
	    header('Access-Control-Max-Age:0');
	    header('Access-Control-Allow-Headers:x-requested-with, Content-Type');
	    header('Access-Control-Allow-Credentials:true');
		$this->load->helper('train');
		$this->start_time = microtime(true);
		$this->load->model("BIZ_intel_train_model");//国际火车模型
	}
	
	//国际火车获取
	public function search_international_train(){
		$trainFrom = $this->input->get_post('trainFrom');
		$trainTo = $this->input->get_post('trainTo');
		$trainDate = $this->input->get_post('trainDate');
		
		if(empty($trainFrom) || empty($trainTo)){
			header("HTTP/1.1 404 Not Found");  
			exit('{"status":"201","reason":"车站查询失败","data":""}');
		}
		
		//根据传过来的城市名称获取城市代码
		$trainFromCode = $this->BIZ_intel_train_model->get_code_by_name($trainFrom);
		$trainToCode = $this->BIZ_intel_train_model->get_code_by_name($trainTo);
		
		if(empty($trainFromCode) || empty($trainToCode)){
			header("HTTP/1.1 404 Not Found");  
		    exit('{"status":"202","reason":"站点名转换失败","data":""}');
		}
		
		//获取车次信息
		$obj = $this->BIZ_intel_train_model->get_train_info($trainFromCode->s_code,$trainToCode->s_code);
		
		//如果结果为空则直接返回为空的结果
		if(empty($obj)){
			header("HTTP/1.1 404 Not Found");  
			exit('{"status":"203","reason":"无车次信息！","data":""}');
		}
		
		//处理返回的字符串
		$return_json = new StdClass();
		$return_json->status = '200';
		$return_json->reason = '成功的返回';
		$return_json->rate = $this->GetCurrencyRate();
		$return_json->mainland_deliver = 9;
		$return_json->others_deliver = 12;
		$return_json->data = array();
		$return_json->endata = array();
		
		//如果有结果则进行字符串处理
		foreach($obj as $key=>$item){
			//发车规则处理
			$item->trainrule = array();
			$item->trainrule['include'] = array();
			$item->trainrule['exclusive'] = array();
			foreach(json_decode($item->DateRule)->DateRule as $key_rule=>$rules){
				if(!empty($rules)){
					if($key_rule == 'include'){
						$item->trainrule['include'] = $rules;
					}else if($key_rule == 'exclusive'){
						$item->trainrule['exclusive'] = $rules;
					}
				}
			}
			
			//价格处理
			$item->adult_seat = array();
			$item->child_seat = array();
			
			$price_arr = json_decode($item->seatPriceInfo2);
			$audlt = $price_arr->price;
			$child = $price_arr->cprice;
			
			if(!empty($audlt)){
				$i=0;
				foreach($audlt as $key_adult=>$value){
					$seat_name = $this->BIZ_intel_train_model->get_seatname($key_adult)->Seat_EName1;
					$item->adult_seat[$i]['name'] = $seat_name;
					$item->adult_seat[$i]['code'] = $key_adult;
					$item->adult_seat[$i]['price'] = $value;
					$item->adult_seat[$i]['pic'] = $this->BIZ_intel_train_model->get_seatname($key_adult)->Seat_Pic;
					$i++;
				}
			}
			
			if(!empty($child)){
				$j=0;
				foreach($child as $key_child=>$value){
					$seat_name = $this->BIZ_intel_train_model->get_seatname($key_child)->Seat_EName1;
					$item->child_seat[$j]['name'] = $seat_name;
					$item->child_seat[$j]['code'] = $key_child;
					$item->child_seat[$j]['price'] = $value;
					$j++;
				}
			}
			
			
			//最后进行当前日期判断，对数据进行分组
			$flag = $this->checkDateRule($trainDate,$item->DateRule);
			if(!$flag){
				//将不符合发车日期的列车放入到另外一个数组中存储起来
				array_push($return_json->endata,$obj[$key]);
			}else{
				array_push($return_json->data,$obj[$key]);
			}
		}
		print_r(json_encode($return_json));
	}
	
	//获取所有的列车信息
	public function get_all_inteltrain(){
		$obj = $this->BIZ_intel_train_model->get_allinteltrain();
		
		print_r(json_encode($obj));
	}
	
	//查询某一趟列车的途径站
	public function search_train_station($train_no){
	    if(!$train_no){
	        header("HTTP/1.1 404 Not Found");
	        exit('{"status":"404","reason":"列车编号为空"}');
	    }
	    
	    $arr = $this->BIZ_intel_train_model->get_train_station($train_no);
	    if(!empty($arr)){
	        echo json_encode($arr);
	    }else{
	        header("HTTP/1.1 404 Not Found");
	        exit('{"status":"404","reason":"途径站为空"}');
	    }
	    
	}
	
	//获取国际火车出发规则
	public function get_station_rules(){
		//获取所有站点的列表
		$return_json = array();
		$return_json['TrainList'] = array();
		$all_stations = $this->BIZ_intel_train_model->get_allstations();
		$i = 0;
		
		foreach($all_stations as $item){
			$rule_arr = $this->BIZ_intel_train_model->get_train_rules($item->station_id);
			if(!empty($rule_arr)){
				
				
				$return_json['TrainList'][$i]['FromStation'] = $item->s_ename;
				$return_json['TrainList'][$i]['FromCountry'] = $item->s_country;
				$return_json['TrainList'][$i]['ToStations'] = array();
				
				$j = 0;
				foreach($rule_arr as $rule_info){
					$return_json['TrainList'][$i]['ToStations'][$j]['Message'] = $rule_info->tsi_Message;
					$return_json['TrainList'][$i]['ToStations'][$j]['Station'] = $rule_info->S_ename;
					$return_json['TrainList'][$i]['ToStations'][$j]['StationCountry'] = $rule_info->s_country;
					$j++;
				}
				$i++;
			}
		}
		//print_r($return_json);
		header('Content-type: application/json');
		print_r(json_encode($return_json));
	}
	
	//获取国际火车出发规则
	public function ch_station_rules(){
		//获取所有站点的列表
		$return_json = array();
		$return_json['TrainList'] = array();
		$all_stations = $this->BIZ_intel_train_model->ch_allstations();
		$i = 0;
		//print_r($all_stations);
		$data = array();
		
		foreach($all_stations as $item){
			$todata = new stdClass();
			if($item->fromStationName == 'Beijing West'){
				$item->fromStationName = 'Beijing';
			}
			if(isset($data[$item->fromStationName])){
				$todata->Message = $item->tsi_Message;
				$todata->Station = $item->toStationName;
				$todata->StationCountry = $item->toStationCountry;
				array_push($data[$item->fromStationName]->ToStations,$todata);
			}else{
				$data[$item->fromStationName] = new stdClass();
				$data[$item->fromStationName]->FromCountry = $item->fromStationCountry;
				$data[$item->fromStationName]->FromStation = $item->fromStationName;
				$data[$item->fromStationName]->ToStations = array();
				$todata->Message = $item->tsi_Message;
				$todata->Station = $item->toStationName;
				$todata->StationCountry = $item->toStationCountry;
				array_push($data[$item->fromStationName]->ToStations,$todata);
			}
		}
		
		foreach ($data as $rules){
			array_push($return_json['TrainList'],$rules);
		}
		
		header('Content-type: application/json');
		print_r(json_encode($return_json));
	}
	
	function checkDateRule($strDate, $jsonDate){
		if (!strtotime($strDate)) {
			return false;
		}
		$strDate_t = strtotime($strDate);
		$strDate = date("Y-m-d", $strDate_t);
		$dYear = date("Y", $strDate_t);
		$dMonth = date("m", $strDate_t);
		$dDay = date("d", $strDate_t);
		$dWeek = date("w", $strDate_t); //星期的第几天数组（0-6）

		//单双日	
		if ($dDay % 2 == 0) {
			$dSingle = 2;
		} else {
			$dSingle = 1;
		}

		$jObject = json_decode($jsonDate);
		$result = false;

		//先判断排除规则，有一条符合就返回false
		if (isset($jObject->DateRule->exclusive) ) {
			$jObject_exclusive = $jObject->DateRule->exclusive;

			foreach ($jObject_exclusive as  $key => $val) {
				if ($val->dateType=="EveryDay" ) { //每天,这个基本不会出现，设置每天排除和关闭没区别
					return false;
				} elseif ($val->dateType=="WeekDay" ) { //按星期
					//先判断是否在日期范围内，再判断星期是否对应
					$bw_CheckRange = false; //是否需要判断星期几
					if ($val->dateRange == "*") { //每天
						$bw_CheckRange = true;
					} else {
						$dateRange = explode("|", $val->dateRange); //日期范围
						if (count($dateRange) == 2) {
							if ($strDate_t >= strtotime($dateRange[0]) and $strDate_t <= strtotime($dateRange[1])) {
								$bw_CheckRange = true; //在范围内
							}
						}

					}
					
					if ($bw_CheckRange) {
						if ($dWeek==0) {
							$dWeek=7; //星期0为星期天，我们保存的星期天是7
						}
						$weekArr = explode(",", $val->dateData); //星期数据1,2,3,4,5,6,7这种
						foreach ($weekArr as $week) {
							if ($week == $dWeek) {
								return false;
							}    
						}
					}
				} elseif ($val->dateType == "SelectDay") { //固定日期
					if ($val->dateRange=="*") {
						$SelectDayArr = explode(",", $val->dateData);
						foreach ($SelectDayArr as $sDay) {
							if (strtotime($sDay) == $strDate_t) {
								return false;
							}
						}
					}
				} elseif ($val->dateType == "RangeDay") { //连续日期
					if ($val->dateRange == "*") {
						$RangeDateArr = explode("|", $val->dateData);
						if (count($RangeDateArr)==2) {
							if ($strDate_t >= strtotime($RangeDateArr[0]) and $strDate_t <= strtotime($RangeDateArr[1])) {
								return false ; //在范围内
							}
						}

					}
				}
			}
		}

		//再判断包含规则，有一条符合就为true
		if (isset($jObject->DateRule->include)) {
			$jObject_include = $jObject->DateRule->include;

			foreach ($jObject_include as $key => $val) {
				if ($val->dateType == "EveryDay") { //每天
					return true;
				} elseif ($val->dateType == "WeekDay") { //按星期
					//先判断是否在日期范围内，再判断星期是否对应
					$bw_CheckRange = false; //是否需要判断星期几
					if ($val->dateRange == "*") { //每天
						$bw_CheckRange = true;
					} else {
						$dateRange = explode("|", $val->dateRange); //日期范围
						if (count($dateRange) == 2) {
							if ($strDate_t >= strtotime($dateRange[0]) and $strDate_t <= strtotime($dateRange[1])) {
								$bw_CheckRange = true; //在范围内
							}
						}

					}

					if ($bw_CheckRange) {
						if ($dWeek == 0) {
							$dWeek = 7; //星期0为星期天，我们保存的星期天是7
						}
						$weekArr = explode(",", $val->dateData); //星期数据1,2,3,4,5,6,7这种
						foreach ($weekArr as $week) {
							if ($week == $dWeek) {
								return true;
							}
						}
					}
				} elseif ($val->dateType=="MonthDay") { //每月单双
					if ($val->dateRange=="*") {
						$MonthDayArr = explode(",", rtrim($val->dateData, ',')); //月单双数据m3:2,m4:1
						foreach ($MonthDayArr as $MonthKey) {
							$MonthArr = explode(":", $MonthKey);
							$Month = str_pad(str_replace("m", "", $MonthArr[0]), 2, "0", STR_PAD_LEFT);  //存储的月份补0，好比较
							if ($dMonth == $Month) { //月份相同比较
								if ($dSingle == $MonthArr[1]) {
									return true;
								} 
							}
						}
					}
				} elseif ($val->dateType == "SelectDay") { //固定日期
					if ($val->dateRange=="*") {
						$SelectDayArr = explode(",", $val->dateData);
						foreach ($SelectDayArr as $sDay) {
							if (strtotime($sDay) == $strDate_t) {
								return true;
							}
						}
					}
				} elseif ($val->dateType == "RangeDay") { //连续日期
					if ($val->dateRange == "*") {
						$RangeDateArr = explode("|", $val->dateData);
						if (count($RangeDateArr)==2) {
							if ($strDate_t >= strtotime($RangeDateArr[0]) and $strDate_t <= strtotime($RangeDateArr[1])) {
								return true ; //在范围内
							}
						}

					}
				}
			}

		}
		
		return $result;
	}
	
	
}