<?php
// Deleting existing account



// Includes
if ($IS_FRONTEND) {
	require_once("api/_auth.php");
	require_once("api/_utils.php");
	require_once("api/_errorslist.php");
	require_once("api/user/index.php");
} else {
	require_once("../_auth.php");
	require_once("../_utils.php");
	require_once("../_errorslist.php");
	require_once("./index.php");
}



// Functions

/*
 * FUNCTION
 * Delete existing account
 */
function User_Delete (int $id): ReturnT {
	global $db;

	$s = $db->prepare("delete from users where id = ?");
	$s->bind_param("s", $id);

	return new ReturnT(data: ($s->execute() !== false));
}



// Methods

/*
 * METHOD
 * Delete existing account
 */
function User_Delete_Method (array $req): ReturnT {
	global $LOGGED_IN, $THIS_USER;

	$id = null;

	// Input sanity checks

	if (isset($req["id"]) && $LOGGED_IN) {
		if (!ctype_digit($req["id"]))
			return new ReturnT(err_code: E_UIN_BADARGS, err_desc: "id must be numeric");
		$id = intval($req["id"]);
	} elseif (!isset($req["id"]) && $LOGGED_IN) {
		$id = $THIS_USER;
	} else {
		return new ReturnT(err_code: E_AUT_NOTAUTHED, err_desc: "valid session must be provided");
	}

	// If its attempt to delete other account
	if (!User_HasRole($THIS_USER, "admin")->GetData() && $THIS_USER !== $id)
		return new ReturnT(err_code: E_ACS_INSUFROLE, err_desc: "you must be admin to delete other accounts");

	// Actions

	return User_Delete($id);
}



if (Utils_ThisFileIsRequested(__FILE__)) {
	require_once("../_json.php");

	// HACK: for debugging purposes. Will be removed later
	if ($Config["debug"])
		$_POST = $_REQUEST;

	$result = User_Delete_Method($_POST);

	if ($result->IsError()) {
		$result->ThrowJSONError();
	} else {
		// If it was self-deletion
		if ($id === $THIS_USER)
			AUTH_EndSession();
		JSON_ReturnData(["success" => $result->GetData()]);
	}
}
?>