<?php
/*
 *
 * @copyright (c) 2011 animegame.eu
 * @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public Licence
 *
 */

include_once (ROOT_PATH . '/include/defines.inc.php');
include_once (ROOT_PATH . '/include/clan_fights.inc.php');
include_once (ROOT_PATH . '/include/exp.inc.php');

defineIfNotDefined('MAX_CHARS_CLANSIGN', 8);
$GLOBALS['clan_buffered_instances'] = array ();


function getClan($clanid, $buffer = TRUE) {
	if(!is_numeric($clanid) || $clanid === NULL) { return NULL; }
	if($buffer && isset($GLOBALS['clan_buffered_instances'][$clanid])) {
		return $GLOBALS['clan_buffered_instances'][$clanid]; // okay, we already buffered the clan :)
	}

	$clan = mysql_fetch_assoc(mysql_query('SELECT * FROM clan WHERE id = '. $clanid));

	// now calculate the member, max_exp fields :D

	if($clan) {
		$GLOBALS['clan_buffered_instances'][$clanid] = $clan;
		return $clan;
	} else {
		return NULL;
	}
}


function getClanMembersCount($clanid) {
	if(!is_numeric($clanid)) { return NULL; }
	$row = mysql_fetch_assoc(mysql_query('SELECT count(id) as amount FROM user WHERE clan = '. $clanid));
	return $row['amount'];
}

function getClanMemberBonusByLevel($level) {
	switch($level) {
		case 1:
		case 2:
		case 3:
			return 0;
		case 4:
		case 5:
		case 6:
			return 1;
		case 7:
		case 8:
			return 2;
		case 9:
		case 10:
			return 3;
		case 11:
		case 12:
			return 4;
		case 13:
		case 14:
			return 5;
		case 15:
		case 16:
			return 6;
		case 17:
			return 7;
		default:
			return 8;
	}
}

function getMaximumMembers($clanid) {
	// okay, this is a more tricky calculation as this requires the information (are leader and co_leader the same person??)
	// the second parameter is the clan level. Each 2 levels (where the maximum clan level is about 20) one more member can
	// be invited :)

	$clan = getClan($clanid);
	if($clan === NULL){ return 0; }
	$base = 12;
	$members_by_level = getClanMemberBonusByLevel($clan['level']);
	$malus = 0;
	if($clan['co_leader'] == NULL || $clan['co_leader'] == $clan['leader']) {
		$malus = 1;
	}
	return $base + $members_by_level - $malus;
}

function getRequiredClanExp($level) {
	//return pow(2, $level) * 10;
	$level = $level + 1; 
	// 12,5*(neuesLevel)^2-22,5*(neues Level)+10
	$value = 12.5 * pow($level, 2) - 22.5 * $level + 10;
	$value = beautifyNumericValue($value, 5);	
	return $value;
}

function revokeInvitation($user, $userid, $clan = NULL){
	if($user['clan'] === NULL) {
		return 'Du bist in keinem Clan!';
	}

	if($clan === NULL) {
		$qry = mysql_query('Select * from clan where id = ' . $user['clan']);
		$clan = mysql_fetch_assoc($qry);
	}

	if($clan['leader'] != $user['id'] && $clan['co_leader'] != $user['id']){
		return 'Nur der Leader, bzw. der Co-Leader kann Einladungen zur&uuml;ckziehen!!';
	}

	$sql = 'DELETE FROM user_clan_invitations WHERE clanid = '.$clan['id'].' AND userid = '.$userid;
	//	echo $sql . '<br>';
	mysql_query($sql);
	if(mysql_affected_rows() > 0){
		return NULL;
	} else{
		return 'Einladung konnte nicht zur&uuml;ckgezogen werden!';
	}
}

/**
 *
 * Enter description here ...
 * @param array $user the user that wants to invite
 * @param int $userid the id of the user that should be invited
 * @param array $clan the optional clan array (if available)
 */
function inviteUser(array $user, $userid, array $clan = NULL){
	if($user['clan'] === NULL) {
		return 'Du bist in keinem Clan!';
	}

	if($clan === NULL) {
		$qry = mysql_query('Select * from clan where id = ' . $user['clan']);
		$clan = mysql_fetch_assoc($qry);
	}

	if($clan['leader'] != $user['id'] && $clan['co_leader'] != $user['id']){
		return 'Nur der Leader, bzw. der Co-Leader kann neue Member einladen!';
	}

	$row = mysql_fetch_assoc(mysql_query('SELECT * FROM user where id = \''. $userid.'\''));
	if(!row) {
		return 'Fehler! Nutzer exisitiert nicht!!';
	}
	if($row['clan'] == $user['clan']){
		return 'Fehler! Nutzer ist schon in deinem Clan!';
	}

	$sql = 'INSERT INTO user_clan_invitations(userid, clanid, valid) values('.$userid.','.$user['clan'].',TIMESTAMPADD(DAY, 5, now()))';
	//		echo $sql.'<br>';
	mysql_query($sql);
	if(mysql_affected_rows() <= 0){ // Fehler?
		$sql = 'UPDATE user_clan_invitations SET valid = TIMESTAMPADD(DAY, 5, now()) where userid = '.$userid.' and clanid = '.$user['clan'];
		//			echo $sql.'<br>';
		mysql_query($sql);
		if(mysql_affected_rows() <= 0){ // Fehler?
			return 'Fehler! Konnte Nutzer nicht einladen!';
		} else{
			sendMessage($user['nickname'], $userid, 'Einladung in Clan', 'Die Einladung des Clans '.$clan['clanname'].' wurde aufgefrischt! Klicke auf "Clan beitreten" um die Einladung anzunehmen!');
			return NULL;
		}
	} else{
		sendMessage($user['nickname'], $userid, 'Einladung in Clan', 'Du wurdest eingeladen dich dem Clan '.$clan['clanname'].' anzuschliessen! Klicke auf "Clan beitreten" um die Einladung anzunehmen!');
		return NULL;
	}
}

function fireMember($user, $member){
	$clan = getClan($user['clan']);
	if($member != $clan['leader'] && $member != $clan['co_leader'] && ($user['id'] == $clan['leader'] || $user['id'] == $clan['co_leader'] || $member == $user['id'])){
		$sql = 'Update user set clan = NULL where id = '.$member.' AND clan = '.$user['clan'];
		//		echo $sql.'<br>';
		mysql_query($sql);
		if(mysql_affected_rows() > 0){ // Soll nur ausgeführt werden, wenn member wirklich gekickt wurde!!
			$sql = 'Update chars set clan_train = NULL where besitzer = '.$member;
			mysql_query($sql);
			if($user['id'] != $member) {
				sendMessage($user['nickname'], $member, 'Clan rauswurf!', 'Du wurdest von '.$user['nickname'].' aus deinem Clan geworfen. Du wirst dir wohl einen neuen suchen m&uuml;ssen!');
			} else if($clan['exp'] == 0 && $clan['level'] == 1 && getClanMembersCount($user['clan']) == 0) {
				mysql_query('DELETE FROM clan WHERE id =' .$user['clan']);
			}

			// delete the participation in open clan fights! Thats tricky because the user itself is not stored in the database!!
			mysql_query('DELETE FROM clan_challenge_whitelist WHERE clan_id = ' .$clan['id'] . ' AND user_id = ' .$user['id']);
			mysql_query('DELETE FROM clan_challenge_participants WHERE clan_challenge_id in (SELECT clan_challenge_id FROM clan_challenge where calculated = FALSE) and char_id IN (Select id FROM chars where besitzer = '.$user['id'].')');
		}
	} else{
		echo displayErrorMessage(NULL, 'Du kannst den Member nicht feuern!', displayHistoryBackLink());
	}
}

/**
 *
 * Return all Clans with their id and name.
 *
 */
function getAllClans() {
	$qry = mysql_query('SELECT id,clanname FROM clan;');
	while ($result = mysql_fetch_assoc($qry)) {
		$clans[] = $result;
	}
	return $clans;
}

function joinClan($user, $clanid, $check_invitation = true){
	// last chance to lock the clan if in the old situation it was having to few members ;)
	isClanLocked($clanid); // we only require the calculation not the result!

	$sql = 'SELECT * FROM user_clan_invitations WHERE userid = '.$user['id'].' and clanid = '.$clanid.' and valid > now();';
	$clan_user = mysql_fetch_assoc(mysql_query($sql));

	if($clan_user || !$check_invitation){
		$clan = getClan($clanid);
		$members = getClanMembersCount($clanid);
		$members_max = getMaximumMembers($clan['id']);

		if($members >= $members_max){
			displayErrorMessage(NULL,'Konnte die Einladung des Clans nicht annehmen (Clan voll)!',displayHistoryBackLink());
			return;
		} else{
			$sql = 'UPDATE user SET clan = '.$clanid.' WHERE id = '.$user['id'];
			//			echo $sql.'<br>';
			mysql_query($sql);

			// unset the leader if the user is moving from one clan to another
			mysql_query('UPDATE clan SET leader = NULL WHERE leader = ' .$user['id'] . ' and id != ' .$clanid);
			mysql_query('UPDATE clan SET co_leader = NULL WHERE co_leader = ' .$user['id'] . ' and id != ' .$clanid);
			mysql_query('DELETE FROM clan_challenge_whitelist WHERE clan_id = ' .$clanid . ' AND user_id = ' .$user['id']);

			if($check_invitation) {
				displayErrorMessage('Aufgenommen','Du wurdest erfolgreich in den Clan aufgenommen!','<a href="index.php?as=clan/clan_info">weiter</a>');
			}
		}
	} else{
		displayErrorMessage(NULL,'Konnte die Einladung des Clans nicht annehmen!',displayHistoryBackLink());
		return;
	}
	mysql_query('DELETE FROM user_clan_invitations WHERE userid = '.$user['id'].' and clanid = '.$clanid);
}

function denyClan($user, $clanid){
	mysql_query('DELETE FROM user_clan_invitations WHERE userid = '.$user['id'].' and clanid = '.$clanid);
	if(mysql_affected_rows() > 0){
		displayErrorMessage('Abgelehnt','Du hast die Einladung erfolgreich abgelehnt!','<a href="index.php?as=clan/add">weiter</a>');
	} else{
		displayErrorMessage(NULL,'Einladung des Clans konnte nicht abgelehnt werden!',displayHistoryBackLink());
	}
}

function deleteClan($userid) {
	$user = getUser($userid);
	$clanid = $user['clan'];
	$clan = getClan($clanid);

	if($userid != $clan['leader']) {
		return 'Du kannst den Clan nicht aufl&ouml;sen!';
	}

	// Okay notify the members :)

	$qry = mysql_query('SELECT id FROM user WHERE clan = '.$user['clan']);
	while($member = mysql_fetch_assoc($qry)) {
		sendMessage($user['nickname'], $member['id'], 'Clan wurde gelöscht!', 'Dein Clan wurde von '.$user['nickname'].' gel&ouml;scht. Du wirst dir wohl einen neuen suchen m&uuml;ssen!');
	}

	// Check if this clan is level 0 and has 0 exp ...
	if($clan['exp'] == 0 && $clan['level'] == 1) {
		// really do delete the clan !!
		mysql_query('DELETE FROM clan where id = '.$user['clan']);
	} else {
		// cleanup the clan!
		$sql1 = 'UPDATE user SET clan = NULL WHERE clan = ' . $clanid;
		$sql2 = 'UPDATE clan SET leader = NULL, co_leader = NULL WHERE id = ' .$clanid;
		$sql3 = 'DELETE FROM clan_challenge_whitelist WHERE clan_id = ' .$clanid; // cleanup the whitelist

//		echo $sql1 . '<br>';
//		echo $sql2 . '<br>';

		mysql_query($sql1);
		mysql_query($sql2);
	}
	return NULL;

}

function conquerClan($clanid, $userid) {
	// It is possible to enter a clan that is empty :)
	$user = getUser($userid);
	$result = mysql_fetch_row(mysql_query('SELECT count(*) FROM user WHERE clan = ' . $clanid));
	if($result[0] != 0) {
		return 'Der Clan ('.$clanid.') ist nicht leer!';
	}

	$sql = 'UPDATE clan SET leader = ' . $userid . ' WHERE leader is NULL AND id = '. $clanid;
	mysql_query($sql);

	$done = mysql_affected_rows() > 0;
	if(!$done) {
		return 'Der Clan ist schon &uuml;bernommen worden!';
	}

	// Cool we got em !! Now move to the new clan :)
	joinClan($user, $clanid, false);
	return NULL;
}

function setMeAsLeader($user){
	mysql_query('UPDATE clan set leader = '.$user['id'].' WHERE id = '.$user['clan'].' and leader IS null AND co_leader IS null');
	return mysql_affected_rows() > 0;

}

function sendClanNewsletter($user, $text){
	$qry = mysql_query('SELECT * FROM clan WHERE id = ' . $user['clan']);
	$clan = mysql_fetch_assoc($qry);

	$errors = FALSE;
	$sql = 'SELECT id FROM user WHERE clan='.$user['clan'];
	$clans = mysql_query($sql);
	while($row = mysql_fetch_assoc($clans)) {
		$errors |= !sendMessage($user['nickname'], $row['id'], $clan['clanname'].' Nachricht', $text);
	}
	if($errors) {
		displayErrorMessage(NULL,'Beim Versenden sind Fehler aufgetreten', '<a href="index.php?as=clan/clan_info">weiter...</a>');
	} else {
		displayErrorMessage(NULL,'Nachricht erfolgreich verschickt', '<a href="index.php?as=clan/clan_info">weiter...</a>');
	}
}



?>