<?php
// ============================================================
// شروع سشن
// ============================================================
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// ============================================================
// توابع اصلی
// ============================================================
function isLoggedIn() {
    return isset($_SESSION['user_id']);
}

function getRoleName($level) {
    $roles = [
        'admin' => 'مدیر ارشد',
        'expert' => 'مسئول ثبت‌نام',
        'reporter' => 'گزارشگر',
        'representative' => 'معرف‌کننده'
    ];
    return $roles[$level] ?? $level;
}

function hasAccess($level) {
    if (!isLoggedIn()) return false;
    $userLevel = $_SESSION['user_level'] ?? 'reporter';
    $levels = ['reporter' => 1, 'representative' => 2, 'expert' => 3, 'admin' => 4];
    return isset($levels[$userLevel]) && $levels[$userLevel] >= $levels[$level];
}

function canEditMember($member) {
    if (!isLoggedIn()) return false;
    $userLevel = $_SESSION['user_level'] ?? 'reporter';
    $userId = $_SESSION['user_id'] ?? 0;
    
    if ($userLevel == 'admin') return true;
    if ($userLevel == 'expert') return true;
    
    if ($userLevel == 'representative') {
        if ($member['representative_id'] != $userId) return false;
        return $member['status'] != 'deleted';
    }
    
    return false;
}

// ============================================================
// وضعیت‌های کلی
// ============================================================
function getStatusLabel($status) {
    $labels = [
        'active' => 'فعال',
        'completed' => 'تکمیل شده',
        'withdrawn' => 'انصرافی'
    ];
    return $labels[$status] ?? $status;
}

function getStatusColor($status) {
    $colors = [
        'active' => 'primary',
        'completed' => 'success',
        'withdrawn' => 'danger'
    ];
    return $colors[$status] ?? 'secondary';
}

// ============================================================
// وضعیت‌های تماس
// ============================================================
function getContactStatusOptions() {
    return [
        'تماس گرفته شده',
        'تماس گرفته نشده',
        'در انتظار پاسخ',
        'عدم پاسخ گویی'
    ];
}

function getContactStatusColor($status) {
    $colors = [
        'تماس گرفته شده' => 'success',
        'تماس گرفته نشده' => 'secondary',
        'در انتظار پاسخ' => 'warning',
        'عدم پاسخ گویی' => 'danger'
    ];
    return $colors[$status] ?? 'secondary';
}

// ============================================================
// وضعیت‌های مدارک
// ============================================================
function getDocumentStatusOptions() {
    return [
        'در انتظار تکمیل مدرک',
        'مدارک تکمیل شده',
        'تایید شده',
        'انصراف'
    ];
}

function getDocumentStatusColor($status) {
    $colors = [
        'در انتظار تکمیل مدرک' => 'warning',
        'مدارک تکمیل شده' => 'info',
        'تایید شده' => 'success',
        'انصراف' => 'danger'
    ];
    return $colors[$status] ?? 'secondary';
}

// ============================================================
// وضعیت‌های پرداخت
// ============================================================
function getPaymentStatusOptions() {
    return [
        'پرداخت شده',
        'پرداخت نشده',
        'در انتظار پرداخت',
        'عودت وجه'
    ];
}

// ============================================================
// قانون طلایی تأیید
// ============================================================
function checkAndUpdateVerification($memberId) {
    global $pdo;
    
    $stmt = $pdo->prepare("SELECT * FROM members WHERE id = ?");
    $stmt->execute([$memberId]);
    $member = $stmt->fetch();
    
    if (!$member) return false;
    
    $isPaymentOk = $member['payment_status'] == 'پرداخت شده';
    $isDocsOk = $member['document_status'] == 'مدارک تکمیل شده';
    
    if ($isPaymentOk && $isDocsOk) {
        if ($member['document_status'] != 'تایید شده') {
            $stmt = $pdo->prepare("UPDATE members SET document_status = 'تایید شده' WHERE id = ?");
            $stmt->execute([$memberId]);
            
            logMemberActivity($memberId, $_SESSION['user_id'] ?? 0, 'auto_verify', $member['document_status'], 'تایید شده');
            logStatusChange($memberId, $_SESSION['user_id'] ?? 0, $member['document_status'], 'تایید شده', 'تأیید خودکار');
            
            return true;
        }
    }
    
    return false;
}

// ============================================================
// توابع تبدیل تاریخ شمسی
// ============================================================
function convertToPersianDate($datetime) {
    if (empty($datetime)) return '-';
    $timestamp = strtotime($datetime);
    if ($timestamp === false) return '-';
    date_default_timezone_set('Asia/Tehran');
    
    if (class_exists('IntlDateFormatter')) {
        try {
            $formatter = new IntlDateFormatter(
                'fa_IR@calendar=persian',
                IntlDateFormatter::FULL,
                IntlDateFormatter::NONE,
                'Asia/Tehran',
                IntlDateFormatter::TRADITIONAL,
                'yyyy/MM/dd - HH:mm'
            );
            $result = $formatter->format($timestamp);
            if ($result !== false && $result !== '') {
                return $result;
            }
        } catch (Exception $e) {}
    }
    return date('Y/m/d - H:i', $timestamp);
}

function convertToPersianDateOnly($datetime) {
    if (empty($datetime)) return '-';
    $timestamp = strtotime($datetime);
    if ($timestamp === false) return '-';
    date_default_timezone_set('Asia/Tehran');
    
    if (class_exists('IntlDateFormatter')) {
        try {
            $formatter = new IntlDateFormatter(
                'fa_IR@calendar=persian',
                IntlDateFormatter::FULL,
                IntlDateFormatter::NONE,
                'Asia/Tehran',
                IntlDateFormatter::TRADITIONAL,
                'yyyy/MM/dd'
            );
            $result = $formatter->format($timestamp);
            if ($result !== false && $result !== '') {
                return $result;
            }
        } catch (Exception $e) {}
    }
    return date('Y/m/d', $timestamp);
}

function getCurrentPersianDateTime() {
    date_default_timezone_set('Asia/Tehran');
    return convertToPersianDate(date('Y-m-d H:i:s'));
}

function convertToPersianDateFa($datetime) {
    return toPersianNumbers(convertToPersianDate($datetime));
}

function convertToPersianDateOnlyFa($datetime) {
    return toPersianNumbers(convertToPersianDateOnly($datetime));
}

function getCurrentPersianDateTimeFa() {
    return toPersianNumbers(getCurrentPersianDateTime());
}

// ============================================================
// تبدیل اعداد انگلیسی به فارسی
// ============================================================
function toPersianNumbers($number) {
    if ($number === null || $number === '') return '';
    $persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
    $english = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
    return str_replace($english, $persian, (string)$number);
}

function toEnglishNumbers($number) {
    if ($number === null || $number === '') return '';
    $persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
    $english = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
    return str_replace($persian, $english, (string)$number);
}

// ============================================================
// توابع لاگ
// ============================================================
function logMemberActivity($memberId, $userId, $action, $oldValue = null, $newValue = null) {
    global $pdo;
    try {
        $ip = $_SERVER['REMOTE_ADDR'] ?? null;
        $stmt = $pdo->prepare("INSERT INTO member_logs (member_id, user_id, action, old_value, new_value, ip_address) VALUES (?, ?, ?, ?, ?, ?)");
        $stmt->execute([
            $memberId,
            $userId,
            $action,
            $oldValue ? json_encode($oldValue) : null,
            $newValue ? json_encode($newValue) : null,
            $ip
        ]);
    } catch(PDOException $e) {
        // ignore
    }
}

function logSystemActivity($userId, $eventType, $description = null) {
    global $pdo;
    try {
        $ip = $_SERVER['REMOTE_ADDR'] ?? null;
        $stmt = $pdo->prepare("INSERT INTO system_logs (user_id, event_type, description, ip_address) VALUES (?, ?, ?, ?)");
        $stmt->execute([$userId, $eventType, $description, $ip]);
    } catch(PDOException $e) {
        // ignore
    }
}

function logStatusChange($memberId, $userId, $oldStatus, $newStatus, $reason = null) {
    global $pdo;
    try {
        $stmt = $pdo->prepare("INSERT INTO member_status_log (member_id, user_id, old_status, new_status, reason) VALUES (?, ?, ?, ?, ?)");
        $stmt->execute([$memberId, $userId, $oldStatus, $newStatus, $reason]);
    } catch(PDOException $e) {
        // ignore
    }
}

// ============================================================
// توابع سیستم UTM
// ============================================================
function detectDevice() {
    $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    $mobileAgents = ['Android', 'iPhone', 'iPad', 'iPod', 'BlackBerry', 'Windows Phone', 'Opera Mini', 'Mobile', 'webOS'];
    foreach ($mobileAgents as $agent) {
        if (stripos($userAgent, $agent) !== false) {
            return 'mobile';
        }
    }
    if (stripos($userAgent, 'iPad') !== false || stripos($userAgent, 'Tablet') !== false) {
        return 'tablet';
    }
    return 'desktop';
}

function getUtmParams() {
    $utm = [
        'utm_source' => $_GET['utm_source'] ?? null,
        'utm_medium' => $_GET['utm_medium'] ?? null,
        'utm_campaign' => $_GET['utm_campaign'] ?? null,
        'utm_link_id' => $_GET['utm_link_id'] ?? null
    ];
    return $utm;
}

function logUtmClick($utmLinkId) {
    global $pdo;
    try {
        $ip = $_SERVER['REMOTE_ADDR'] ?? null;
        $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? null;
        $stmt = $pdo->prepare("INSERT INTO utm_clicks (utm_link_id, ip_address, user_agent) VALUES (?, ?, ?)");
        $stmt->execute([$utmLinkId, $ip, $userAgent]);
        
        $stmt = $pdo->prepare("UPDATE utm_links SET clicks = clicks + 1 WHERE id = ?");
        $stmt->execute([$utmLinkId]);
    } catch(PDOException $e) {
        // ignore
    }
}

function incrementUtmRegistration($utmLinkId) {
    global $pdo;
    try {
        $stmt = $pdo->prepare("UPDATE utm_links SET registrations = registrations + 1 WHERE id = ?");
        $stmt->execute([$utmLinkId]);
    } catch(PDOException $e) {
        // ignore
    }
}

function getRepresentativeName($representativeId) {
    global $pdo;
    if (empty($representativeId)) return '-';
    try {
        $stmt = $pdo->prepare("SELECT fullname FROM users WHERE id = ?");
        $stmt->execute([$representativeId]);
        $row = $stmt->fetch();
        return $row ? $row['fullname'] : '-';
    } catch(PDOException $e) {
        return '-';
    }
}

// ============================================================
// توابع مدیریت فیلدهای داینامیک
// ============================================================
function getDynamicFieldsBySection($section) {
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM dynamic_fields WHERE section = ? AND status = 'active' ORDER BY sort_order");
    $stmt->execute([$section]);
    return $stmt->fetchAll();
}

function getAllDynamicFieldsGrouped() {
    global $pdo;
    $stmt = $pdo->query("SELECT * FROM dynamic_fields WHERE status = 'active' ORDER BY section, sort_order");
    $fields = $stmt->fetchAll();
    
    $grouped = [
        'personal' => [],
        'educational' => [],
        'status' => [],
        'referral' => []
    ];
    
    foreach ($fields as $field) {
        $section = $field['section'] ?? 'personal';
        if (isset($grouped[$section])) {
            $grouped[$section][] = $field;
        }
    }
    
    return $grouped;
}

// ============================================================
// توابع مدیریت رشته‌های جدید (courses)
// ============================================================
function getCoursesByEducation($educationId) {
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM courses WHERE education_id = ? AND status = 'active' ORDER BY sort_order");
    $stmt->execute([$educationId]);
    return $stmt->fetchAll();
}

function getAllCourses() {
    global $pdo;
    $stmt = $pdo->query("
        SELECT c.*, e.name as education_name 
        FROM courses c 
        LEFT JOIN educations e ON c.education_id = e.id 
        ORDER BY c.sort_order
    ");
    return $stmt->fetchAll();
}

function getCourseName($courseId) {
    global $pdo;
    if (empty($courseId)) return '-';
    $stmt = $pdo->prepare("SELECT name FROM courses WHERE id = ?");
    $stmt->execute([$courseId]);
    $row = $stmt->fetch();
    return $row ? $row['name'] : '-';
}

// ============================================================
// توابع کمکی
// ============================================================
function fixPersianText($text) {
    if (empty($text)) return $text;
    if (mb_detect_encoding($text, 'UTF-8', true) === false) {
        $text = utf8_encode($text);
    }
    return $text;
}

// ============================================================
// ============================================================
// ========== توابع مدیریت مدارک (آپلود فایل) ==========
// ============================================================
// ============================================================

/**
 * آپلود فایل مدرک دانشجو
 * @param array $file - فایل ارسال شده از $_FILES
 * @param int $memberId - شناسه دانشجو
 * @param string $docType - نوع مدرک (profile, national_card, ...)
 * @return array - نتیجه آپلود
 */
function uploadMemberDocument($file, $memberId, $docType) {
    global $pdo;
    
    // تنظیمات
    $allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
    $maxSize = 5 * 1024 * 1024; // 5 مگابایت
    $uploadDir = $_SERVER['DOCUMENT_ROOT'] . '/portal/uploads/members/' . $memberId . '/';
    
    // اعتبارسنجی
    if ($file['error'] !== UPLOAD_ERR_OK) {
        return ['success' => false, 'message' => 'خطا در آپلود فایل'];
    }
    
    if (!in_array($file['type'], $allowedTypes)) {
        return ['success' => false, 'message' => 'فرمت فایل مجاز نیست (JPG, PNG, PDF)'];
    }
    
    if ($file['size'] > $maxSize) {
        return ['success' => false, 'message' => 'حجم فایل بیشتر از ۵ مگابایت است'];
    }
    
    // ایجاد پوشه اگر وجود ندارد
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0755, true);
    }
    
    // تولید نام استاندارد
    $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
    $newName = $docType . '.' . $ext;
    $filePath = $uploadDir . $newName;
    $relativePath = '/portal/uploads/members/' . $memberId . '/' . $newName;
    
    // انتقال فایل
    if (!move_uploaded_file($file['tmp_name'], $filePath)) {
        return ['success' => false, 'message' => 'خطا در ذخیره فایل'];
    }
    
    // حذف فایل قبلی (در صورت وجود)
    $stmt = $pdo->prepare("SELECT id, file_path FROM member_documents WHERE member_id = ? AND doc_type = ?");
    $stmt->execute([$memberId, $docType]);
    $oldDoc = $stmt->fetch();
    if ($oldDoc) {
        $oldPath = $_SERVER['DOCUMENT_ROOT'] . $oldDoc['file_path'];
        if (file_exists($oldPath)) {
            unlink($oldPath);
        }
        $stmt = $pdo->prepare("DELETE FROM member_documents WHERE id = ?");
        $stmt->execute([$oldDoc['id']]);
    }
    
    // ذخیره در دیتابیس
    $stmt = $pdo->prepare("INSERT INTO member_documents (member_id, doc_type, file_name, file_path, file_size, mime_type, status) 
                           VALUES (?, ?, ?, ?, ?, ?, 'pending')");
    $stmt->execute([
        $memberId,
        $docType,
        $newName,
        $relativePath,
        $file['size'],
        $file['type']
    ]);
    
    return [
        'success' => true,
        'message' => 'فایل با موفقیت آپلود شد',
        'file_path' => $relativePath,
        'file_name' => $newName
    ];
}

/**
 * دریافت مدارک یک دانشجو
 * @param int $memberId - شناسه دانشجو
 * @return array - لیست مدارک
 */
function getMemberDocuments($memberId) {
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM member_documents WHERE member_id = ? ORDER BY doc_type");
    $stmt->execute([$memberId]);
    return $stmt->fetchAll();
}

/**
 * دریافت یک مدرک خاص
 * @param int $docId - شناسه مدرک
 * @return array|false
 */
function getDocumentById($docId) {
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM member_documents WHERE id = ?");
    $stmt->execute([$docId]);
    return $stmt->fetch();
}

/**
 * تأیید مدرک توسط کارشناس یا ادمین
 * @param int $docId - شناسه مدرک
 * @param int $userId - شناسه کاربر تأییدکننده
 * @param string $status - approved / rejected
 * @return bool
 */
function approveDocument($docId, $userId, $status = 'approved') {
    global $pdo;
    $stmt = $pdo->prepare("UPDATE member_documents SET status = ?, approved_by = ?, approved_at = NOW() WHERE id = ?");
    return $stmt->execute([$status, $userId, $docId]);
}

/**
 * بررسی آیا مدارک دانشجو کامل و تأیید شده است
 * @param int $memberId - شناسه دانشجو
 * @param bool $checkApproved - فقط تأیید شده‌ها را بررسی کن
 * @return bool
 */
function isMemberDocumentsComplete($memberId, $checkApproved = true) {
    global $pdo;
    
    // مدارک مورد نیاز (به جز کارت پایان خدمت که شرطی است)
    $requiredDocs = ['profile', 'national_card', 'birth_certificate', 'last_degree'];
    
    // بررسی جنسیت برای کارت پایان خدمت
    $stmt = $pdo->prepare("SELECT gender FROM members WHERE id = ?");
    $stmt->execute([$memberId]);
    $member = $stmt->fetch();
    if ($member && $member['gender'] == 'مرد') {
        $requiredDocs[] = 'military_service';
    }
    
    $statusCondition = $checkApproved ? "status = 'approved'" : "status IN ('pending', 'approved')";
    $placeholders = implode(',', array_fill(0, count($requiredDocs), '?'));
    $stmt = $pdo->prepare("SELECT doc_type FROM member_documents WHERE member_id = ? AND $statusCondition AND doc_type IN ($placeholders)");
    $stmt->execute(array_merge([$memberId], $requiredDocs));
    $existing = $stmt->fetchAll(PDO::FETCH_COLUMN);
    
    return empty(array_diff($requiredDocs, $existing));
}

/**
 * حذف فیزیکی مدرک
 * @param int $docId - شناسه مدرک
 * @return bool
 */
function deleteMemberDocument($docId) {
    global $pdo;
    $doc = getDocumentById($docId);
    if (!$doc) return false;
    
    // حذف فایل از سرور
    $filePath = $_SERVER['DOCUMENT_ROOT'] . $doc['file_path'];
    if (file_exists($filePath)) {
        unlink($filePath);
    }
    
    // حذف از دیتابیس
    $stmt = $pdo->prepare("DELETE FROM member_documents WHERE id = ?");
    return $stmt->execute([$docId]);
}

/**
 * بررسی آیا آپلود مدارک برای یک نقش خاص اجباری است
 * @param string $role - public, representative, expert, admin
 * @return bool
 */
function isUploadRequired($role) {
    global $pdo;
    $fieldName = 'upload_required_' . $role;
    $stmt = $pdo->prepare("SELECT required FROM dynamic_fields WHERE field_name = ? AND status = 'active'");
    $stmt->execute([$fieldName]);
    $result = $stmt->fetch();
    return $result ? (bool)$result['required'] : false;
}

/**
 * چک کردن اینکه آیا دانشجو اجازه ویرایش مدارک را دارد یا نه
 * @param int $memberId
 * @return bool
 */
function canEditDocuments($memberId) {
    $docs = getMemberDocuments($memberId);
    foreach ($docs as $doc) {
        if ($doc['status'] == 'approved') {
            return false;
        }
    }
    return true;
}

?>