<?php

/**

 * [WeEngine System] Copyright (c) 2014 WE7.CC

 * WeEngine is NOT a free software, it under the license terms, visited http://www.we7.cc/ for more details.

 */

defined('IN_IA') or exit('Access Denied');





function uni_owned($uid = 0, $is_uni_fetch = true) {

	global $_W;

	$uid = intval($uid) > 0 ? intval($uid) : $_W['uid'];

	$uniaccounts = array();



	$user_accounts = uni_user_accounts($uid);

	if (empty($user_accounts)) {

		return $uniaccounts;

	}



	if (!empty($user_accounts) && !empty($is_uni_fetch)) {

		foreach ($user_accounts as &$row) {

			$row = uni_fetch($row['uniacid']);

		}

	}

	return $user_accounts;

}





function uni_user_accounts($uid = 0, $type = 'app') {

	global $_W;

	$uid = intval($uid) > 0 ? intval($uid) : $_W['uid'];

	if (!in_array($type, array('app', 'wxapp', 'webapp'))) {

		$type = 'app';

	}

	$type = $type == 'app' ? 'wechats' : $type;

	$cachekey = cache_system_key("user_{$type}_accounts:{$uid}");

	$cache = cache_load($cachekey);

	if (!empty($cache)) {

		return $cache;

	}

	$field = '';

	$where = '';

	$params = array();

	$user_is_founder = user_is_founder($uid);

	if (empty($user_is_founder) || user_is_vice_founder($uid)) {

		$field .= ', u.role';

		$where .= " LEFT JOIN " . tablename('uni_account_users') . " u ON u.uniacid = w.uniacid WHERE u.uid = :uid AND u.role IN(:role1, :role2) ";

		$params[':uid'] = $uid;

		$params[':role1'] = ACCOUNT_MANAGE_NAME_OWNER;

		$params[':role2'] = ACCOUNT_MANAGE_NAME_VICE_FOUNDER;

	}

	$where .= !empty($where) ? " AND a.isdeleted <> 1 AND u.role IS NOT NULL" : " WHERE a.isdeleted <> 1";



	$sql = "SELECT w.*, a.type" . $field . " FROM " . tablename('account_' . $type) . " w LEFT JOIN " . tablename('account') . " a ON a.acid = w.acid AND a.uniacid = w.uniacid" . $where;

	$result = pdo_fetchall($sql, $params, 'uniacid');

	cache_write($cachekey, $result);

	return $result;

}





function account_owner($uniacid = 0) {

	global $_W;

	load()->model('user');

	$uniacid = intval($uniacid);

	if (empty($uniacid)) {

		return array();

	}

	$ownerid = pdo_getcolumn('uni_account_users', array('uniacid' => $uniacid, 'role' => 'owner'), 'uid');

	if (empty($ownerid)) {

		$ownerid = pdo_getcolumn('uni_account_users', array('uniacid' => $uniacid, 'role' => 'vice_founder'), 'uid');

		if (empty($ownerid)) {

			$founders = explode(',', $_W['config']['setting']['founder']);

			$ownerid = $founders[0];

		}

	}

	$owner = user_single($ownerid);

	if (empty($owner)) {

		return array();

	}

	return $owner;

}



function uni_accounts($uniacid = 0) {

	global $_W;

	$uniacid = empty($uniacid) ? $_W['uniacid'] : intval($uniacid);

	$account_info = pdo_get('account', array('uniacid' => $uniacid));

	if (!empty($account_info)) {

		$accounts = pdo_fetchall("SELECT w.*, a.type, a.isconnect FROM " . tablename('account') . " a INNER JOIN " . tablename(uni_account_tablename($account_info['type'])) . " w USING(acid) WHERE a.uniacid = :uniacid AND a.isdeleted <> 1 ORDER BY a.acid ASC", array(':uniacid' => $uniacid), 'acid');

	}

	return !empty($accounts) ? $accounts : array();

}





function uni_fetch($uniacid = 0) {

	global $_W;

	load()->model('mc');



	$uniacid = empty($uniacid) ? $_W['uniacid'] : intval($uniacid);

	$cachekey = "uniaccount:{$uniacid}";

	$cache = cache_load($cachekey);

	if (!empty($cache)) {

		return $cache;

	}



	$acid = table('account')->getAccountByUniacid($uniacid);

	if (empty($acid)) {

		return false;

	}

	$account_api = WeAccount::create($acid['acid']);

	if (is_error($account_api)) {

		return $account_api;

	}

	$account = $account_api->account;

	if (empty($account) || $account['isdeleted'] == 1) {

		return array();

	}



	$owner = account_owner($uniacid);



	$account['uid'] = $owner['uid'];

	$account['starttime'] = $owner['starttime'];

	if (!empty($account['endtime'])) {

		$account['endtime'] = $account['endtime'] == '-1' ? 0 : $account['endtime'];

	} else {

		$account['endtime'] = $owner['endtime'];

	}



	$account['groups'] = mc_groups($uniacid);

	$account['setting'] = uni_setting($uniacid);

	$account['grouplevel'] = $account['setting']['grouplevel'];

	$account['logo'] = tomedia('headimg_'.$account['acid']. '.jpg').'?time='.time();

	$account['qrcode'] = tomedia('qrcode_'.$account['acid']. '.jpg').'?time='.time();



		$account['switchurl'] = wurl('account/display/switch', array('uniacid' => $account['uniacid']));

		if (!empty($account['settings']['notify'])) {

		$account['sms'] = $account['setting']['notify']['sms']['balance'];

	} else {

		$account['sms'] = 0;

	}

		$account['setmeal'] = uni_setmeal($account['uniacid']);



	cache_write($cachekey, $account);

	return $account;

}





function uni_site_store_buy_goods($uniacid, $type = STORE_TYPE_MODULE) {

	$cachekey = cache_system_key($uniacid . ':site_store_buy_' . $type);

	$site_store_buy_goods = cache_load($cachekey);

	if (!empty($site_store_buy_goods)) {

		return $site_store_buy_goods;

	}

	$store_table = table('store');

	if ($type != STORE_TYPE_API) {

		$store_table->searchWithEndtime();

		$site_store_buy_goods = $store_table->searchAccountBuyGoods($uniacid, $type);

		$site_store_buy_goods = array_keys($site_store_buy_goods);

	} else {

		$site_store_buy_goods = $store_table->searchAccountBuyGoods($uniacid, $type);

		$setting = uni_setting_load('statistics', $uniacid);

		$use_number = isset($setting['statistics']['use']) ? intval($setting['statistics']['use']) : 0;

		$site_store_buy_goods = $site_store_buy_goods - $use_number;

	}

	cache_write($cachekey, $site_store_buy_goods);

	return $site_store_buy_goods;

}









function uni_modules_by_uniacid($uniacid, $enabled = true) {

	global $_W;

	load()->model('user');

	load()->model('module');

	$cachekey = cache_system_key(CACHE_KEY_ACCOUNT_MODULES, $uniacid, $enabled);

	$modules = cache_load($cachekey);

	if (empty($modules)) {

		$founders = explode(',', $_W['config']['setting']['founder']);

		$owner_uid = pdo_getcolumn('uni_account_users',  array('uniacid' => $uniacid, 'role' => 'owner'), 'uid');

		$condition = "WHERE 1";

		$site_store_buy_goods = array();

		

			$account_info = uni_fetch($_W['uniacid']);

			$goods_type = $account_info['type'] == ACCOUNT_TYPE_APP_NORMAL ? STORE_TYPE_WXAPP_MODULE : STORE_TYPE_MODULE;

			$site_store_buy_goods = uni_site_store_buy_goods($uniacid, $goods_type);

		



		if (!empty($owner_uid) && !in_array($owner_uid, $founders)) {

			$uni_modules = array();

			$packageids = pdo_getall('uni_account_group', array('uniacid' => $uniacid), array('groupid'), 'groupid');

			$packageids = array_keys($packageids);



			if (IMS_FAMILY == 'x') {

				$store = table('store');

				$site_store_buy_package = $store->searchUserBuyPackage($uniacid);

				$packageids = array_merge($packageids, array_keys($site_store_buy_package));

			}

			if (!in_array('-1', $packageids)) {

				$uni_groups = pdo_fetchall("SELECT `modules` FROM " . tablename('uni_group') . " WHERE " .  "id IN ('".implode("','", $packageids)."') OR " . " uniacid = '{$uniacid}'");

				if (!empty($uni_groups)) {

					foreach ($uni_groups as $group) {

						$group_module = (array)iunserializer($group['modules']);

						$uni_modules = array_merge($group_module, $uni_modules);

					}

				}

				$user_modules = user_modules($owner_uid);

				$modules = array_merge(array_keys($user_modules), $uni_modules, $site_store_buy_goods);

				if (!empty($modules)) {

					$condition .= " AND a.name IN ('" . implode("','", $modules) . "')";

				} else {

					$condition .= " AND a.name = ''";

				}

			}

		}

		$condition .= $enabled ?  " AND (b.enabled = 1 OR b.enabled is NULL) OR a.issystem = 1" : " OR a.issystem = 1";

		$sql = "SELECT a.name FROM " . tablename('modules') . " AS a LEFT JOIN " . tablename('uni_account_modules') . " AS b ON a.name = b.module AND b.uniacid = :uniacid " . $condition . " ORDER BY b.displayorder DESC, b.id DESC";

		$modules = pdo_fetchall($sql, array(':uniacid' => $uniacid), 'name');

		cache_write($cachekey, $modules);

	}



	$module_list = array();

	if (!empty($modules)) {

		foreach ($modules as $name => $module) {

			$module_info = module_fetch($name);

			if (!empty($module_info)) {

				$module_list[$name] = $module_info;

			}

		}

	}

	$module_list['core'] = array('title' => '系统事件处理模块', 'name' => 'core', 'issystem' => 1, 'enabled' => 1, 'isdisplay' => 0);

	return $module_list;

}





function uni_modules($enabled = true) {

	global $_W;

	return uni_modules_by_uniacid($_W['uniacid'], $enabled);

}



function uni_modules_app_binding() {

	global $_W;

	$cachekey = cache_system_key(CACHE_KEY_ACCOUNT_MODULES_BINDING, $_W['uniacid']);

	$cache = cache_load($cachekey);

	if (!empty($cache)) {

		return $cache;

	}

	load()->model('module');

	$result = array();

	$modules = uni_modules();

	if(!empty($modules)) {

		foreach($modules as $module) {

			if($module['type'] == 'system') {

				continue;

			}

			$entries = module_app_entries($module['name'], array('home', 'profile', 'shortcut', 'function', 'cover'));

			if(empty($entries)) {

				continue;

			}

			if($module['type'] == '') {

				$module['type'] = 'other';

			}

			$result[$module['name']] = array(

				'name' => $module['name'],

				'type' => $module['type'],

				'title' => $module['title'],

				'entries' => array(

					'cover' => $entries['cover'],

					'home' => $entries['home'],

					'profile' => $entries['profile'],

					'shortcut' => $entries['shortcut'],

					'function' => $entries['function']

				)

			);

			unset($module);

		}

	}

	cache_write($cachekey, $result);

	return $result;

}





function uni_groups($groupids = array(), $show_all = false) {

	load()->model('module');

	global $_W;

	$cachekey = cache_system_key(CACHE_KEY_UNI_GROUP);

	$list = cache_load($cachekey);

	if (empty($list)) {

		$condition = ' WHERE uniacid = 0';

		$list = pdo_fetchall("SELECT * FROM " . tablename('uni_group') . $condition . " ORDER BY id DESC", array(), 'id');

		if (!empty($groupids)) {

			if (in_array('-1', $groupids)) {

				$list[-1] = array('id' => -1, 'name' => '所有服务', 'modules' => array('title' => '系统所有模块'), 'templates' => array('title' => '系统所有模板'));

			}

			if (in_array('0', $groupids)) {

				$list[0] = array('id' => 0, 'name' => '基础服务', 'modules' => array('title' => '系统模块'), 'templates' => array('title' => '系统模板'));

			}

		}

		if (!empty($list)) {

			foreach ($list as $k=>&$row) {

				$row['wxapp'] = array();

				if (!empty($row['modules'])) {

					$modules = iunserializer($row['modules']);

					if (is_array($modules)) {

						$module_list = pdo_getall('modules', array('name' => $modules), array(), 'name');

						$row['modules'] = array();

						if (!empty($module_list)) {

							foreach ($module_list as $key => &$module) {

								$module = module_fetch($key);

								if ($module['wxapp_support'] == MODULE_SUPPORT_WXAPP) {

									$row['wxapp'][$module['name']] = $module;

								}



								if ($module['webapp_support'] == MODULE_SUPPORT_WEBAPP) {

									$row['webapp'][$module['name']] = $module;

								}



								if ($module['phoneapp_support'] == MODULE_SUPPORT_PHONEAPP) {

									$row['phoneapp'][$module['name']] = $module;

								}



								if ($module['app_support'] == MODULE_SUPPORT_ACCOUNT) {

									if (!empty($module['main_module'])) {

										continue;

									}

									$row['modules'][$module['name']] = $module;

									if (!empty($module['plugin'])) {

										$group_have_plugin = array_intersect($module['plugin_list'], array_keys($module_list));

										if (!empty($group_have_plugin)) {

											foreach ($group_have_plugin as $plugin) {

												$row['modules'][$plugin] = module_fetch($plugin);

											}

										}

									}

								}

							}

						}

					}

				}



				if (!empty($row['templates'])) {

					$templates = iunserializer($row['templates']);

					if (is_array($templates)) {

						$row['templates'] = pdo_getall('site_templates', array('id' => $templates), array('id', 'name', 'title'), 'name');

					}

				}

			}

		}

		cache_write($cachekey, $list);

	}

	$group_list = array();

	if (!empty($groupids)) {

		foreach ($groupids as $id) {

			$group_list[$id] = $list[$id];

		}

	} else {

		if (user_is_vice_founder() && empty($show_all)) {

			foreach ($list as $group_key => $group) {

				if ($group['owner_uid'] != $_W['uid']) {

					unset($list[$group_key]);

					continue;

				}

			}

		}

		$group_list = $list;

	}

	return $group_list;

}





function uni_templates() {

	global $_W;

	$owneruid = pdo_fetchcolumn("SELECT uid FROM ".tablename('uni_account_users')." WHERE uniacid = :uniacid AND role = 'owner'", array(':uniacid' => $_W['uniacid']));

	load()->model('user');

		$owner = user_single(array('uid' => $owneruid));

	if (empty($owner) || user_is_founder($owner['uid'])) {

		$groupid = '-1';

	} else {

		$groupid = $owner['groupid'];

	}

	$extend = pdo_getall('uni_account_group', array('uniacid' => $_W['uniacid']), array(), 'groupid');

	if (!empty($extend) && $groupid != '-1') {

		$groupid = '-2';

	}

	if (empty($groupid)) {

		$templates = pdo_fetchall("SELECT * FROM " . tablename('site_templates') . " WHERE name = 'default'", array(), 'id');

	} elseif ($groupid == '-1') {

		$templates = pdo_fetchall("SELECT * FROM " . tablename('site_templates') . " ORDER BY id ASC", array(), 'id');

	} else {

		$group = pdo_fetch("SELECT id, name, package FROM ".tablename('users_group')." WHERE id = :id", array(':id' => $groupid));

		$packageids = iunserializer($group['package']);

		if (!empty($extend)) {

			foreach ($extend as $extend_packageid => $row) {

				$packageids[] = $extend_packageid;

			}

		}

		if(is_array($packageids)) {

			if (in_array('-1', $packageids)) {

				$templates = pdo_fetchall("SELECT * FROM " . tablename('site_templates') . " ORDER BY id ASC", array(), 'id');

			} else {

				$wechatgroup = pdo_fetchall("SELECT `templates` FROM " . tablename('uni_group') . " WHERE id IN ('".implode("','", $packageids)."') OR uniacid = '{$_W['uniacid']}'");

				$ms = array();

				$mssql = '';

				if (!empty($wechatgroup)) {

					foreach ($wechatgroup as $row) {

						$row['templates'] = iunserializer($row['templates']);

						if (!empty($row['templates'])) {

							foreach ($row['templates'] as $templateid) {

								$ms[$templateid] = $templateid;

							}

						}

					}

					$ms[] = 1;

					$mssql = " `id` IN ('".implode("','", $ms)."')";

				}

				$templates = pdo_fetchall("SELECT * FROM " . tablename('site_templates') .(!empty($mssql) ? " WHERE $mssql" : '')." ORDER BY id DESC", array(), 'id');

			}

		}

	}

	if (empty($templates)) {

		$templates = pdo_fetchall("SELECT * FROM " . tablename('site_templates') . " WHERE id = 1 ORDER BY id DESC", array(), 'id');

	}

	return $templates;

}





function uni_setting_save($name, $value) {

	global $_W;

	if (empty($name)) {

		return false;

	}

	if (is_array($value)) {

		$value = serialize($value);

	}

	$unisetting = pdo_get('uni_settings', array('uniacid' => $_W['uniacid']), array('uniacid'));

	if (!empty($unisetting)) {

		pdo_update('uni_settings', array($name => $value), array('uniacid' => $_W['uniacid']));

	} else {

		pdo_insert('uni_settings', array($name => $value, 'uniacid' => $_W['uniacid']));

	}

	$cachekey = "unisetting:{$_W['uniacid']}";

	$account_cachekey = "uniaccount:{$_W['uniacid']}";

	cache_delete($cachekey);

	cache_delete($account_cachekey);

	return true;

}





function uni_setting_load($name = '', $uniacid = 0) {

	global $_W;

	$uniacid = empty($uniacid) ? $_W['uniacid'] : $uniacid;

	$cachekey = "unisetting:{$uniacid}";

	$unisetting = cache_load($cachekey);

	if (empty($unisetting)) {

		$unisetting = pdo_get('uni_settings', array('uniacid' => $uniacid));

		if (!empty($unisetting)) {

			$serialize = array('site_info', 'stat', 'oauth', 'passport', 'uc', 'notify',

				'creditnames', 'default_message', 'creditbehaviors', 'payment',

				'recharge', 'tplnotice', 'mcplugin', 'statistics', 'bind_domain');

			foreach ($unisetting as $key => &$row) {

				if (in_array($key, $serialize) && !empty($row)) {

					$row = (array)iunserializer($row);

				}

			}

		} else {

			$unisetting = array();

		}

		cache_write($cachekey, $unisetting);

	}

	if (empty($unisetting)) {

		return array();

	}

	if (empty($name)) {

		return $unisetting;

	}

	if (!is_array($name)) {

		$name = array($name);

	}

	return array_elements($name, $unisetting);

}



if (!function_exists('uni_setting')) {

	function uni_setting($uniacid = 0, $fields = '*', $force_update = false) {

		global $_W;

		load()->model('account');

		if ($fields == '*') {

			$fields = '';

		}

		return uni_setting_load($fields, $uniacid);

	}

}





function uni_account_default($uniacid = 0) {

	global $_W;

	$uniacid = empty($uniacid) ? $_W['uniacid'] : intval($uniacid);

	$uni_account = pdo_fetch("SELECT * FROM ".tablename('uni_account')." a LEFT JOIN ".tablename('account')." w ON a.uniacid = w.uniacid AND a.default_acid = w.acid WHERE a.uniacid = :uniacid", array(':uniacid' => $uniacid));

		if (empty($uni_account)) {

		$uni_account = pdo_fetch("SELECT * FROM ".tablename('uni_account')." a LEFT JOIN ".tablename('account')." w ON a.uniacid = w.uniacid WHERE a.uniacid = :uniacid ORDER BY w.acid DESC", array(':uniacid' => $uniacid));

	}

	if (!empty($uni_account)) {

		$account = pdo_get(uni_account_tablename($uni_account['type']), array('acid' => $uni_account['acid']));

		if (empty($account)) {

			$account['uniacid'] = $uni_account['uniacid'];

			$account['acid'] = $uni_account['default_acid'];

		}

		$account['type'] = $uni_account['type'];

		$account['isconnect'] = $uni_account['isconnect'];

		$account['isdeleted'] = $uni_account['isdeleted'];

		$account['endtime'] = $uni_account['endtime'];

		return $account;

	}

}



function uni_account_tablename($type) {

	switch ($type) {

		case ACCOUNT_TYPE_OFFCIAL_NORMAL:

		case ACCOUNT_TYPE_OFFCIAL_AUTH:

			return 'account_wechats';

		case ACCOUNT_TYPE_APP_NORMAL:

			return 'account_wxapp';

		case ACCOUNT_TYPE_WEBAPP_NORMAL:

			return 'account_webapp';

		case ACCOUNT_TYPE_PHONEAPP_NORMAL:

			return 'account_phoneapp';

	}

}



function uni_user_account_role($uniacid, $uid, $role) {

	$vice_account = array(

		'uniacid' => intval($uniacid),

		'uid' => intval($uid),

		'role' => trim($role)

	);

	$account_user = pdo_get('uni_account_users', $vice_account, array('id'));

	if (!empty($account_user)) {

		return false;

	}

	return pdo_insert('uni_account_users', $vice_account);

}





function uni_user_see_more_info($user_type, $see_more = false) {

	global $_W;

	if (empty($user_type)) {

		return false;

	}

	if ($user_type == ACCOUNT_MANAGE_NAME_VICE_FOUNDER && !empty($see_more) || $_W['role'] != $user_type) {

		return true;

	}



	return false;

}





function uni_owner_account_nums($uid, $role) {

	$account_num = $wxapp_num = $webapp_num = 0;

	$condition = array('uid' => $uid, 'role' => $role);

	$uniacocunts = pdo_getall('uni_account_users', $condition, array(), 'uniacid');

	if (!empty($uniacocunts)) {

		$all_account = pdo_fetchall('SELECT * FROM (SELECT u.uniacid, a.default_acid FROM ' . tablename('uni_account_users') . ' as u RIGHT JOIN '. tablename('uni_account').' as a  ON a.uniacid = u.uniacid  WHERE u.uid = :uid AND u.role = :role ) AS c LEFT JOIN '.tablename('account').' as d ON c.default_acid = d.acid WHERE d.isdeleted = 0', array(':uid' => $uid, ':role' => $role));

		foreach ($all_account as $account) {

			if ($account['type'] == 1 || $account['type'] == 3) {

				$account_num++;

			}

			if ($account['type'] == 4) {

				$wxapp_num++;

			}

			if ($account['type'] == ACCOUNT_TYPE_WEBAPP_NORMAL) {

				$webapp_num++;

			}

		}

	}

	$num = array(

		'account_num' => $account_num,

		'wxapp_num' =>$wxapp_num,

		'webapp_num'=>$webapp_num

	);

	return $num;

}

function uni_update_week_stat() {

	global $_W;

	$cachekey = "stat:todaylock:{$_W['uniacid']}";

	$cache = cache_load($cachekey);

	if(!empty($cache) && $cache['expire'] > TIMESTAMP) {

		return true;

	}

	$seven_days = array(

		date('Ymd', strtotime('-1 days')),

		date('Ymd', strtotime('-2 days')),

		date('Ymd', strtotime('-3 days')),

		date('Ymd', strtotime('-4 days')),

		date('Ymd', strtotime('-5 days')),

		date('Ymd', strtotime('-6 days')),

		date('Ymd', strtotime('-7 days')),

	);

	$week_stat_fans = pdo_getall('stat_fans', array('date' => $seven_days, 'uniacid' => $_W['uniacid']), '', 'date');

	$stat_update_yes = false;

	foreach ($seven_days as $sevens) {

		if (empty($week_stat_fans[$sevens]) || $week_stat_fans[$sevens]['cumulate'] <=0) {

			$stat_update_yes = true;

			break;

		}

	}

	if (empty($stat_update_yes)) {

		return true;

	}

	foreach($seven_days as $sevens) {

		if($_W['account']['level'] == ACCOUNT_SUBSCRIPTION_VERIFY || $_W['account']['level'] == ACCOUNT_SERVICE_VERIFY) {

			$account_obj = WeAccount::create();

			$weixin_stat = $account_obj->getFansStat();

			if(is_error($weixin_stat) || empty($weixin_stat)) {

				return error(-1, '调用微信接口错误');

			} else {

				$update_stat = array();

				$update_stat = array(

					'uniacid' => $_W['uniacid'],

					'new' => $weixin_stat[$sevens]['new'],

					'cancel' => $weixin_stat[$sevens]['cancel'],

					'cumulate' => $weixin_stat[$sevens]['cumulate'],

					'date' => $sevens,

				);

			}

		} else {

			$update_stat = array();

			$update_stat['cumulate'] = pdo_fetchcolumn("SELECT COUNT(*) FROM " . tablename('mc_mapping_fans') . " WHERE acid = :acid AND uniacid = :uniacid AND follow = :follow AND followtime < :endtime", array(':acid' => $_W['acid'], ':uniacid' => $_W['uniacid'], ':endtime' => strtotime($sevens)+86400, ':follow' => 1));

			$update_stat['date'] = $sevens;

			$update_stat['new'] = $week_stat_fans[$sevens]['new'];

			$update_stat['cancel'] = $week_stat_fans[$sevens]['cancel'];

			$update_stat['uniacid'] = $_W['uniacid'];

		}

		if(empty($week_stat_fans[$sevens])) {

			pdo_insert('stat_fans', $update_stat);

		} elseif (empty($week_stat_fans[$sevens]['cumulate']) || $week_stat_fans[$sevens]['cumulate'] < 0) {

			pdo_update('stat_fans', $update_stat, array('id' => $week_stat_fans[$sevens]['id']));

		}

	}

	cache_write($cachekey, array('expire' => TIMESTAMP + 7200));

	return true;

}





function uni_account_rank_top($uniacid) {

	global $_W;

	if (!empty($_W['isfounder'])) {

		$max_rank = pdo_getcolumn('uni_account', array(), 'max(rank)');

		pdo_update('uni_account', array('rank' => ($max_rank + 1)), array('uniacid' => $uniacid));

	}else {

		$max_rank = pdo_getcolumn('uni_account_users', array('uid' => $_W['uid']), 'max(rank)');

		pdo_update('uni_account_users', array('rank' => ($max_rank['maxrank'] + 1)), array('uniacid' => $uniacid, 'uid' => $_W['uid']));

	}

	return true;

}





function uni_account_last_switch() {

	global $_W, $_GPC;

	$cache_key = cache_system_key(CACHE_KEY_ACCOUNT_SWITCH, $_GPC['__switch']);

	$cache_lastaccount = (array)cache_load($cache_key);



	if (strexists($_W['siteurl'], 'c=webapp')) {

		$uniacid = $cache_lastaccount['webapp'];

	} else if (strexists($_W['siteurl'], 'c=wxapp')) {

		$uniacid = $cache_lastaccount['wxapp'];

	} else if (strexists($_W['siteurl'], 'c=phoneapp')) {

		$uniacid = $cache_lastaccount['phoneapp'];

	} else {

		$uniacid = $cache_lastaccount['account'];

	}



	return $uniacid;

}



function uni_account_switch($uniacid, $redirect = '') {

	global $_W;

	uni_account_save_switch($uniacid);

	isetcookie('__uid', $_W['uid'], 7 * 86400);

	if (!empty($redirect)) {

		header('Location: ' . $redirect);

		exit;

	}

	return true;

}





function uni_account_save_switch($uniacid) {

	global $_W, $_GPC;

	if (empty($_GPC['__switch'])) {

		$_GPC['__switch'] = random(5);

	}



	$cache_key = cache_system_key(CACHE_KEY_ACCOUNT_SWITCH, $_GPC['__switch']);

	$cache_lastaccount = cache_load($cache_key);

	if (empty($cache_lastaccount)) {

		$cache_lastaccount = array(

			'account' => $uniacid,

		);

	} else {

		$cache_lastaccount['account'] = $uniacid;

	}

	cache_write($cache_key, $cache_lastaccount);

	isetcookie('__uniacid', $uniacid, 7 * 86400);

	isetcookie('__switch', $_GPC['__switch'], 7 * 86400);

	return true;

}





function account_create($uniacid, $account) {

	$accountdata = array('uniacid' => $uniacid, 'type' => $account['type'], 'hash' => random(8));

	pdo_insert('account', $accountdata);

	$acid = pdo_insertid();

	$account['acid'] = $acid;

	$account['token'] = random(32);

	$account['encodingaeskey'] = random(43);

	$account['uniacid'] = $uniacid;

	unset($account['type']);

	pdo_insert('account_wechats', $account);

	return $acid;

}





function account_fetch($acid) {

	$account_info = pdo_get('account', array('acid' => $acid));

	if (empty($account_info)) {

		return error(-1, '公众号不存在');

	}

	return uni_fetch($account_info['uniacid']);

}





function uni_setmeal($uniacid = 0) {

	global $_W;

	if(!$uniacid) {

		$uniacid = $_W['uniacid'];

	}

	$owneruid = pdo_fetchcolumn("SELECT uid FROM ".tablename('uni_account_users')." WHERE uniacid = :uniacid AND role = 'owner'", array(':uniacid' => $uniacid));

	if(empty($owneruid)) {

		$user = array(

			'uid' => -1,

			'username' => '创始人',

			'timelimit' => '未设置',

			'groupid' => '-1',

			'groupname' => '所有服务'

		);

		return $user;

	}

	load()->model('user');

	$groups = pdo_getall('users_group', array(), array('id', 'name'), 'id');

	$owner = user_single(array('uid' => $owneruid));

	$user = array(

		'uid' => $owner['uid'],

		'username' => $owner['username'],

		'groupid' => $owner['groupid'],

		'groupname' => $groups[$owner['groupid']]['name']

	);

	if(empty($owner['endtime'])) {

		$user['timelimit'] = date('Y-m-d', $owner['starttime']) . ' ~ 无限制' ;

	} else {

		if($owner['endtime'] <= TIMESTAMP) {

			$user['timelimit'] = '已到期';

		} else {

			$year = 0;

			$month = 0;

			$day = 0;

			$endtime = $owner['endtime'];

			$time = strtotime('+1 year');

			while ($endtime > $time)

			{

				$year = $year + 1;

				$time = strtotime("+1 year", $time);

			};

			$time = strtotime("-1 year", $time);

			$time = strtotime("+1 month", $time);

			while($endtime > $time)

			{

				$month = $month + 1;

				$time = strtotime("+1 month", $time);

			} ;

			$time = strtotime("-1 month", $time);

			$time = strtotime("+1 day", $time);

			while($endtime > $time)

			{

				$day = $day + 1;

				$time = strtotime("+1 day", $time);

			} ;

			if (empty($year)) {

				$timelimit = empty($month)? $day.'天' : date('Y-m-d', $owner['starttime']) . '~'. date('Y-m-d', $owner['endtime']);

			}else {

				$timelimit = date('Y-m-d', $owner['starttime']) . '~'. date('Y-m-d', $owner['endtime']);

			}

			$user['timelimit'] = $timelimit;

		}

	}

	return $user;

}





function uni_is_multi_acid($uniacid = 0) {

	global $_W;

	if(!$uniacid) {

		$uniacid = $_W['uniacid'];

	}

	$cachekey = "unicount:{$uniacid}";

	$nums = cache_load($cachekey);

	$nums = intval($nums);

	if(!$nums) {

		$nums = pdo_fetchcolumn('SELECT COUNT(*) FROM ' . tablename('account_wechats') . ' WHERE uniacid = :uniacid', array(':uniacid' => $_W['uniacid']));

		cache_write($cachekey, $nums);

	}

	if($nums == 1) {

		return false;

	}

	return true;

}



function account_delete($acid) {

	global $_W;

	load()->func('file');

	load()->model('module');

		$account = pdo_get('uni_account', array('default_acid' => $acid));

	if ($account) {

		$uniacid = $account['uniacid'];

		$state = permission_account_user_role($_W['uid'], $uniacid);

		if (!in_array($state, array(ACCOUNT_MANAGE_NAME_OWNER, ACCOUNT_MANAGE_NAME_FOUNDER, ACCOUNT_MANAGE_NAME_VICE_FOUNDER))) {

			itoast('没有该公众号操作权限！', url('account/recycle'), 'error');

		}

		if($uniacid == $_W['uniacid']) {

			isetcookie('__uniacid', '');

		}

		cache_delete("uniaccount:{$uniacid}");

		$modules = array();

				$rules = pdo_fetchall("SELECT id, module FROM ".tablename('rule')." WHERE uniacid = '{$uniacid}'");

		if (!empty($rules)) {

			foreach ($rules as $index => $rule) {

				$deleteid[] = $rule['id'];

			}

			pdo_delete('rule', "id IN ('".implode("','", $deleteid)."')");

		}



		$subaccount = pdo_fetchall("SELECT acid FROM ".tablename('account')." WHERE uniacid = :uniacid", array(':uniacid' => $uniacid));

		if (!empty($subaccount)) {

			foreach ($subaccount as $account) {

				@unlink(IA_ROOT . '/attachment/qrcode_'.$account['acid'].'.jpg');

				@unlink(IA_ROOT . '/attachment/headimg_'.$account['acid'].'.jpg');

				file_remote_delete('qrcode_'.$account['acid'].'.jpg');

				file_remote_delete('headimg_'.$account['acid'].'.jpg');

			}

			if (!empty($acid)) {

				rmdirs(IA_ROOT . '/attachment/images/' . $uniacid);

				@rmdir(IA_ROOT . '/attachment/images/' . $uniacid);

				rmdirs(IA_ROOT . '/attachment/audios/' . $uniacid);

				@rmdir(IA_ROOT . '/attachment/audios/' . $uniacid);

			}

		}



				$tables = array(

			'account','account_wechats', 'account_wxapp', 'wxapp_versions', 'account_webapp', 'account_phoneapp', 'phoneapp_versions', 'core_attachment','core_paylog','core_queue','core_resource',

			'wechat_attachment', 'cover_reply', 'mc_chats_record','mc_credits_recharge','mc_credits_record',

			'mc_fans_groups','mc_groups','mc_handsel','mc_mapping_fans','mc_mapping_ucenter','mc_mass_record',

			'mc_member_address','mc_member_fields','mc_members','menu_event',

			'qrcode','qrcode_stat', 'rule','rule_keyword','site_article','site_category','site_multi','site_nav','site_slide',

			'site_styles','site_styles_vars','stat_keyword', 'stat_rule','uni_account','uni_account_modules','uni_account_users','uni_settings', 'uni_group', 'uni_verifycode','users_permission',

			'mc_member_fields',

		);

		if (!empty($tables)) {

			foreach ($tables as $table) {

				$tablename = str_replace($GLOBALS['_W']['config']['db']['tablepre'], '', $table);

				pdo_delete($tablename, array( 'uniacid'=> $uniacid));

			}

		}

	} else {

		$account = account_fetch($acid);

		if (empty($account)) {

			itoast('子公众号不存在或是已经被删除', '', '');

		}

		$uniacid = $account['uniacid'];

		$state = permission_account_user_role($_W['uid'], $uniacid);

		if($state != ACCOUNT_MANAGE_NAME_FOUNDER && $state != ACCOUNT_MANAGE_NAME_OWNER) {

			itoast('没有该公众号操作权限！', url('account/recycle'), 'error');

		}

		$uniaccount = uni_fetch($account['uniacid']);

		if ($uniaccount['default_acid'] == $acid) {

			itoast('默认子公众号不能删除', '', '');

		}

		pdo_delete('account', array('acid' => $acid));

		pdo_delete('account_wechats', array('acid' => $acid, 'uniacid' => $uniacid));

		cache_delete("uniaccount:{$uniacid}");

		cache_delete("unisetting:{$uniacid}");

		cache_delete('account:auth:refreshtoken:'.$acid);

		$oauth = uni_setting($uniacid, array('oauth'));

		if($oauth['oauth']['account'] == $acid) {

			$acid = pdo_fetchcolumn('SELECT acid FROM ' . tablename('account_wechats') . " WHERE uniacid = :id AND level = 4 AND secret != '' AND `key` != ''", array(':id' => $uniacid));

			pdo_update('uni_settings', array('oauth' => iserializer(array('account' => $acid, 'host' => $oauth['oauth']['host']))), array('uniacid' => $uniacid));

		}

		@unlink(IA_ROOT . '/attachment/qrcode_'.$acid.'.jpg');

		@unlink(IA_ROOT . '/attachment/headimg_'.$acid.'.jpg');

		file_remote_delete('qrcode_'.$acid.'.jpg');

		file_remote_delete('headimg_'.$acid.'.jpg');

	}

	return true;

}





function account_wechatpay_proxy () {

	global $_W;

	$proxy_account = cache_load(cache_system_key('proxy_wechatpay_account:'));

	if (empty($proxy_account)) {

		$proxy_account = cache_build_proxy_wechatpay_account();

	}

	unset($proxy_account['borrow'][$_W['uniacid']]);

	unset($proxy_account['service'][$_W['uniacid']]);

	return $proxy_account;

}





function uni_account_module_shortcut_enabled($modulename, $uniacid = 0, $status = STATUS_ON) {

	global $_W;

	$module = module_fetch($modulename);

	if(empty($module)) {

		return error(1, '抱歉，你操作的模块不能被访问！');

	}

	$uniacid = intval($uniacid);

	$uniacid = !empty($uniacid) ? $uniacid : $_W['uniacid'];



	$module_status = pdo_get('uni_account_modules', array('module' => $modulename, 'uniacid' => $uniacid), array('id', 'shortcut'));

	if (empty($module_status)) {

		$data = array(

			'uniacid' => $uniacid,

			'module' => $modulename,

			'enabled' => STATUS_ON,

			'shortcut' => $status ? STATUS_ON : STATUS_OFF,

			'settings' => '',

		);

		pdo_insert('uni_account_modules', $data);

	} else {

		$data = array(

			'shortcut' => $status ? STATUS_ON : STATUS_OFF,

		);

		pdo_update('uni_account_modules', $data, array('id' => $module_status['id']));

		cache_build_module_info($modulename);

	}

	return true;

}





function uni_account_member_fields($uniacid) {

	if (empty($uniacid)) {

		return array();

	}

	$account_member_fields = pdo_getall('mc_member_fields', array('uniacid' => $uniacid), array(), 'fieldid');

	$system_member_fields = pdo_getall('profile_fields', array(), array(), 'id');

	$less_field_indexes = array_diff(array_keys($system_member_fields), array_keys($account_member_fields));

	if (empty($less_field_indexes)) {

		foreach ($account_member_fields as &$field) {

			$field['field'] = $system_member_fields[$field['fieldid']]['field'];

		}

		unset($field);

		return $account_member_fields;

	}



	$account_member_add_fields = array('uniacid' => $uniacid);

	foreach ($less_field_indexes as $field_index) {

		$account_member_add_fields['fieldid'] = $system_member_fields[$field_index]['id'];

		$account_member_add_fields['title'] = $system_member_fields[$field_index]['title'];

		$account_member_add_fields['available'] = $system_member_fields[$field_index]['available'];

		$account_member_add_fields['displayorder'] = $system_member_fields[$field_index]['displayorder'];

		pdo_insert('mc_member_fields', $account_member_add_fields);

		$insert_id = pdo_insertid();

		$account_member_fields[$insert_id]['id'] = $insert_id;

		$account_member_fields[$insert_id]['field'] = $system_member_fields[$field_index]['field'];

		$account_member_fields[$insert_id]['fid'] = $system_member_fields[$field_index]['id'];

		$account_member_fields[$insert_id] = array_merge($account_member_fields[$insert_id], $account_member_add_fields);

	}

	return $account_member_fields;

}







function uni_account_global_oauth() {

	load()->model('setting');

	$oauth = setting_load('global_oauth');

	$oauth = !empty($oauth['global_oauth']) ? $oauth['global_oauth'] : array();

	return $oauth;

}



function uni_search_link_account($module_name, $account_type) {

	global $_W;

	$module_name = trim($module_name);

	if (empty($module_name) || empty($account_type) || !in_array($account_type, array(ACCOUNT_TYPE_OFFCIAL_NORMAL, ACCOUNT_TYPE_OFFCIAL_AUTH, ACCOUNT_TYPE_APP_NORMAL, ACCOUNT_TYPE_WEBAPP_NORMAL))) {

		return array();

	}

	if (in_array($account_type, array(ACCOUNT_TYPE_OFFCIAL_NORMAL, ACCOUNT_TYPE_OFFCIAL_AUTH))) {

		$owned_account = uni_user_accounts($_W['uid'], 'app');

	} elseif ($account_type == ACCOUNT_TYPE_APP_NORMAL) {

		$owned_account = uni_user_accounts($_W['uid'], 'wxapp');

	} elseif ($account_type == ACCOUNT_TYPE_WEBAPP_NORMAL) {

		$owned_account = uni_user_accounts($_W['uid'], 'webapp');

	} else {

		$owned_account = array();

	}

	if (!empty($owned_account)) {

		foreach ($owned_account as $key => $account) {

			if ($account['type'] != $account_type) {

				unset($owned_account[$key]);

				continue;

			}

			$account['role'] = permission_account_user_role($_W['uid'], $account['uniacid']);

			if (!in_array($account['role'], array(ACCOUNT_MANAGE_NAME_OWNER, ACCOUNT_MANAGE_NAME_FOUNDER))) {

				unset($owned_account[$key]);

			}

		}

		foreach ($owned_account as $key => $account) {

			$account_modules = uni_modules_by_uniacid($account['uniacid']);

			if (empty($account_modules[$module_name])) {

				unset($owned_account[$key]);

				continue;

			}

			if (in_array($account_type, array(ACCOUNT_TYPE_OFFCIAL_NORMAL, ACCOUNT_TYPE_OFFCIAL_AUTH)) && $account_modules[$module_name]['app_support'] != MODULE_SUPPORT_ACCOUNT) {

				unset($owned_account[$key]);

			} elseif ($account_type == ACCOUNT_TYPE_APP_NORMAL && $account_modules[$module_name]['wxapp_support'] != MODULE_SUPPORT_WXAPP) {

				unset($owned_account[$key]);

			} elseif ($account_type == ACCOUNT_TYPE_WEBAPP_NORMAL && $account_modules[$module_name]['webapp_support'] != MODULE_SUPPORT_WEBAPP) {

				unset($owned_account[$key]);

			}

		}

	}

	return $owned_account;

}

