<?php
// includes/functions.php
// Fungsi umum yang digunakan di seluruh aplikasi

// Membuat koneksi database
function dbConnect() {
    $db = new Database();
    return $db;
}

// Fungsi untuk mengamankan input
function sanitize($input) {
    return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8');
}

// Fungsi untuk mengecek apakah user sudah login
function isLoggedIn() {
    if(isset($_SESSION['user_id'])) {
        return true;
    }
    return false;
}

// Fungsi untuk mengecek apakah user adalah admin
function isAdmin() {
    if(isset($_SESSION['role']) && $_SESSION['role'] == 'admin') {
        return true;
    }
    return false;
}

// Redirect ke halaman lain
function redirect($url) {
    header('Location: ' . $url);
    exit;
}

// Set flash message
function setFlash($name, $message, $type = 'success') {
    $_SESSION['flash'] = [
        'name' => $name,
        'message' => $message,
        'type' => $type
    ];
}

// Tampilkan flash message
function flash() {
    if(isset($_SESSION['flash'])) {
        echo '<div class="alert alert-' . $_SESSION['flash']['type'] . ' alert-dismissible fade show" role="alert">
                ' . $_SESSION['flash']['message'] . '
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
              </div>';
        unset($_SESSION['flash']);
    }
}

// Format rupiah
function rupiah($angka) {
    return 'Rp ' . number_format($angka, 0, ',', '.');
}

// Format tanggal ke Indonesia
function tanggal_indo($tanggal, $cetak_hari = false) {
    $hari = array(
        1 => 'Senin',
        'Selasa',
        'Rabu',
        'Kamis',
        'Jumat',
        'Sabtu',
        'Minggu'
    );
    $bulan = array(
        1 => 'Januari',
        'Februari',
        'Maret',
        'April',
        'Mei',
        'Juni',
        'Juli',
        'Agustus',
        'September',
        'Oktober',
        'November',
        'Desember'
    );
    $split = explode('-', $tanggal);
    $tgl_indo = $split[2] . ' ' . $bulan[(int)$split[1]] . ' ' . $split[0];
    
    if ($cetak_hari) {
        $num = date('N', strtotime($tanggal));
        return $hari[$num] . ', ' . $tgl_indo;
    }
    return $tgl_indo;
}

// Upload file
function uploadFile($file, $direktori, $jenis = 'gambar') {
    $namaFile = $file['name'];
    $ukuranFile = $file['size'];
    $error = $file['error'];
    $tmpName = $file['tmp_name'];
    
    // Cek apakah tidak ada gambar yang diupload
    if($error === 4) {
        setFlash('gagal', 'Pilih file terlebih dahulu', 'danger');
        return false;
    }
    
    // Cek apakah yang diupload adalah gambar
    if($jenis == 'gambar') {
        $ekstensiValid = ['jpg', 'jpeg', 'png'];
        $ekstensiFile = explode('.', $namaFile);
        $ekstensiFile = strtolower(end($ekstensiFile));
        
        if(!in_array($ekstensiFile, $ekstensiValid)) {
            setFlash('gagal', 'Yang Anda upload bukan gambar', 'danger');
            return false;
        }
        
        // Cek ukuran file
        if($ukuranFile > 2000000) { // 2MB
            setFlash('gagal', 'Ukuran gambar terlalu besar', 'danger');
            return false;
        }
    } elseif($jenis == 'dokumen') {
        $ekstensiValid = ['pdf', 'doc', 'docx'];
        $ekstensiFile = explode('.', $namaFile);
        $ekstensiFile = strtolower(end($ekstensiFile));
        
        if(!in_array($ekstensiFile, $ekstensiValid)) {
            setFlash('gagal', 'Yang Anda upload bukan dokumen', 'danger');
            return false;
        }
        
        // Cek ukuran file
        if($ukuranFile > 5000000) { // 5MB
            setFlash('gagal', 'Ukuran dokumen terlalu besar', 'danger');
            return false;
        }
    }
    
    // Generate nama file baru
    $namaFileBaru = uniqid() . '.' . $ekstensiFile;
    
    // Pastikan direktori ada
    if (!file_exists($direktori)) {
        mkdir($direktori, 0777, true);
    }
    
    // Upload file
    $path = $direktori . $namaFileBaru;
    if(move_uploaded_file($tmpName, $path)) {
        return $namaFileBaru;
    } else {
        setFlash('gagal', 'Upload file gagal', 'danger');
        return false;
    }
}

// Menghitung persentase
function hitungPersentase($nilai, $total) {
    if($total == 0) {
        return 0;
    }
    return round(($nilai / $total) * 100);
}

// Potong teks
function potongTeks($teks, $panjang = 100) {
    if(strlen($teks) > $panjang) {
        $teks = substr($teks, 0, $panjang) . '...';
    }
    return $teks;
}

// Fungsi untuk mengecek role
function checkRole($allowedRoles) {
    if (!isLoggedIn()) {
        setFlash('login_required', 'Anda harus login untuk mengakses halaman ini', 'danger');
        redirect(SITE_URL . '/auth/login.php');
        exit;
    }
    
    if (!is_array($allowedRoles)) {
        $allowedRoles = [$allowedRoles];
    }
    
    if (!in_array($_SESSION['role'], $allowedRoles)) {
        setFlash('access_denied', 'Anda tidak memiliki akses ke halaman ini', 'danger');
        
        switch ($_SESSION['role']) {
            case 'admin':
                redirect(SITE_URL . '/admin/dashboard.php');
                break;
            case 'ketua':
                redirect(SITE_URL . '/ketua/dashboard.php');
                break;
            case 'bendahara':
                redirect(SITE_URL . '/bendahara/dashboard.php');
                break;
            case 'sekretaris':
                redirect(SITE_URL . '/sekretaris/dashboard.php');
                break;
            case 'pengawas':
                redirect(SITE_URL . '/pengawas/dashboard.php');
                break;
            case 'donatur':
                redirect(SITE_URL . '/user/dashboard.php');
                break;
            default:
                redirect(SITE_URL);
                break;
        }
        exit;
    }
    
    return true;
}

// Mengecek apakah user adalah ketua
function isKetua() {
    if(isset($_SESSION['role']) && $_SESSION['role'] == 'ketua') {
        return true;
    }
    return false;
}

// Mengecek apakah user adalah bendahara
function isBendahara() {
    if(isset($_SESSION['role']) && $_SESSION['role'] == 'bendahara') {
        return true;
    }
    return false;
}

// Mengecek apakah user adalah sekretaris
function isSekretaris() {
    if(isset($_SESSION['role']) && $_SESSION['role'] == 'sekretaris') {
        return true;
    }
    return false;
}

// Mengecek apakah user adalah pengawas
function isPengawas() {
    if(isset($_SESSION['role']) && $_SESSION['role'] == 'pengawas') {
        return true;
    }
    return false;
}

// Mendapatkan nama role untuk ditampilkan
function getRoleName($role) {
    switch($role) {
        case 'admin':
            return 'Administrator';
        case 'ketua':
            return 'Ketua Yayasan';
        case 'bendahara':
            return 'Bendahara';
        case 'sekretaris':
            return 'Sekretaris';
        case 'pengawas':
            return 'Pengawas';
        case 'donatur':
            return 'Donatur';
        default:
            return ucfirst($role);
    }
}

// Fungsi untuk mendapatkan jumlah notifikasi yang belum dibaca
function getUnreadNotificationsCount($user_id) {
    $db = dbConnect();
    $db->query("SELECT COUNT(*) as count FROM notifications WHERE user_id = :user_id AND is_read = 0");
    $db->bind(':user_id', $user_id);
    $result = $db->single();
    
    return $result->count ?? 0;
}

// Fungsi untuk mencatat log aktivitas
function logActivity($activity, $entity_type, $entity_id = null, $description = null) {
    if (!isLoggedIn()) {
        return false;
    }
    
    try {
        $db = dbConnect();
        $ip_address = $_SERVER['REMOTE_ADDR'] ?? null;
        
        $db->query("INSERT INTO logs (user_id, activity, entity_type, entity_id, description, ip_address) 
                   VALUES (:user_id, :activity, :entity_type, :entity_id, :description, :ip_address)");
                   
        $db->bind(':user_id', $_SESSION['user_id']);
        $db->bind(':activity', $activity);
        $db->bind(':entity_type', $entity_type);
        $db->bind(':entity_id', $entity_id);
        $db->bind(':description', $description);
        $db->bind(':ip_address', $ip_address);
        
        return $db->execute();
    } catch (PDOException $e) {
        // Jika terjadi error, abaikan saja
        // Ini untuk mencegah error pada halaman
        return false;
    }
}

// Fungsi untuk membuat notifikasi
function createNotification($db, $user_id, $title, $message, $link = null) {
    // Cek dan buat tabel jika belum ada
    $db->query("SHOW TABLES LIKE 'notifications'");
    $tableExists = $db->rowCount() > 0;

    if (!$tableExists) {
        $db->query("CREATE TABLE notifications (
            id INT AUTO_INCREMENT PRIMARY KEY,
            user_id INT NOT NULL,
            title VARCHAR(255) NOT NULL,
            message TEXT NOT NULL,
            is_read BOOLEAN DEFAULT FALSE,
            link VARCHAR(255) NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )");
        $db->execute();
    }

    // Insert notifikasi
    $db->query("INSERT INTO notifications (user_id, title, message, link) 
                VALUES (:user_id, :title, :message, :link)");
    $db->bind(':user_id', $user_id);
    $db->bind(':title', $title);
    $db->bind(':message', $message);
    $db->bind(':link', $link);

    return $db->execute();
}


// Fungsi untuk mendapatkan semua users dengan role tertentu
function getUsersByRole($role) {
    $db = dbConnect();
    $db->query("SELECT * FROM users WHERE role = :role");
    $db->bind(':role', $role);
    return $db->resultSet();
}

// Fungsi untuk status kampanye
function getKampanyeStatusBadge($status) {
    switch($status) {
        case 'aktif':
            return '<span class="badge bg-success">Aktif</span>';
        case 'selesai':
            return '<span class="badge bg-primary">Selesai</span>';
        case 'dibatalkan':
            return '<span class="badge bg-danger">Dibatalkan</span>';
        case 'menunggu_persetujuan':
            return '<span class="badge bg-warning text-dark">Menunggu Persetujuan</span>';
        default:
            return '<span class="badge bg-secondary">' . ucfirst($status) . '</span>';
    }
}

// Fungsi untuk status donasi
function getDonasiStatusBadge($status) {
    switch($status) {
        case 'menunggu':
            return '<span class="badge bg-warning text-dark">Menunggu</span>';
        case 'diverifikasi':
            return '<span class="badge bg-success">Diverifikasi</span>';
        case 'ditolak':
            return '<span class="badge bg-danger">Ditolak</span>';
        default:
            return '<span class="badge bg-secondary">' . ucfirst($status) . '</span>';
    }
}

// Fungsi untuk mendapatkan dashboard URL berdasarkan role
function getDashboardUrl($role) {
    switch($role) {
        case 'admin':
            return SITE_URL . '/admin/dashboard.php';
        case 'ketua':
            return SITE_URL . '/ketua/dashboard.php';
        case 'bendahara':
            return SITE_URL . '/bendahara/dashboard.php';
        case 'sekretaris':
            return SITE_URL . '/sekretaris/dashboard.php';
        case 'pengawas':
            return SITE_URL . '/pengawas/dashboard.php';
        case 'donatur':
            return SITE_URL . '/user/dashboard.php';
        default:
            return SITE_URL;
    }
}
?>