<?php

class CdekIntegrator {

	private $url					 = 'http://gw.edostavka.ru:11443';
	//авторизация ИМ - тестовые
//	private $authLogin		 = '4b7b72eeb173b1ba507a05ac7e1f59c6';
//	private $authPassword	 = 'ea4f5e66487d1432ad734857b77b6c2e';

	// при очередном изменении параметров,  новые - в п.1, предыдущие - п.2, еще более старые - п.3
	// сейчас проверяется по двум последним кабинетам
	
	// 1. авторизация ИМ - боевые
	private $authLogin		 = 'a9a377aa2f76d24a731cd2f5e82b45ac'; // 3. old private $authLogin		 = '64bdfe8e00db10ffeab6e2b8562f1c8f'; 
	private $authPassword	 = 'c49e61fce4389abeccf7a4c0c3982cb7'; // 3. old private $authPassword	 = 'e7addf774d3db59c835b936d7f976bf4';
	//2. авторизация ИМ - боевые - OLD
  private $authLoginOld		 = '3331fec8bbc819e35d039a182b22ccc0';
	private $authPasswordOld	 = '636d5cf05707526865ebbc3ee85db92e';
	
	public function __construct() {
		$this->dateExecute = date('Y-m-d');
	}

	public function setDateExecute($date) {
		$this->dateExecute = date($date);
	}

	private function _getSecureAuthPassword() {
		return md5($this->dateExecute . '&' . $this->authPassword);
	}
	
	private function _getSecureAuthPasswordOld() {
		return md5($this->dateExecute . '&' . $this->authPasswordOld);
	}

	public function addDelivery($partnerId) {
		if ($partnerId && is_numeric($partnerId)) {
			return $this->addDeliveries(Partner::whereId($partnerId)->get());
		}
		return false;
	}

	public function addDeliveries($partners, $cdekDeliveryRequest) {
		$this->url = 'http://gw.edostavka.ru:11443/new_orders.php';
		if ($partners->count()) {

			$this->setDateExecute($cdekDeliveryRequest->date);
			$xml = View::make('crm.cdek.xml_new_orders')
							->with('partners', $partners)
							->with('cdekDeliveryRequest', $cdekDeliveryRequest)
							->with('date', $this->dateExecute)
							->with('authLogin', $this->authLogin)
							->with('authPassword', $this->_getSecureAuthPassword())
							->render();
			$xml = '<?xml version="1.0" encoding="UTF-8" ?>' . $xml;
			$res = $this->_sendRequest($xml);
			return $this->_from_xml($res);
		}
	}

	public function getStatus($partner) {
		$this->url = 'http://gw.edostavka.ru:11443/status_report_h.php';
		$xml			 = View::make('crm.cdek.xml_status_report_h')
						->with('partner', $partner)
						->with('date', $this->dateExecute)
						->with('authLogin', $this->authLogin)
						->with('authPassword', $this->_getSecureAuthPassword())
						->render();
		$xml			 = '<?xml version="1.0" encoding="UTF-8" ?>' . $xml;
		$res			 = $this->_sendRequest($xml);
		return $this->_from_xml($res);
	}
	
	// проверка по старому кабинету
	public function getStatusOld($partner) {
		$this->url = 'http://gw.edostavka.ru:11443/status_report_h.php';
		$xml			 = View::make('crm.cdek.xml_status_report_h')
						->with('partner', $partner)
						->with('date', $this->dateExecute)
						->with('authLogin', $this->authLoginOld)
						->with('authPassword', $this->_getSecureAuthPasswordOld())
						->render();
		$xml			 = '<?xml version="1.0" encoding="UTF-8" ?>' . $xml;
		$res			 = $this->_sendRequest($xml);
		return $this->_from_xml($res);
	}

	public function deleteOrder($partner) {
		if ($partner) {
			$this->url = 'http://gw.edostavka.ru:11443/delete_orders.php';
			$xml			 = View::make('crm.cdek.xml_delete_orders')
							->with('partner', $partner)
							->with('date', $this->dateExecute)
							->with('authLogin', $this->authLogin)
							->with('authPassword', $this->_getSecureAuthPassword())
							->render();
			$xml			 = '<?xml version="1.0" encoding="UTF-8" ?>' . $xml;
			$res			 = $this->_sendRequest($xml);
			return $this->_from_xml($res);
		}
		return false;
	}

	public function ordersPrint($partners) {
		if ($partners) {
			$this->url = 'http://gw.edostavka.ru:11443/orders_print.php';
			$xml			 = View::make('crm.cdek.xml_orders_print')
							->with('partners', $partners)
							->with('date', $this->dateExecute)
							->with('authLogin', $this->authLogin)
							->with('authPassword', $this->_getSecureAuthPassword())
							->render();
			$xml			 = '<?xml version="1.0" encoding="UTF-8" ?>' . $xml;
			$res			 = $this->_sendRequest($xml);
			return $res;
		}
		return false;
	}

	protected function _from_xml($string) {
		$_arr	 = is_string($string) ? simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA) : $string;
		$arr	 = array();

		// Convert all objects SimpleXMLElement to array recursively
		foreach ((array) $_arr as $key => $val) {
			$arr[$key] = (is_array($val) or is_object($val)) ? $this->_from_xml($val) : $val;
		}

		return $arr;
	}

	protected function _sendRequest($xml) {
		$curl	 = curl_init();
		curl_setopt($curl, CURLOPT_URL, $this->url);
		curl_setopt($curl, CURLOPT_POST, 1);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_POSTFIELDS, 'xml_request=' . $xml);
		$res	 = curl_exec($curl);
		curl_close($curl);

		return $res;
	}

}
