<?php
include 'common.php';

const GUILD_EXPENDING = [50, 100, 150, 200];

function IsExistAndStateApply_GuildApplication($dbhandle, $character_uid, $guild_uid)
{
	$stmt = $dbhandle->prepare("SELECT * FROM guild_apply WHERE character_uid=? AND guild_uid=?");
	$stmt->bind_param("ii", $character_uid, $guild_uid);
	$stmt->execute();
	$result = $stmt->get_result();

	if ($result)
	{
		if($row = $result->fetch_assoc())
		{
			if ($row["state"] === "APPLY")
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	}
	else
	{
		$return = "DB_ERROR";
		$error = mysqli_error($dbhandle);
		$response = array('result'=>$return,'error'=>$error);

		EchoResponse($response);

		mysqli_close($dbhandle);
		exit;
	}
}
function ChangeApplicationState_Accept($dbhandle, $character_uid, $guild_uid)
{
	$stmt = $dbhandle->prepare("UPDATE guild_apply SET state='ACCEPT' WHERE character_uid=? AND guild_uid=?");
	$stmt->bind_param("ii", $character_uid, $guild_uid);
	$result = $stmt->execute();
	$stmt->close();
			
	if($result)
	{
		return true;
	}
	else
	{
		return false;
	}
}
function CheckCharacterInGuild($dbhandle, $character_uid)
{
	$stmt = $dbhandle->prepare("SELECT * FROM guild_member WHERE character_uid=? AND is_deport=0");
	$stmt->bind_param("i", $character_uid);
	$stmt->execute();
	$result = $stmt->get_result();

	if ($result)
	{
		if($row = $result->fetch_assoc())
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	else
	{
		$return = "DB_ERROR";
		$error = mysqli_error($dbhandle);
		$response = array('result'=>$return,'error'=>$error);

		EchoResponse($response);

		mysqli_close($dbhandle);
		exit;
	}
}

function JoinGuild($dbhandle, $character_uid, $guild_uid)
{
	$now = new DateTime();
	$now->setTimezone(new DateTimeZone('UTC'));
	$joindate =  date_format($now, "Y-m-d H:i:s");

	$stmt = $dbhandle->prepare("INSERT INTO guild_member (guild_uid, character_uid, grade, joindate, is_deport) VALUES(?,?,0,?,0)");
	$stmt->bind_param("iis", $guild_uid, $character_uid, $joindate);
	$result = $stmt->execute();
	$stmt->close();	
	
	if($result)
	{
		return true;
	}
	else
	{
		return false;
	}
}
function ChangeGuilNumberOfMember($dbhandle, $guild_uid)
{
	$stmt = $dbhandle->prepare("UPDATE guild_info SET number_of_member=number_of_member+1 WHERE guild_uid=?");
	$stmt->bind_param("i", $guild_uid);
	$result = $stmt->execute();
	$stmt->close();
			
	if($result)
	{
		return true;
	}
	else
	{
		return false;
	}
}
function CheckGuildNumberOfMember($dbhandle, $guild_uid)
{
	$stmt = $dbhandle->prepare("SELECT * FROM guild_info WHERE guild_uid=?");
	$stmt->bind_param("i", $guild_uid);
	$stmt->execute();
	$result = $stmt->get_result();

	if ($result)
	{
		if($row = $result->fetch_assoc())
		{
			$num = $row["number_of_member"];
			$expending_count = $row["expending_count"];
			$expending_num = GUILD_EXPENDING[$expending_count];
			if ($num < $expending_num)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	}
	else
	{
		$return = "DB_ERROR";
		$error = mysqli_error($dbhandle);
		$response = array('result'=>$return,'error'=>$error);

		EchoResponse($response);

		mysqli_close($dbhandle);
		exit;
	}
}

function SumGuildBP($dbhandle, $guild_uid)
{
	$guild_bp = 0;
	$stmt = $dbhandle->prepare("SELECT SUM(b.bp) FROM guild_member AS a INNER JOIN character_list AS b ON a.character_uid = b.character_uid WHERE a.guild_uid=? AND a.is_deport=0");
	$stmt->bind_param("i", $guild_uid);
	$stmt->execute();
	$result = $stmt->get_result();

	if ($result)
	{
		if($row = $result->fetch_assoc())
		{
			if (isset($row["SUM(b.bp)"]))
			{
				$guild_bp = $row["SUM(b.bp)"];
			}
		}
	}
	return $guild_bp;
}
function SetGuildBP($dbhandle, $guild_uid, $guild_bp)
{
	$stmt = $dbhandle->prepare("UPDATE guild_info SET guild_bp=? WHERE guild_uid=?");
	$stmt->bind_param("ii", $guild_bp, $guild_uid);
	$result = $stmt->execute();
	$stmt->close();
			
	if($result)
	{
		return true;
	}
	else
	{
		return false;
	}
}

function UpdateGuildBP($dbhandle, $guild_uid)
{
	$guild_bp = SumGuildBP($dbhandle, $guild_uid);
	SetGuildBP($dbhandle, $guild_uid, $guild_bp);
}

function GuildApplyAccept($account_id, $character_uid, $guild_uid, $login_key)
{
	//Connect DB
	$dbhandle = DB_Connect();
		
	$db_selected = mysqli_select_db($dbhandle, DB_NAME)
	or die("Could not select db");

	if(!CheckLoginKey($dbhandle, $account_id, $login_key))
	{
		PrintLoginKeyError();
		mysqli_close($dbhandle);
		return;
	}

	$result_existAndApply = IsExistAndStateApply_GuildApplication($dbhandle, $character_uid, $guild_uid);
	if ($result_existAndApply)
	{
		$result_inGuild = CheckCharacterInGuild($dbhandle, $character_uid);
		if ($result_inGuild)
		{
			$result_numberOfMember = CheckGuildNumberOfMember($dbhandle, $guild_uid);
			if ($result_numberOfMember)
			{
				$result_joinGuild = JoinGuild($dbhandle, $character_uid, $guild_uid);
				if ($result_joinGuild)
				{
					$result_changeNumberOfMember = ChangeGuilNumberOfMember($dbhandle, $guild_uid);
					if ($result_changeNumberOfMember)
					{
						UpdateGuildBP($dbhandle, $guild_uid);
						$result_changeState = ChangeApplicationState_Accept($dbhandle, $character_uid, $guild_uid);
						if ($result_changeState)
						{
						
							$return = "GUILD_APPLY_ACCEPT_OK";
							$error = "";
							$response = array('result'=>$return,'error'=>$error);
		
							EchoResponse($response);
						}
						else
						{
							$return = "CHANGE_STATE_FAIL";
							$error = "";
							$response = array('result'=>$return,'error'=>$error);
		
							EchoResponse($response);
						}
					}
					else
					{
						$return = "CHANGE_NUMBER_OF_MEMBER_FAIL";
						$error = "";
						$response = array('result'=>$return,'error'=>$error);
		
						EchoResponse($response);
					}
				}
				else
				{
					$return = "JOIN_GUILD_FAIL";
					$error = "";
					$response = array('result'=>$return,'error'=>$error);

					EchoResponse($response);
				}
			}
			else
			{
				$return = "GUILD_MEMBER_FULL";
				$error = "";
				$response = array('result'=>$return,'error'=>$error);

				EchoResponse($response);
			}
		}
		else
		{
			$return = "ALREAY_JOINED_GUILD";
			$error = "";
			$response = array('result'=>$return,'error'=>$error);

			EchoResponse($response);
		}
	}
	else
	{
		$return = "NOT_EXIST_APPLICATION";
		$error = "";
		$response = array('result'=>$return,'error'=>$error);

		EchoResponse($response);

	}

	mysqli_close($dbhandle);
}

function EchoResponse($response)
{
	$isXmlHttpRequest = (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) ?
	(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') ? true : false: false;
	($isXmlHttpRequest) ? header('Content-type: application/json') : header('Content-type: text/plain');
 
	echo json_encode($response);
}

$account_id = $_GET['account_id'];
$character_uid = $_GET['character_uid'];
$guild_uid = $_GET['guild_uid'];
$login_key = $_GET['login_key'];

if(CheckValidatedServerIP())
{
	GuildApplyAccept($account_id, $character_uid, $guild_uid, $login_key);
}
else
{
	$response = "INVALIDATED_SERVER";
	$error = "CheckValidatedServerIP ERROR";
	$isXmlHttpRequest = (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) ?
	(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') ? true : false: false;
	($isXmlHttpRequest) ? header('Content-type: application/json') : header('Content-type: text/plain'); 
 
	echo json_encode(array(	'result'=>$response,'error'=>$error	));
}


?>