<?php

class notifymodel {

	var $base;
	var $db;
	var $operations;

	function __construct(&$base) {
		$this->notifymodel($base);
	}

	function notifymodel(&$base) {
		$this->base =& $base;
		$this->db =& $base->db;
		$this->operations = array(
			'updatesyncredit' => array('Cache', 'updatesyncredit'),
			'syncredit' => array('Credit', 'syncredit'),
			'altername' => array('User', 'alterName'),
			'deluser' => array('User', 'deluser')
		);
	}

	function add($type, $data, $exceptself = false, $exceptuc = false) {
		$myApp = $this->base->load('app');
		$applist = $myApp->applist();
	
		$pwSQL = array(
			'action' => $type,
			'param' => is_array($data) ? serialize($data) : '',
			'timestamp' => $this->base->time
		);
		$notify = array();
		foreach ($applist as $key => $app) {
			if (($exceptself && $key == $this->base->appid) || ($app['uc'] && $exceptuc)) {
				$pwSQL['app'.$key] = 1;
			} else {
				$notify[] = array('uc_notifyexists' . $key, 1);
			}
		}
		$this->db->update("INSERT INTO pw_ucnotify SET " . UC::sqlSingle($pwSQL));
		$nid = $this->db->insert_id();
		if ($notify) {
			$this->db->update("REPLACE INTO pw_config (db_name,db_value) VALUES " . UC::sqlMulti($notify));
		}
		return $nid;
	}

	function send($nid = null, $appid = null) {
		!$appid && $appid = $this->base->appid;
		register_shutdown_function(array($this, '_send'), $nid, $appid);
	}

	function _send($nid, $appid) {
		$myApp = $this->base->load('app');
		$applist = $myApp->applist();
		if (!$app = $applist[$appid]) {
			return false;
		}
		if ($nid) {
			$data = $this->get_by_id($nid);
		} else {
			$data = $this->get_by_one($appid);
			if (!$data) {
				$this->db->query("UPDATE pw_config SET db_value='0' WHERE db_name=" . UC::escape('uc_notifyexists'.$appid));
			}
			$nid = $data['nid'];
		}
		if (!$data) {
			return false;
		}
		$field = 'app' . $appid;

		if ($appid == $this->base->appid && file_exists(R_P . 'api/class_base.php')) {
			include_once(R_P . 'api/class_base.php');
			$api  = new api_client();
			$resp = $api->dataFormat($api->callback($this->operations[$data['action']][0], $this->operations[$data['action']][1], $data['param'] ? unserialize($data['param']) : array()));
			$success = isset($resp['result']);
		} else {
			$resp = $myApp->ucfopen($app['siteurl'], $app['interface'], $app['secretkey'], $this->operations[$data['action']][0], $this->operations[$data['action']][1], $data['param'] ? unserialize($data['param']) : array());
			$success = isset($resp['result']);
		}
		if ($success) {
			$data[$field] = 1;
			$pwSQL = array(
				$field => 1,
				'complete' => $this->isComplete($data, $applist) ? 1 : 0
			);
			$this->db->update("UPDATE pw_ucnotify SET " . UC::sqlSingle($pwSQL) . ' WHERE nid=' . UC::escape($nid));
		}
	}

	function send_by_id($nid) {
		$data = $this->get_by_id($nid);
		if ($data && !$data['complete']) {
			$pwSQL = array();
			$myApp = $this->base->load('app');
			$applist = $myApp->applist();
			foreach ($applist as $key => $app) {
				if ($data['app'.$key] < 1) {
					$resp = $myApp->ucfopen($app['siteurl'], $app['interface'], $app['secretkey'], $this->operations[$data['action']][0], $this->operations[$data['action']][1], $data['param'] ? unserialize($data['param']) : array());
					if (isset($resp['result'])) {
						$data['app'.$key] = 1;
						$pwSQL['app'.$key] = 1;
					}
				}
			}
			$pwSQL['complete'] = $this->isComplete($data, $applist) ? 1 : 0;
			$this->db->update("UPDATE pw_ucnotify SET " . UC::sqlSingle($pwSQL) . ' WHERE nid=' . UC::escape($nid));
		}
	}

	function isComplete($notify, $apps) {
		foreach ($apps as $key => $app) {
			if ($notify['app'.$key] < 1) {
				return false;				
			}
		}
		return true;
	}

	function get_by_one($appid) {
		$field = 'app' . $appid;
		$data = $this->db->get_one("SELECT * FROM pw_ucnotify WHERE $field<'1' LIMIT 1");
		return $data;
	}

	function get_by_id($nid) {
		$data = $this->db->get_one("SELECT * FROM pw_ucnotify WHERE nid=" . UC::escape($nid));
		return $data;
	}
}
?>