/**
 * User joining an Angeltype (Or Coordinator doing this for him).
 */
function user_angeltype_add_controller()
{
    global $user, $privileges;
    if (!isset($_REQUEST['angeltype_id'])) {
        error(_("Angeltype doesn't exist."));
        redirect(page_link_to('angeltypes'));
    }
    $angeltype = AngelType($_REQUEST['angeltype_id']);
    if ($angeltype === false) {
        engelsystem_error("Unable to load angeltype.");
    }
    if ($angeltype == null) {
        error(_("Angeltype doesn't exist."));
        redirect(page_link_to('angeltypes'));
    }
    if (User_is_AngelType_coordinator($user, $angeltype)) {
        // Allow to add any user
        $user_id = $user['UID'];
        $users_source = Users_by_angeltype_inverted($angeltype);
        if ($users_source === false) {
            engelsystem_error("Unable to load users.");
        }
        if (isset($_REQUEST['submit'])) {
            $ok = true;
            if (isset($_REQUEST['user_id']) && in_array($_REQUEST['user_id'], array_map(function ($user) {
                return $user['UID'];
            }, $users_source))) {
                $user_id = $_REQUEST['user_id'];
            } else {
                $ok = false;
                error(_("Please select a user."));
            }
            if ($ok) {
                foreach ($users_source as $user_source) {
                    if ($user_source['UID'] == $user_id) {
                        $user_angeltype_id = UserAngelType_create($user_source, $angeltype);
                        if ($user_angeltype_id === false) {
                            engelsystem_error("Unable to create user angeltype.");
                        }
                        engelsystem_log(sprintf("User %s added to %s.", User_Nick_render($user_source), AngelType_name_render($angeltype)));
                        success(sprintf(_("User %s added to %s."), User_Nick_render($user_source), AngelType_name_render($angeltype)));
                        $result = UserAngelType_confirm($user_angeltype_id, $user_source);
                        if ($result === false) {
                            engelsystem_error("Unable to confirm user angeltype.");
                        }
                        engelsystem_log(sprintf("User %s confirmed as %s.", User_Nick_render($user), AngelType_name_render($angeltype)));
                        redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']);
                    }
                }
            }
        }
        return array(_("Add user to angeltype"), UserAngelType_add_view($angeltype, $users_source, $user_id));
    } else {
        // Allow only me
        $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
        if ($user_angeltype === false) {
            engelsystem_error("Unable to load user angeltype.");
        }
        if ($user_angeltype != null) {
            error(sprintf(_("You are already a %s."), $angeltype['name']));
            redirect(page_link_to('angeltypes'));
        }
        if (isset($_REQUEST['confirmed'])) {
            $user_angeltype_id = UserAngelType_create($user, $angeltype);
            if ($user_angeltype_id === false) {
                engelsystem_error("Unable to create user angeltype.");
            }
            $success_message = sprintf(_("You joined %s."), $angeltype['name']);
            engelsystem_log(sprintf("User %s joined %s.", User_Nick_render($user), AngelType_name_render($angeltype)));
            success($success_message);
            if (in_array('admin_user_angeltypes', $privileges)) {
                $result = UserAngelType_confirm($user_angeltype_id, $user);
                if ($result === false) {
                    engelsystem_error("Unable to confirm user angeltype.");
                }
                engelsystem_log(sprintf("User %s confirmed as %s.", User_Nick_render($user), AngelType_name_render($angeltype)));
            }
            redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']);
        }
        return array(sprintf(_("Become a %s"), $angeltype['name']), UserAngelType_join_view($user, $angeltype));
    }
}
/**
 * Change an Angeltype.
 */
function angeltype_edit_controller()
{
    global $privileges, $user;
    $name = "";
    $restricted = false;
    $description = "";
    if (isset($_REQUEST['angeltype_id'])) {
        $angeltype = AngelType($_REQUEST['angeltype_id']);
        if ($angeltype === false) {
            engelsystem_error("Unable to load angeltype.");
        }
        if ($angeltype == null) {
            redirect(page_link_to('angeltypes'));
        }
        $name = $angeltype['name'];
        $restricted = $angeltype['restricted'];
        $description = $angeltype['description'];
        if (!User_is_AngelType_coordinator($user, $angeltype)) {
            redirect(page_link_to('angeltypes'));
        }
    } else {
        if (!in_array('admin_angel_types', $privileges)) {
            redirect(page_link_to('angeltypes'));
        }
    }
    // In coordinator mode only allow to modify description
    $coordinator_mode = !in_array('admin_angel_types', $privileges);
    if (isset($_REQUEST['submit'])) {
        $ok = true;
        if (!$coordinator_mode) {
            if (isset($_REQUEST['name'])) {
                list($valid, $name) = AngelType_validate_name($_REQUEST['name'], $angeltype);
                if (!$valid) {
                    $ok = false;
                    error(_("Please check the name. Maybe it already exists."));
                }
            }
            $restricted = isset($_REQUEST['restricted']);
        }
        if (isset($_REQUEST['description'])) {
            $description = strip_request_item_nl('description');
        }
        if ($ok) {
            $restricted = $restricted ? 1 : 0;
            if (isset($angeltype)) {
                $result = AngelType_update($angeltype['id'], $name, $restricted, $description);
                if ($result === false) {
                    engelsystem_error("Unable to update angeltype.");
                }
                engelsystem_log("Updated angeltype: " . $name . ", restricted: " . $restricted);
                $angeltype_id = $angeltype['id'];
            } else {
                $angeltype_id = AngelType_create($name, $restricted, $description);
                if ($angeltype_id === false) {
                    engelsystem_error("Unable to create angeltype.");
                }
                engelsystem_log("Created angeltype: " . $name . ", restricted: " . $restricted);
            }
            success("Angel type saved.");
            redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype_id);
        }
    }
    return array(sprintf(_("Edit %s"), $name), AngelType_edit_view($name, $restricted, $description, $coordinator_mode));
}