<?php
namespace Misuzu;

use RuntimeException;

if(!isset($msz) || !($msz instanceof \Misuzu\MisuzuContext))
    die('Script must be called through the Misuzu route dispatcher.');

if(!$msz->authInfo->loggedIn)
    Template::throwError(403);

// TODO: restore forum-topics and forum-posts orderings

$roleId = !empty($_GET['r']) && is_string($_GET['r']) ? $_GET['r'] : null;
$orderBy = strtolower(!empty($_GET['ss']) && is_string($_GET['ss']) ? $_GET['ss'] : '');
$orderDir = strtolower(!empty($_GET['sd']) && is_string($_GET['sd']) ? $_GET['sd'] : '');

$orderDirs = [
    'asc' => 'In Order',
    'desc' => 'Reverse Order',
];

$defaultOrder = 'active';
$orderFields = [
    'id' => [
        'title' => 'User ID',
    ],
    'name' => [
        'title' => 'Username',
    ],
    'country' => [
        'title' => 'Country',
    ],
    'created' => [
        'title' => 'Registration Date',
    ],
    'active' => [
        'title' => 'Last Online',
    ],
    'registered' => [
        'alt' => 'created',
        'title' => 'Registration Date',
    ],
    'last-online' => [
        'alt' => 'active',
        'title' => 'Last Online',
    ],
];

if(empty($orderBy)) {
    $orderBy = $defaultOrder;
} elseif(!array_key_exists($orderBy, $orderFields)) {
    Template::throwError(400);
}

if(array_key_exists('alt', $orderFields[$orderBy]))
    $orderBy = $orderFields[$orderBy]['alt'];

if(empty($orderDir)) {
    $orderDir = 'asc';
} elseif(!array_key_exists($orderDir, $orderDirs)) {
    Template::throwError(400);
}

if($roleId === null) {
    $roleInfo = $msz->usersCtx->roles->getDefaultRole();
} else {
    try {
        $roleInfo = $msz->usersCtx->roles->getRole($roleId);
    } catch(RuntimeException $ex) {
        Template::throwError(404);
    }
}

$canManageUsers = $msz->authInfo->getPerms('user')->check(Perm::U_USERS_MANAGE);
$deleted = $canManageUsers ? null : false;

$rolesAll = $msz->usersCtx->roles->getRoles(hidden: false);
$pagination = Pagination::fromInput($msz->usersCtx->users->countUsers(roleInfo: $roleInfo, deleted: $deleted), 15);

$userList = [];
$userInfos = $msz->usersCtx->users->getUsers(
    roleInfo: $roleInfo,
    deleted: $deleted,
    orderBy: $orderBy,
    reverseOrder: $orderDir !== 'asc',
    pagination: $pagination,
);

foreach($userInfos as $userInfo)
    $userList[] = [
        'info' => $userInfo,
        'colour' => $msz->usersCtx->getUserColour($userInfo),
        'ftopics' => $msz->forumCtx->countTotalUserTopics($userInfo),
        'fposts' => $msz->forumCtx->countTotalUserPosts($userInfo),
    ];

if(empty($userList))
    http_response_code(404);

Template::render('user.listing', [
    'roles' => $rolesAll,
    'role' => $roleInfo,
    'users' => $userList,
    'order_fields' => $orderFields,
    'order_directions' => $orderDirs,
    'order_field' => $orderBy,
    'order_direction' => $orderDir,
    'order_default' => $defaultOrder,
    'can_manage_users' => $canManageUsers,
    'users_pagination' => $pagination,
]);