<?php

class SmartResponder {

	const GROUP_PAID_CONSULT	 = 0;
	const GROUP_PAID_GENERATOR = 0;
	const DELIVERY_ID					 = 712143;

	protected $config		 = array(
//			'api_id'	 => '646517',
			'api_key'	 => 'Cm87V1K2NDyZjkBBWwBlj0fkUQmrrlrt',
			'format'	 => 'json'
	);
	public $error				 = NULL;
	public $debug				 = FALSE;
	public $debug_output = '';

	// Получает данные подписчика по email
	function getSubscriber($email) {
		$this->debugLog('getSubscriber start');

		$data = array(
				'action'				 => 'list',
				'search[email]'	 => $email,
		);

		$results = $this->query('http://api.smartresponder.ru/subscribers.html', $data);

		if ($results !== FALSE) {
			if (isset($results['list']['elements'][0])) {
				return $results['list']['elements'][0];
			}
		}
		return FALSE;
	}

	// добавление подписчика вообще или в конкретный список
	// умееет корректно работать если подписчик уже добавлен
	function addSubscriber($s_data, $delivery_id = SmartResponder::DELIVERY_ID) {
		$this->debugLog('addSubscriber start');

		$subscriber = $this->getSubscriber($s_data['email']);

		if ($subscriber !== FALSE) {
			$this->debugLog('subscriber exists:');
			$this->debugLog($subscriber);

			// если подписчик уже у нас есть - просто добавляем его в список рассылки
			$data		 = array(
					'action'				 => 'link_with_delivery',
					'search[email]'	 => $s_data['email'],
					'delivery_id'		 => $delivery_id,
			);
			$results = $this->query('http://api.smartresponder.ru/subscribers.html', $data);
			$this->debugLog('Add in list result:');
			$this->debugLog($results);

			return $results;
		}
		else {
			$this->debugLog('subscriber not found');

			$data		 = array(
					'action'			 => 'create',
					'first_name'	 => ((!isset($s_data['first_name']) && isset($s_data['name'])) ? $s_data['name'] : $s_data['first_name']),
					'email'				 => $s_data['email'],
					'sex'					 => '',
					'delivery_id'	 => $delivery_id,
			);
			$results = $this->query('http://api.smartresponder.ru/subscribers.html', $data);
			$this->debugLog('Results of adding in list:');
			$this->debugLog($results);

			if ($results !== FALSE) {
				if (isset($results['id'])) {
					return $results['id'];
				}
			}
		}
		return FALSE;
	}

	// просто исключает подписчика из выбранной рассылки но не удаляет его из общего списка
	function deleteSubscriber($email, $delivery_id = SmartResponder::DELIVERY_ID) {
		$this->debugLog('deleteSubscriber start');

		$data		 = array(
				'action'				 => 'unlink_with_delivery',
				'delivery_id'		 => $delivery_id,
				'search[email]'	 => $email,
		);
		$results = $this->query('http://api.smartresponder.ru/subscribers.html', $data);
		$this->debugLog('Results of deleting from the list:');
		$this->debugLog($results);

		if ($results !== FALSE && $results['result'] == 1) {
			return TRUE;
		}
		return FALSE;
	}

	// добавление подписчика в группу
	function addGroup($email, $group_id = SmartResponder::GROUP_PAID_CONSULT) {
		$this->debugLog('addGroup start');

		$subscriber = $this->getSubscriber($email);

		if ($subscriber !== FALSE) {
			$this->debugLog('subscriber exists:');
			$this->debugLog($subscriber);

			// если подписчик уже у нас есть - просто добавляем его в список рассылки
			$data		 = array(
					'action'				 => 'link_with_group',
					'search[email]'	 => $email,
					'group_id'			 => $group_id,
			);
			$results = $this->query('http://api.smartresponder.ru/subscribers.html', $data);
			$this->debugLog('Add in group result:');
			$this->debugLog($results);

			return $results;
		}
		return FALSE;
	}

	// просто исключает подписчика из выбранной группы
	function deleteGroup($email, $group_id = SmartResponder::GROUP_PAID_CONSULT) {
		$this->debugLog('deleteGroup start');

		$data		 = array(
				'action'				 => 'unlink_with_group',
				'group_id'			 => $group_id,
				'search[email]'	 => $email,
		);
		$results = $this->query('http://api.smartresponder.ru/subscribers.html', $data);
		$this->debugLog('Results of deleting from the group:');
		$this->debugLog($results);

		if ($results !== FALSE && $results['result'] == 1) {
			return TRUE;
		}
		return FALSE;
	}

	// подписка на рассылку
	function subscribe($email, $delivery_id = SmartResponder::DELIVERY_ID) {
		$this->debugLog('subscribe start');

		$subscriber = $this->getSubscriber($email);

		if ($subscriber !== FALSE) {
			$this->debugLog('subscriber exists:');
			$this->debugLog($subscriber);

			if (is_array($subscriber['deliveries'])) {
				$data		 = array(
						'action'				 => 'on_delivery',
						'delivery_id'		 => $delivery_id,
						'search[email]'	 => $email,
				);
				$results = $this->query('http://api.smartresponder.ru/subscribe.html', $data);
			}
			$this->debugLog('Subscribe result:');
			$this->debugLog($results);

			return $results;
		}
		return FALSE;
	}

	function query($url, $data) {
		$data = array_merge($this->config, $data);

		$content = http_build_query($data);

		$options = array(
				'http' => array(
						'method'	 => 'POST',
						'content'	 => $content,
						'header'	 => "Connection: close\r\n" .
						"Content-Type: application/x-www-form-urlencoded\r\n" .
						"Content-Length: " . strlen($content) . "\r\n",
				)
		);
		$context = stream_context_create($options);
		$results = file_get_contents($url, false, $context);

		return $this->objectToArray($this->saveErrors(json_decode($results)));
	}

	function saveErrors($results) {
		if (isset($results->error)) {
			$this->error = $results->error->message . '(code:' . $results->error->code . ')';
			return FALSE;
		}
		else {
			$this->error = NULL;

			return $results;
		}
	}

	function debugLog($text, $is_results = FALSE) {
		if (TRUE === $this->debug) {
			if (is_string($text)) {

			}
			elseif (is_array($text)) {
				ob_start();
				print_r($text);
				$text = ob_get_clean();
			}
			elseif (is_object($text)) {
				$text = json_encode($text);
			}
			else {
				if (TRUE === $is_results && NULL !== $this->error) {
					// добавляем лог ошибки если она есть
					$postfix = '(return error:' . $this->error . ')';
				}

				ob_start();
				var_dump($text);
				$text = ob_get_clean();
			}

			$this->debug_output .= trim($text) . ';' . ((isset($postfix)) ? $postfix : '') . "<br />\r\n";
		}
	}

	// stdClass в многомерный массив
	function objectToArray($d) {
		if (is_object($d)) {
			$d = get_object_vars($d);
		}

		if (is_array($d)) {
			return array_map(array(&$this, 'objectToArray'), $d); // __FUNCTION__
		}
		else {
			return $d;
		}
	}

}
