<?php
require_once("dbPDO.php");
GLOBAL $access,$portalAccess,$dbAdmin,$isSuperUser;
$dbAdmin = CommonPDOConnector::connect('ConnectToAdmin');
$portalAccess = $access = array();
$isSuperUser = false;

function hasAccess($userId,$permission)
{
    global $dbAdmin,$access,$isSuperUser;
    if(empty($access)){
        //check if user is super user
        $sql = "SELECT is_superuser FROM portal_users WHERE status=1 AND user_id=$userId";
        $query   = $dbAdmin->query($sql);
        $isSuperUser = ($query) ? $query->fetchColumn() : false;
        if($isSuperUser){
            $access[] = "superUser";
        }else{
            $folders = [];
            $sql = "SELECT pp.page_url,pp.portal_folder_id FROM portal_users_permissions pup  inner join portal_pages pp ON pp.page_id = pup.page_id AND pp.status=1 where pup.status=1 AND pup.user_id=$userId";
            $query   = $dbAdmin->query($sql);
            $data = $query->fetchAll(PDO::FETCH_ASSOC);
            foreach($data as $value)
            {
                $access[] = $value['page_url'];
                $folders[$value['portal_folder_id']] = 1;
            }
            //get All folder access
            if(!empty($folders)){
                $foldersNames = getFoldersName(array_keys($folders));
                $access = array_merge($access,$foldersNames);
            }
        }
    }
    if($isSuperUser){
        return true;
    }
    return in_array($permission,$access);
}

function hasPortalAccess($userId,$portal_id){
    global $dbAdmin,$isSuperUser,$portalAccess;
    if(empty($portalAccess)){
        if(is_string($userId)){
            //get userid from username
            $userId = addslashes($userId);
            $sql = "SELECT user_id FROM portal_users WHERE status=1 AND (username='$userId' OR email='$userId')";
            $query   = $dbAdmin->query($sql);
            $userId = ($query) ? $query->fetchColumn() : 0;
        }
        //check if user is super user
        $sql = "SELECT is_superuser FROM portal_users WHERE status=1 AND user_id=$userId";
        $query   = $dbAdmin->query($sql);
        $isSuperUser = ($query) ? $query->fetchColumn() : false;
        if($isSuperUser){
            $portalAccess['access'] = true;
        }else{
            $sql = "SELECT pp.page_url FROM portal_users_permissions pup  inner join portal_pages pp ON pp.page_id = pup.page_id AND pp.status=1 where pup.user_id=$userId AND pp.portal_id=$portal_id AND pup.status=1";
            $query   = $dbAdmin->query($sql);
            $data = ($query) ? $query->fetchAll(PDO::FETCH_ASSOC) : array();
            if(count($data) > 0){
                $portalAccess['access'] = true;
            }else{
                $portalAccess['access'] = false;
            }
        }
    }
    return $portalAccess['access'];
}

/**
 * Check if a portal user (by username) has permission to access a specific advertiser.
 * Used for mngt sign-in to advertiser7: user must have both portal access AND advertiser mapping.
 * Only Sales (role_id 1) and AM (role_id 4) require the mapping check; other roles are allowed.
 *
 * @param string $mngtuser Portal username (portal_users.username) - typically from mngt session
 * @param int $advertiserId Advertiser ID (Advertiser_info.adv_id)
 * @return bool True if super user; or if not Sales/AM; or if (user_id, advertiser_id) in portal_user_advs_mapping
 */
function hasAdvertiserAccess($mngtuser, $advertiserId)
{
    global $dbAdmin;
    if (empty($mngtuser) || empty($advertiserId) || !is_numeric($advertiserId)) {
        return false;
    }
    $advertiserId = (int) $advertiserId;
    $username = addslashes($mngtuser);
    $sql = "SELECT user_id, is_superuser FROM portal_users WHERE status=1 AND (username='$username' OR email='$username') LIMIT 1";
    $query = $dbAdmin->query($sql);
    if (!$query) {
        return false;
    }
    $row = $query->fetch(PDO::FETCH_ASSOC);
    if (!$row) {
        return false;
    }
    $userId = (int) $row['user_id'];
    if (!empty($row['is_superuser'])) {
        return true;
    }
    // Only Sales (role_id 1) and AM (role_id 4) require advertiser mapping check
    $sql = "SELECT 1 FROM portal_user_role_mapping WHERE user_id=$userId AND role_id IN (1, 4) AND status=1 LIMIT 1";
    $query = $dbAdmin->query($sql);
    $roleCheck = ($query) ? $query->fetchColumn() : 0;
    if (empty($roleCheck)) {
        return true; // not Sales/AM, allow access
    }
    $sql = "SELECT 1 FROM portal_user_advs_mapping WHERE user_id=$userId AND advertiser_id=$advertiserId LIMIT 1";
    $query = $dbAdmin->query($sql);
    return $query && $query->fetchColumn();
}

/**
 * Get advertiser IDs a Sales/AM user can access for mngt listing.
 * Only Sales (role_id 1) and AM (role_id 4) are restricted; others get full access.
 *
 * @param string $mngtuser Portal username (portal_users.username)
 * @return array|null Array of advertiser_ids to filter by, or null for full access (no filter)
 */
function getAdvertiserIdsForListing($mngtuser)
{
    global $dbAdmin;
    if (empty($mngtuser)) {
        return null;
    }
    $username = addslashes($mngtuser);
    $sql = "SELECT user_id, is_superuser FROM portal_users WHERE status=1 AND (username='$username' OR email='$username') LIMIT 1";
    $query = $dbAdmin->query($sql);
    if (!$query) {
        return null;
    }
    $row = $query->fetch(PDO::FETCH_ASSOC);
    if (!$row) {
        return null;
    }
    $userId = (int) $row['user_id'];
    if (!empty($row['is_superuser'])) {
        return null; // full access
    }
    $sql = "SELECT 1 FROM portal_user_role_mapping WHERE user_id=$userId AND role_id IN (1, 4) AND status=1 LIMIT 1";
    $query = $dbAdmin->query($sql);
    $roleCheck = ($query) ? $query->fetchColumn() : 0;
    if (empty($roleCheck)) {
        return null; // not Sales/AM, full access
    }
    $sql = "SELECT advertiser_id FROM portal_user_advs_mapping WHERE user_id=$userId";
    $query = $dbAdmin->query($sql);
    if (!$query) {
        return array(); // no access if query fails
    }
    $ids = array();
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
        $ids[] = (int) $row['advertiser_id'];
    }
    return empty($ids) ? array() : $ids; // empty = no assigned advertisers
}

/**
 * Amazon advertisers (adv_id 20378, 20638, 21610, 21734) restricted to super users + developers (role 7) + Amazon AO team (role 22)
 * + individual users who have any Amazon advertiser mapped in portal_user_advs_mapping.
 *
 * @param string $mngtuser Portal username
 * @return bool True if user can view Amazon advertisers
 */
function canViewAmazonAdvertisers($mngtuser)
{
    global $dbAdmin;
    if (empty($mngtuser)) {
        return false;
    }
    $username = addslashes($mngtuser);
    $sql = "SELECT user_id, is_superuser FROM portal_users WHERE status=1 AND (username='$username' OR email='$username') LIMIT 1";
    $query = $dbAdmin->query($sql);
    if (!$query) {
        return false;
    }
    $row = $query->fetch(PDO::FETCH_ASSOC);
    if (!$row) {
        return false;
    }
    $userId = (int) $row['user_id'];
    if (!empty($row['is_superuser'])) {
        return true;
    }
    // Check role-based access: developers (7) and Amazon AO team (22)
    $sql = "SELECT 1 FROM portal_user_role_mapping WHERE user_id=$userId AND role_id IN (7, 22) AND status=1 LIMIT 1";
    $query = $dbAdmin->query($sql);
    $roleCheck = ($query) ? $query->fetchColumn() : 0;
    if (!empty($roleCheck)) {
        return true;
    }
    // Check individual user-level access: user has any Amazon advertiser mapped in portal_user_advs_mapping
    $sql = "SELECT 1 FROM portal_user_advs_mapping WHERE user_id=$userId AND advertiser_id IN (20378, 20638, 21610, 21734) LIMIT 1";
    $query = $dbAdmin->query($sql);
    $advCheck = ($query) ? $query->fetchColumn() : 0;
    return !empty($advCheck);
}

function checkRole($userId,$roleId){
    global $dbAdmin;
    if(is_string($userId)){
        //get userid from username
        $userId = addslashes($userId);
        $sql = "SELECT user_id FROM portal_users WHERE status=1 AND (username='$userId' OR email='$userId')";
        $query   = $dbAdmin->query($sql);
        $userId = ($query) ? $query->fetchColumn() : 0;
    }
    //check if user is super user
    $sql = "SELECT 1  FROM portal_user_role_mapping WHERE user_id = $userId AND role_id=$roleId AND status=1";
    $query   = $dbAdmin->query($sql);
    $isValid = ($query) ? $query->fetchColumn() : false;
    return $isValid;
}

function getFoldersName($folderIds){
    global $dbAdmin;
    $parentids = $result = array();
    $fids = implode(",",$folderIds);
    $sql = "SELECT parent_id,folder_name  FROM portal_folders WHERE id IN ($fids) AND status=1";
    $query   = $dbAdmin->query($sql);
    $data = ($query) ? $query->fetchAll(PDO::FETCH_ASSOC) : array();
    foreach($data as $val){
        $result[] = $val['folder_name'];
        if(!empty($val['parent_id'])){
            $parentids[$val['parent_id']] = 1;
        }
    }
    if(!empty($parentids)){
        //get parent Folders name as wwell
        $parentFolders = getFoldersName(array_keys($parentids));
        $result = array_merge($result,$parentFolders);
    }
    return $result;
}

/**
 * Log user activity for tracking API requests across portals
 * 
 * @param int $userId User ID from portal_users table
 * @param string $portalName Portal name ('mngt', 'adops', 'audit', etc.)
 * @param string $requestMethod HTTP method ('GET', 'POST', etc.)
 * @param string $apiEndpoint Full URI path
 * @param string $controller Controller name (optional)
 * @param string $action Action/method name (optional)
 * @param string $username Username from session (optional, will be looked up if not provided)
 * @return bool True on success, false on failure (fails silently to not break portals)
 */
function logUserActivity($userId, $portalName, $requestMethod, $apiEndpoint, $controller = null, $action = null, $username = null)
{
    global $dbAdmin;
    
    // Fail silently if dbAdmin is not available
    if (empty($dbAdmin)) {
        return false;
    }
    
    // Validate required parameters
    if (empty($userId) || $userId <= 0 || empty($portalName) || empty($requestMethod) || empty($apiEndpoint)) {
        // Log for debugging - helps identify why logging is failing
        if (empty($userId) || $userId <= 0) {
            error_log("logUserActivity: Invalid user_id=" . var_export($userId, true) . " | portal=" . $portalName . " | session_uid=" . (!empty($_SESSION['uid']) ? $_SESSION['uid'] : 'not_set') . " | session_user_id=" . (!empty($_SESSION['user_id']) ? $_SESSION['user_id'] : 'not_set'));
        }
        return false;
    }
    
    try {
        // Try to get username from session if not provided
        if (empty($username) && !empty($_SESSION['username'])) {
            $username = $_SESSION['username'];
        }
        
        // For Adops: uid from mngt_users might not match portal_users.user_id
        // Try to find portal_users.user_id by username/email if userId lookup fails
        $portalUserId = intval($userId);
        $usernameFound = false;
        
        // Combined query: Get username from portal_users by user_id (status condition removed as per code review)
        $sql = "SELECT username FROM portal_users WHERE user_id = " . $portalUserId . " LIMIT 1";
        $query = $dbAdmin->query($sql);
        if ($query) {
            $foundUsername = $query->fetchColumn();
            if ($foundUsername) {
                $username = $foundUsername;
                $usernameFound = true;
            }
        }
        
        // If not found, try without status check
        if (!$usernameFound) {
            $sql = "SELECT username FROM portal_users WHERE user_id = " . $portalUserId . " LIMIT 1";
            $query = $dbAdmin->query($sql);
            if ($query) {
                $foundUsername = $query->fetchColumn();
                if ($foundUsername) {
                    $username = $foundUsername;
                    $usernameFound = true;
                }
            }
        }
        
        // If still not found and we have username/email from session, try to find user_id in portal_users
        // This handles the case where Adops uses mngt_users.uid but we need portal_users.user_id
        if (!$usernameFound && !empty($username)) {
            // Try to find portal_users.user_id by username or email
            $searchTerm = addslashes($username);
            $sql = "SELECT user_id, username FROM portal_users WHERE (username = '" . $searchTerm . "' OR email = '" . $searchTerm . "') LIMIT 1";
            $query = $dbAdmin->query($sql);
            if ($query) {
                $row = $query->fetch(PDO::FETCH_ASSOC);
                if ($row) {
                    // Update userId to the correct portal_users.user_id
                    $portalUserId = (int)$row['user_id'];
                    $username = $row['username'] ?: $username;
                    $usernameFound = true;
                }
            }
        }
        
        // If we found a different user_id, use that instead
        if ($portalUserId != intval($userId) && $portalUserId > 0) {
            $userId = $portalUserId;
        }
        
        // Extract IP address
        $ipAddress = null;
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ipAddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } elseif (!empty($_SERVER['REMOTE_ADDR'])) {
            $ipAddress = $_SERVER['REMOTE_ADDR'];
        }
        // Handle comma-separated IPs (from proxies)
        if ($ipAddress && strpos($ipAddress, ',') !== false) {
            $ipAddress = trim(explode(',', $ipAddress)[0]);
        }
        
        // Extract user agent
        $userAgent = !empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null;
        
        // Normalize request method to uppercase (database will handle truncation automatically)
        $requestMethod = strtoupper($requestMethod);
        
        // Prepare and execute insert (username can be NULL if not found)
        $sql = "INSERT INTO portal_user_activity_logs 
                (user_id, username, portal_name, request_method, api_endpoint, controller, action, ip_address, user_agent, created_at) 
                VALUES 
                (:user_id, :username, :portal_name, :request_method, :api_endpoint, :controller, :action, :ip_address, :user_agent, NOW())";
        
        $stmt = $dbAdmin->prepare($sql);
        $result = $stmt->execute([
            ':user_id' => $portalUserId,
            ':username' => $username,
            ':portal_name' => $portalName,
            ':request_method' => $requestMethod,
            ':api_endpoint' => $apiEndpoint,
            ':controller' => $controller,
            ':action' => $action,
            ':ip_address' => $ipAddress,
            ':user_agent' => $userAgent
        ]);
        
        // Log warning if username is missing (for debugging)
        if (empty($username)) {
            error_log("logUserActivity: Username not found for user_id=" . $portalUserId . " in portal=" . $portalName . " | original_userId=" . intval($userId));
        } else {
            // Log success for debugging (can be removed later)
            error_log("logUserActivity: Successfully logged activity for user_id=" . $portalUserId . " username=" . $username . " portal=" . $portalName);
        }
        
        return $result;
    } catch (\Exception $e) {
        // Fail silently - don't break portals if logging fails
        // Log error for debugging
        error_log("logUserActivity error: " . $e->getMessage() . " | user_id=" . intval($userId) . " | portal=" . $portalName);
        return false;
    }
}

/**
 * Centralized function to log user activity from any portal
 * This function handles all portal-specific differences (session variables, request objects, etc.)
 * 
 * Usage in CodeIgniter portals (Adops, Audit):
 *   logPortalUserActivity($this->session, $this->request, $this->loggedIn, $this->data);
 * 
 * Usage in plain PHP portals (MNGT):
 *   logPortalUserActivity(null, null, $logged_in);
 * 
 * @param mixed $session CodeIgniter session object or null for plain PHP
 * @param mixed $request CodeIgniter request object or null for plain PHP
 * @param bool $loggedIn Whether user is logged in
 * @param array $data Optional data array (for CodeIgniter controllers)
 * @return bool Success status
 */
function logPortalUserActivity($session = null, $request = null, $loggedIn = false, $data = array())
{
    // For plain PHP portals (MNGT), check $_SESSION directly if loggedIn not provided
    if ($session === null && $request === null) {
        // Plain PHP portal - check session directly
        if (!$loggedIn) {
            $loggedIn = !empty($_SESSION['username']) || !empty($_SESSION['user_id']);
        }
    } else {
        // CodeIgniter portal - use provided loggedIn flag
        // If not logged in, return early
        if (!$loggedIn) {
            return false;
        }
    }
    
    if (!$loggedIn) {
        return false;
    }
    
    global $dbAdmin;
    
    // Ensure dbAdmin is available (it should be initialized at the top of this file)
    if (empty($dbAdmin)) {
        // Try to initialize if not already done
        if (class_exists('CommonPDOConnector')) {
            $dbAdmin = CommonPDOConnector::connect('ConnectToAdmin');
        }
    }
    
    // Initialize variables
    $userId = 0;
    $username = null;
    $requestMethod = 'GET';
    $apiEndpoint = '/';
    $controller = 'unknown';
    $action = 'index';
    $portalName = 'unknown';
    
    // Handle CodeIgniter portals (CI3: adcenter, members | CI4: adops, audit)
    if ($session !== null && $request !== null) {
        // Determine portal name - check PORTAL constant first, then try to detect from session/data
        if (defined('PORTAL')) {
            $portalName = PORTAL;
        } elseif (isset($data['portal'])) {
            $portalName = $data['portal'];
        } else {
            // Try to detect from session or request path
            $portalName = 'adops'; // Default to adops for CodeIgniter
        }
        
        // Detect CI3 vs CI4: CI3 has userdata() method, CI4 has get() method
        // Check for userdata() first (CI3-specific), then check for get() (CI4-specific)
        $isCI3 = method_exists($session, 'userdata');
        $isCI4 = method_exists($session, 'get') && !$isCI3;
        
        if ($isCI4) {
            // CodeIgniter 4 (Adops, Audit)
            // Get user_id - different portals use different session keys
            if ($portalName === 'adops') {
                // Adops: 'uid' in session is actually the username string, NOT user_id
                $usernameString = $session->get('uid');
                if (!empty($usernameString)) {
                    // Look up user_id from portal_users using username
                    if (!empty($dbAdmin)) {
                        $sql = "SELECT user_id, username FROM portal_users WHERE (username = '" . addslashes($usernameString) . "' OR email = '" . addslashes($usernameString) . "') LIMIT 1";
                        $query = $dbAdmin->query($sql);
                        if ($query) {
                            $row = $query->fetch(\PDO::FETCH_ASSOC);
                            if ($row) {
                                $userId = (int)$row['user_id'];
                                $username = !empty($row['username']) ? $row['username'] : $usernameString;
                            }
                        }
                    }
                }
            } else {
                // Audit: uses 'user_id' in session
                $userId = $session->get('user_id');
                if (empty($userId) && isset($data['user_id'])) {
                    $userId = $data['user_id'];
                }
                $userId = is_numeric($userId) ? (int)$userId : 0;
                
                // Get username
                $username = $session->get('username');
                if (empty($username) && isset($data['username'])) {
                    $username = $data['username'];
                }
            }
            
            // Get request information from CodeIgniter 4 request object
            if (method_exists($request, 'getMethod')) {
                $requestMethod = $request->getMethod();
            }
            if (method_exists($request, 'getUri')) {
                $uri = $request->getUri();
                if (method_exists($uri, 'getPath')) {
                    $apiEndpoint = $uri->getPath();
                }
                if (method_exists($uri, 'getSegments')) {
                    $segments = $uri->getSegments();
                    $controller = isset($segments[0]) ? $segments[0] : 'unknown';
                    $action = isset($segments[1]) ? $segments[1] : 'index';
                }
            }
        } else {
            // CodeIgniter 3 (Adcenter, Members)
            if ($portalName === 'adcenter') {
                // Adcenter: Check for MNGT user first (when logged in via MNGT portal)
                $loggedin = $session->userdata('loggedin');
                $mngtUsername = null;
                
                // Check if this is a MNGT user login
                if (!empty($loggedin) && isset($loggedin['mngtuser']) && !empty($loggedin['mngtuser'])) {
                    $mngtUsername = $loggedin['mngtuser'];
                }
                
                // If MNGT user, look up their user_id from portal_users table
                if (!empty($mngtUsername) && !empty($dbAdmin)) {
                    $sql = "SELECT user_id, username FROM portal_users WHERE (username = '" . addslashes($mngtUsername) . "' OR email = '" . addslashes($mngtUsername) . "') LIMIT 1";
                    $query = $dbAdmin->query($sql);
                    if ($query) {
                        $row = $query->fetch(\PDO::FETCH_ASSOC);
                        if ($row) {
                            $userId = (int)$row['user_id'];
                            $username = !empty($row['username']) ? $row['username'] : $mngtUsername;
                        }
                    }
                }
                
                // If not MNGT user or lookup failed, fall back to advertiser ID
                if (empty($userId) || $userId <= 0) {
                    if (!empty($loggedin) && isset($loggedin['id'])) {
                        $userId = (int)$loggedin['id'];
                    } elseif (isset($data['user_id'])) {
                        $userId = (int)$data['user_id'];
                    } elseif (isset($data['user']) && isset($data['user']->adv_id)) {
                        $userId = (int)$data['user']->adv_id;
                    }
                    
                    // Get username from user object if available
                    if (isset($data['user']) && isset($data['user']->username)) {
                        $username = $data['user']->username;
                    } elseif (isset($data['user']) && isset($data['user']->email)) {
                        $username = $data['user']->email;
                    }
                }
                
            } elseif ($portalName === 'members') {
                // Members: Check for MNGT user first (when logged in via MNGT portal)
                $isMngtUser = $session->userdata('is_mngtuser') == 1;
                $mngtUsername = null;
                
                // Check if this is a MNGT user login
                if ($isMngtUser) {
                    $mngtUsername = $session->userdata('logged_user');
                }
                
                // If MNGT user, look up their user_id from portal_users table
                if (!empty($mngtUsername) && !empty($dbAdmin)) {
                    $sql = "SELECT user_id, username FROM portal_users WHERE (username = '" . addslashes($mngtUsername) . "' OR email = '" . addslashes($mngtUsername) . "') LIMIT 1";
                    $query = $dbAdmin->query($sql);
                    if ($query) {
                        $row = $query->fetch(\PDO::FETCH_ASSOC);
                        if ($row) {
                            $userId = (int)$row['user_id'];
                            $username = !empty($row['username']) ? $row['username'] : $mngtUsername;
                        }
                    }
                }
                
                // If not MNGT user or lookup failed, fall back to affiliate ID
                if (empty($userId) || $userId <= 0) {
                    $userId = $session->userdata('id');
                    $userId = is_numeric($userId) ? (int)$userId : 0;
                    
                    // Get username - check various possible session keys
                    $username = $session->userdata('username');
                    if (empty($username)) {
                        $username = $session->userdata('email');
                    }
                    if (empty($username) && isset($data['username'])) {
                        $username = $data['username'];
                    }
                }
                
            }
            
            // Get request information from CodeIgniter 3
            // CI3 uses $this->uri for URI segments, $this->input for input data
            // The request parameter might be $this->uri or $this->input depending on portal
            $requestMethod = !empty($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
            $apiEndpoint = !empty($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '/';
            
            // Try to get controller and action from URI object (CI3 uses $this->uri->segment())
            if (method_exists($request, 'segment')) {
                // This is $this->uri object (CI3)
                $controller = $request->segment(1) ? $request->segment(1) : 'unknown';
                $action = $request->segment(2) ? $request->segment(2) : 'index';
            } else {
                // Fallback: parse from URI manually
                $uriParts = explode('/', trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'));
                $controller = isset($uriParts[0]) && !empty($uriParts[0]) ? $uriParts[0] : 'unknown';
                $action = isset($uriParts[1]) && !empty($uriParts[1]) ? $uriParts[1] : 'index';
            }
        }
    } else {
        // Handle plain PHP portals (MNGT)
        // Determine portal name for MNGT
        if (defined('PORTAL')) {
            $portalName = PORTAL;
        } else {
            $portalName = 'mngt'; // Default for plain PHP
        }
        
        // MNGT uses $_SESSION['user_id'] and $_SESSION['username']
        $userId = !empty($_SESSION['user_id']) ? (int)$_SESSION['user_id'] : 0;
        $username = !empty($_SESSION['username']) ? $_SESSION['username'] : null;
        
        // If user_id not in session, try to get it from username (fallback)
        if ($userId <= 0 && !empty($username) && !empty($dbAdmin)) {
            $sql = "SELECT user_id FROM portal_users WHERE (username='" . addslashes($username) . "' OR email='" . addslashes($username) . "') LIMIT 1";
            $query = $dbAdmin->query($sql);
            if ($query) {
                $userId = (int)$query->fetchColumn();
            }
        }
        
        // Get request information from $_SERVER
        $requestMethod = !empty($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
        $apiEndpoint = !empty($_SERVER['REQUEST_URI']) ? parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) : '/';
        $controller = !empty($_GET['controller']) ? $_GET['controller'] : (basename($_SERVER['PHP_SELF'], '.php'));
        $action = !empty($_GET['action']) ? $_GET['action'] : 'index';
    }
    
    // Validate userId
    if ($userId <= 0) {
        return false;
    }
    
    // Call the actual logging function with correct parameter order
    // Signature: logUserActivity($userId, $portalName, $requestMethod, $apiEndpoint, $controller, $action, $username)
    return logUserActivity($userId, $portalName, $requestMethod, $apiEndpoint, $controller, $action, $username);
}

?>