<?php
    
require_once './Includes/auth.php';
    require_once 
'./Includes/rbac.php';
    
redirect_if_not_logged_in();

    if (!
can_view_all_requests()) {
        die(
'<div class="alert alert-error">Access Denied</div>');
    }

    
$filter_id $_GET['filter_id'] ?? '';
    
$filter_workflow $_GET['filter_workflow'] ?? '';
    
$filter_submitted_by $_GET['filter_submitted_by'] ?? '';
    
$filter_date $_GET['filter_date'] ?? '';
    
$sort $_GET['sort'] ?? 'r.dateInserted';
    
$order strtoupper($_GET['order'] ?? 'DESC');
    
$order = ($order === 'ASC') ? 'ASC' 'DESC';   // sanitize

    
$allowed_sorts = [
        
'r.pk_request''w.title''submitted_by''r.dateInserted'
    
];
    if (!
in_array($sort$allowed_sorts)) $sort 'r.dateInserted';

    
// --- build WHERE clause ---
    
$where = [];    // empty array to store filter conditions

    // add ID filter condition if provided
    
if ($filter_id !== '') {
        
// safely convert to integer to prevent SQL injection
        
$where[] = "r.pk_request = " intval($filter_id);
    }

    
// add Workflow filter condition if provided by the user
    
if ($filter_workflow !== '') {
        
// escape user input and perform partial match search
        
$where[] = "w.title LIKE '%" mysqli_real_escape_string($conn$filter_workflow) . "%'";
    }

    
// add Submitted By filter condition if provided by the user
    
if ($filter_submitted_by !== '') {
        
// escape user input and search in concatenated name field
        
$where[] = "CONCAT(u.firstName, ' ', u.lastName) LIKE '%" 
                
mysqli_real_escape_string($conn$filter_submitted_by) . "%'";
    }

    
// add Date filter condition if provided by the user
    
if ($filter_date !== '') {
        
// escape user input and match exact date (ignoring time)
        
$where[] = "DATE(r.dateInserted) = '" 
                
mysqli_real_escape_string($conn$filter_date) . "'";
    }

    
// combine conditions into SQL WHERE clause
    /*
        EXAMPLE:
        ID: (blank)
        Workflow: Leave
        Submitted By: Alice
        Date: 2025-06-20

        $where = [
            "w.title LIKE '%Leave%'",
            "CONCAT(u.firstName, ' ', u.lastName) LIKE '%Alice%'",
            "DATE(r.dateInserted) = '2025-06-20'"
        ];

        then

        $where_sql = "WHERE w.title LIKE '%Leave%' AND CONCAT(u.firstName, ' ', u.lastName) LIKE '%Alice%' AND DATE(r.dateInserted) = '2025-06-20'";
    */
    
$where_sql $where 'WHERE ' implode(' AND '$where) : '';

    
$sql "SELECT r.pk_request, w.title AS workflow_title, 
            CONCAT(u.firstName, ' ', u.lastName) AS submitted_by,
            r.dateInserted
            FROM workflowManager_Request r
            INNER JOIN workflowManager_Workflow w ON r.fk_Workflow_triggers = w.pk_workflow
            INNER JOIN workflowManager_User u ON r.fk_User_submittedBy = u.pk_user
            
$where_sql
            ORDER BY 
$sort $order";
    
$result mysqli_query($conn$sql);

    
// --- Helper for HTML escaping ---
    // for keeping the filter values in the form
    // ENT_QUOTES: convert both double and single quotes to their HTML entities (&quot; and &#039;)
    
function h($v) { return htmlspecialchars($vENT_QUOTES); }
?>
<h2>All Requests</h2>

<!-- Filter Form -->
<form method="get" class="filter-form" action="index.php">
    <input type="hidden" name="page" value="all_requests">
    <div class="filter-row">
        <input type="text" name="filter_id" placeholder="ID" value="<?= h($filter_id?>">
        <input type="text" name="filter_workflow" placeholder="Workflow" value="<?= h($filter_workflow?>">
        <input type="text" name="filter_submitted_by" placeholder="Submitted By" value="<?= h($filter_submitted_by?>">
        <input type="date" name="filter_date" value="<?= h($filter_date?>">
        <button type="submit" class="btn">Filter</button>
        <a href="index.php?page=all_requests" class="btn btn-clear">Clear</a>
    </div>
</form>

<div class="table-scroll">
<table class="data-table">
    <tr>
        <?php
            
// table headers: database column => display label
            
$headers = [
                
'r.pk_request' => 'ID',                 // request ID column
                
'w.title' => 'Workflow',                // workflow title column
                
'submitted_by' => 'Submitted By',       // user who submitted request
                
'r.dateInserted' => 'Date'              // request submission date
            
];

            
// generate sortable headers for each column
            
foreach ($headers as $col => $label) {
                
// determine sort direction for this column:
                // - if already sorting by this column, toggle direction
                // - otherwise default to ascending
                
$new_order = ($sort === $col && $order === 'ASC') ? 'DESC' 'ASC';
                
$arrow = ($sort === $col) ? ($order === 'ASC' ' ▲' ' ▼') : '';

                
// keep filters in header sort links
                
$query http_build_query(array_merge($_GET, ['sort' => $col'order' => $new_order]));
                echo 
"<th><a href=\"index.php?$query\">$label$arrow</a></th>";
            }
        
?>
    </tr>
    <?php while ($row mysqli_fetch_assoc($result)): ?>
    <tr>
        <td><?= $row['pk_request'?></td>
        <td><?= h($row['workflow_title']) ?></td>
        <td><?= h($row['submitted_by']) ?></td>
        <td><?= h($row['dateInserted']) ?></td>
    </tr>
    <?php endwhile; ?>
</table>
</div>
<p style="font-size:0.9em;color:#888;">Click a column header to sort. Use the form above to filter.</p>