<?php
// ════════════════════════════════════════════════════════════════════════════════
// Session Helpers
// ════════════════════════════════════════════════════════════════════════════════
function isLoggedIn() {
    return !empty($_SESSION['user_id']);
}

function getSession($key) {
    return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
}

function setSession($key, $value) {
    $_SESSION[$key] = $value;
}

function redirect($url) {
    header("Location: {$url}");
    exit;
}

// ════════════════════════════════════════════════════════════════════════════════
// CSRF
// ════════════════════════════════════════════════════════════════════════════════
function generateCsrfToken() {
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function validateCsrfToken($token) {
    return !empty($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}

// ════════════════════════════════════════════════════════════════════════════════
// Role Helpers
// ════════════════════════════════════════════════════════════════════════════════
function canSee($roles) {
    return in_array(getSession('role'), $roles, true);
}

function isMR() {
    return getSession('role') === 'mr';
}

function isAdmin() {
    return getSession('role') === 'super_admin';
}

function isStaff() {
    return in_array(getSession('role'), array('exn','sdo','je'), true);
}

// ════════════════════════════════════════════════════════════════════════════════
// Middleware
// ════════════════════════════════════════════════════════════════════════════════
function middleware($allowed = array()) {
    if (!isLoggedIn()) {
        redirect(BASE_URL . '/auth/login.php');
    }
    if (!(bool)getSession('is_active')) {
        session_destroy();
        redirect(BASE_URL . '/auth/login.php?err=disabled');
    }
    if (!empty($allowed) && !in_array(getSession('role'), $allowed, true)) {
        redirect(BASE_URL . '/auth/unauthorized.php');
    }
}

// ════════════════════════════════════════════════════════════════════════════════
// Database Helpers
// ════════════════════════════════════════════════════════════════════════════════
function dbVal($db, $sql, $p = array()) {
    $s = $db->prepare($sql);
    $s->execute($p);
    $r = $s->fetch(PDO::FETCH_NUM);
    return $r ? $r[0] : 0;
}

function dbRow($db, $sql, $p = array()) {
    $s = $db->prepare($sql);
    $s->execute($p);
    return $s->fetch();
}

function dbRows($db, $sql, $p = array()) {
    $s = $db->prepare($sql);
    $s->execute($p);
    return $s->fetchAll();
}

function safeDbVal($db, $sql, $p = array()) {
    try {
        return dbVal($db, $sql, $p);
    } catch (Throwable $e) {
        return 0;
    }
}

// NOTE: getDBConnection() is defined in config/db.php - do not redeclare here!

// ════════════════════════════════════════════════════════════════════════════════
// Image Helpers
// ════════════════════════════════════════════════════════════════════════════════
function saveBase64Image($base64, $folder) {
    if (empty($base64)) return false;
    if (strpos($base64, ',') !== false) {
        $parts = explode(',', $base64, 2);
        $base64 = $parts[1];
    }
    $decoded = base64_decode(str_replace(array('-','_'), array('+','/'), $base64));
    if (!$decoded) return false;

    $dir = UPLOAD_PATH . $folder . DIRECTORY_SEPARATOR;
    if (!is_dir($dir)) {
        mkdir($dir, 0755, true);
    }
    $filename = date('Ymd_His') . '_' . bin2hex(random_bytes(4)) . '.jpg';
    if (file_put_contents($dir . $filename, $decoded) === false) return false;
    return $folder . '/' . $filename;
}

function imgUrl($path) {
    if (!$path) return BASE_URL . '/assets/images/no-photo.png';
    return UPLOAD_URL . $path;
}

// ════════════════════════════════════════════════════════════════════════════════
// Formatting & Badges
// ════════════════════════════════════════════════════════════════════════════════
function h($s) {
    return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8');
}

function formatDt($dt) {
    if (!$dt) return '—';
    return date('d M Y, h:i A', strtotime($dt));
}

function statusBadge($status) {
    $map = array(
        'mri_done'             => array('success', 'MRI Done'),
        'smart_meter'          => array('info',    'Smart Meter'),
        'meter_port_defective' => array('danger',  'Port Defective'),
    );
    $badge = isset($map[$status]) ? $map[$status] : array('secondary', $status);
    return "<span class='badge bg-" . $badge[0] . "'>" . h($badge[1]) . "</span>";
}

function billTypeBadge($type) {
    $map = array(
        'smart_meter'  => array('info',    'Smart Meter'),
        'normal_meter' => array('warning', 'Normal Meter'),
    );
    $badge = isset($map[$type]) ? $map[$type] : array('secondary', $type);
    return "<span class='badge bg-" . $badge[0] . "'>" . h($badge[1]) . "</span>";
}

function remarkLabel($r) {
    $map = array(
        'meter_par_rakha'  => 'Meter par rakh diya tha',
        'consumer_ko_diya' => 'Consumer ko diya tha',
    );
    return isset($map[$r]) ? $map[$r] : $r;
}

function roleBadge($role) {
    $map = array(
        'super_admin' => array('danger',  'Super Admin'),
        'exn'         => array('primary', 'EXN'),
        'sdo'         => array('info',    'SDO'),
        'je'          => array('warning', 'JE'),
        'mr'          => array('success', 'Meter Reader'),
    );
    $badge = isset($map[$role]) ? $map[$role] : array('secondary', strtoupper($role));
    return "<span class='badge bg-" . $badge[0] . "'>" . h($badge[1]) . "</span>";
}

function roleLabel($role) {
    $map = array(
        'super_admin' => 'Super Admin',
        'exn'         => 'EXN',
        'sdo'         => 'SDO',
        'je'          => 'JE',
        'mr'          => 'Meter Reader'
    );
    return isset($map[$role]) ? $map[$role] : strtoupper($role);
}

function typeBadge($type) {
    $map = array(
        'solar' => array('warning', 'Solar'),
        'kcc'   => array('primary', 'KCC'),
        'both'  => array('success', 'Both')
    );
    $badge = isset($map[$type]) ? $map[$type] : array('secondary', $type);
    return "<span class='badge bg-" . $badge[0] . "'>" . h($badge[1]) . "</span>";
}
?>
