<?php
// Enable error display for development purposes
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$pageTitle = 'تسجيل الحضور/الانصراف';
include '../../includes/header.php';

// Check if the user is logged in (Assuming checkLogin() is defined elsewhere)
checkLogin();

$db = getDB();
$errors = [];
$success_message = '';
$employee_id = $_SESSION['user_id'] ?? null;

// Check if a user file is associated with the account in the employees table
$employee_check = $db->select("SELECT id FROM employees WHERE user_id = ?", [$employee_id]);
if (empty($employee_check)) {
    $_SESSION['error_message'] = 'لا يوجد ملف موظف مرتبط بحسابك.';
    header('Location: ../../index.php');
    exit();
}
$employee_db_id = $employee_check[0]['id'];

// Handle form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $attendance_type = $_POST['attendance_type'] ?? null;
    $user_latitude = $_POST['latitude'] ?? null;
    $user_longitude = $_POST['longitude'] ?? null;
    $notes = trim($_POST['notes'] ?? '');
    $current_user_agent = $_SERVER['HTTP_USER_AGENT'] ?? 'غير معروف'; 
    $current_device_fingerprint = $_POST['device_fingerprint'] ?? null; // 🆕 1. استخلاص بصمة الجهاز

    // Check for location coordinates
    if (empty($user_latitude) || empty($user_longitude)) {
        $errors[] = 'تعذر تحديد موقعك الجغرافي. يرجى تفعيل خدمات الموقع.';
    }
    
    // 🆕 التحقق من بصمة الجهاز
    if (empty($current_device_fingerprint) || $current_device_fingerprint === 'FP_ERROR') {
        $errors[] = 'تعذر تحديد بصمة جهازك. يرجى التأكد من تفعيل جافاسكريبت والمحاولة مجدداً.';
    }


    // Check attendance type validity
    if (!in_array($attendance_type, ['check_in', 'check_out'])) {
        $errors[] = 'نوع التسجيل غير صالح.';
    }

    // --- 🆕 2. START: Device Fingerprint Check Logic (بدلاً من User-Agent) ---
    if (empty($errors)) {
        // احصل على الوقت والتاريخ الحاليين في توقيت بغداد
        $dt_today = new DateTime("now", new DateTimeZone('Asia/Baghdad'));
        $today_date = $dt_today->format('Y-m-d');
        
        // ⚠️ 1. التحقق من التمرير (Buddy Punching Check):
        // هل هناك موظف آخر قام بالتسجيل بنفس بصمة الجهاز (Device Fingerprint) في هذا اليوم؟
        $other_employee_check = $db->select(
            "SELECT employee_id FROM employee_attendance 
             WHERE DATE(timestamp) = ? AND device_fingerprint = ? AND employee_id != ? 
             LIMIT 1", 
            [$today_date, $current_device_fingerprint, $employee_db_id]
        );

        if (!empty($other_employee_check)) {
            $errors[] = 'عفواً، لا يمكن تسجيل الحضور/الانصراف من هذا الجهاز. هذه البصمة مُعتمدة لموظف آخر لهذا اليوم.';
        }

        // ⚠️ 2. التحقق من التناسق (Consistency Check):
        // يجب أن يكمل الموظف تسجيلاته من نفس بصمة الجهاز التي سُجلت أولاً.
        if (empty($errors)) {
            $first_attendance_record = $db->select(
                "SELECT device_fingerprint FROM employee_attendance 
                 WHERE employee_id = ? AND DATE(timestamp) = ? 
                 ORDER BY timestamp ASC LIMIT 1", 
                [$employee_db_id, $today_date]
            );

            if (!empty($first_attendance_record)) {
                $first_fingerprint = $first_attendance_record[0]['device_fingerprint'];

                if ($current_device_fingerprint !== $first_fingerprint) {
                    $errors[] = 'يجب تسجيل الحضور/الانصراف من نفس بصمة الجهاز المستخدمة في أول تسجيل لهذا اليوم، يرجى استخدام الجهاز المعتمد.';
                }
            }
        }
    }
    // --- 🆕 2. END: Device Fingerprint Check Logic ---
    
    // Perform Geofencing check
    if (empty($errors)) {
        $is_inside_zone = false;
        try {
            // Fetch all approved work locations from the database
            $work_locations = $db->select("SELECT * FROM work_locations");

            foreach ($work_locations as $location) {
                if ($location['zone_type'] === 'circle') {
                    // Check for circle zones
                    if ($location['center_latitude'] !== null && $location['center_longitude'] !== null) {
                        $distance = calculateDistance($user_latitude, $user_longitude, $location['center_latitude'], $location['center_longitude']);
                        if ($distance <= $location['radius_meters']) {
                            $is_inside_zone = true;
                            break;
                        }
                    }
                } elseif ($location['zone_type'] === 'polygon' && $location['coordinates']) {
                    // Check for polygon zones
                    $polygon_points = json_decode($location['coordinates'], true);
                    if ($polygon_points && isPointInPolygon($user_latitude, $user_longitude, $polygon_points)) {
                        $is_inside_zone = true;
                        break;
                    }
                }
            }
        } catch (Exception $e) {
            error_log("Database error fetching work locations: " . $e->getMessage());
            $errors[] = 'حدث خطأ في قاعدة البيانات أثناء التحقق من الموقع.';
        }

        if (!$is_inside_zone) {
            $errors[] = 'يجب أن تكون في نطاق جغرافي محدد لتسجيل الحضور أو الانصراف.';
        }
    }
    
    // If no errors, proceed with attendance registration
    if (empty($errors)) {
        try {
            // Get current time in Baghdad time zone
            $dt = new DateTime("now", new DateTimeZone('Asia/Baghdad'));
            $timestamp = $dt->format('Y-m-d H:i:s');
            $ip_address = $_SERVER['REMOTE_ADDR'] ?? 'غير معروف';

            // 🆕 3. تعديل جملة الإدراج لتشمل device_fingerprint
            $result = $db->insert(
                "INSERT INTO employee_attendance (employee_id, attendance_type, timestamp, latitude, longitude, ip_address, notes, user_agent, device_fingerprint) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
                [$employee_db_id, $attendance_type, $timestamp, $user_latitude, $user_longitude, $ip_address, $notes, $current_user_agent, $current_device_fingerprint]
            );

            if ($result) {
                $_SESSION['success_message'] = 'تم تسجيل ' . ($attendance_type === 'check_in' ? 'الحضور' : 'الانصراف') . ' بنجاح في ' . $timestamp;
                header('Location: ../../index.php');
                exit();
            } else {
                $errors[] = 'حدث خطأ غير متوقع أثناء تسجيل الحضور.';
            }
        } catch (Exception $e) {
            error_log("Database error inserting attendance: " . $e->getMessage());
            $errors[] = 'حدث خطأ في قاعدة البيانات. يرجى المحاولة لاحقًا.';
        }
    }
}
?>

<div class="content-area">
    <div class="page-header">
        <h2 class="page-title"><?php echo $pageTitle; ?></h2>
        <p class="page-subtitle">استمارة لتسجيل حضور الموظفين أو انصرافهم.</p>
    </div>

<div class="page-header d-flex justify-content-between align-items-center mb-4">
        <h2 class="page-title mb-0"><?php echo $pageTitle; ?></h2>
        
        <a href="/hrms_system/pages/employees/my_salary.php" class="btn btn-info btn-sm">
            <i class="fas fa-user-circle me-1"></i> ملفي الشخصي
        </a>
    </div>

    <?php if (!empty($errors)): ?>
        <div class="alert alert-danger mt-3">
            <ul class="mb-0">
                <?php foreach ($errors as $error): ?>
                    <li><?php echo htmlspecialchars($error); ?></li>
                <?php endforeach; ?>
            </ul>
        </div>
    <?php endif; ?>
    
    <?php if (isset($_SESSION['success_message'])): ?>
        <div class="alert alert-success mt-3">
            <?php echo htmlspecialchars($_SESSION['success_message']); unset($_SESSION['success_message']); ?>
        </div>
    <?php endif; ?>

    <div class="card mb-4 shadow-sm">
        <div class="card-body">
            <form action="" method="POST" id="attendanceForm">
                <input type="hidden" name="latitude" id="latitude">
                <input type="hidden" name="longitude" id="longitude">
                <input type="hidden" name="device_fingerprint" id="device_fingerprint"> <div class="row g-3">
                    <div class="col-12">
                        <label for="notes" class="form-label">ملاحظات (اختياري)</label>
                        <textarea id="notes" name="notes" class="form-control" rows="3" placeholder="أضف أي ملاحظات حول التسجيل..."></textarea>
                    </div>

                    <div class="col-12 mt-4 d-flex justify-content-between">
                        <button type="submit" class="btn btn-success flex-grow-1 me-2" name="attendance_type" value="check_in" id="checkInButton" disabled>
                            <span id="checkInText">جاري تحديد الموقع...</span>
                            <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" id="checkInSpinner"></span>
                        </button>
                        
                        <button type="submit" class="btn btn-danger flex-grow-1 ms-2" name="attendance_type" value="check_out" id="checkOutButton" disabled>
                            <span id="checkOutText">جاري تحديد الموقع...</span>
                            <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" id="checkOutSpinner"></span>
                        </button>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs@4/dist/fp.min.js"></script>

<script>
    // 🆕 5. كود جافاسكريبت المُصحح بالكامل لضمان التوقيت وعدم تفعيل الأزرار قبل الجاهزية
    document.addEventListener('DOMContentLoaded', (event) => {
        const latitudeInput = document.getElementById('latitude');
        const longitudeInput = document.getElementById('longitude');
        const fingerprintInput = document.getElementById('device_fingerprint'); // لن تكون null بعد إضافة الحقل!
        
        const checkInButton = document.getElementById('checkInButton');
        const checkOutButton = document.getElementById('checkOutButton');
        const checkInText = document.getElementById('checkInText');
        const checkOutText = document.getElementById('checkOutText');
        const checkInSpinner = document.getElementById('checkInSpinner');
        const checkOutSpinner = document.getElementById('checkOutSpinner');

        let geolocationReady = false;
        let fingerprintReady = false;

        // دالة موحدة للتحقق من جاهزية كلتا البيانات قبل تفعيل الأزرار
        function checkReadiness() {
            if (geolocationReady && fingerprintReady) {
                // الموقع والبصمة جاهزان
                checkInButton.disabled = false;
                checkOutButton.disabled = false;
                
                checkInText.textContent = 'تسجيل حضور';
                checkOutText.textContent = 'تسجيل انصراف';
                checkInSpinner.style.display = 'none';
                checkOutSpinner.style.display = 'none';
            }
        }

        // ====== 1. تحديد بصمة الجهاز ======
        if (typeof FingerprintJS !== 'undefined' && fingerprintInput) {
            FingerprintJS.load().then(fp => {
                fp.get().then(result => {
                    fingerprintInput.value = result.visitorId;
                    console.log("Device Fingerprint Obtained.");
                    fingerprintReady = true;
                    checkReadiness(); // تحقق من تفعيل الأزرار
                }).catch(err => {
                    console.error("FingerprintJS error (FP.get failed):", err);
                    fingerprintInput.value = 'FP_ERROR'; // ضع قيمة خطأ ليتم رفضها في PHP
                    fingerprintReady = true; // نعتبرها جاهزة لإكمال بقية العملية
                    checkReadiness();
                });
            }).catch(err => {
                 console.error("FingerprintJS load failed:", err);
                 // إذا فشل التحميل نفسه، نعتبره جاهزًا بقيمة فارغة (سيتم رفضها في PHP)
                 fingerprintReady = true; 
                 checkReadiness();
            });
        } else {
             console.error("FingerprintJS library not loaded or input element missing.");
             fingerprintReady = true;
             checkReadiness();
        }


        // ====== 2. تحديد الموقع الجغرافي ======
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(
                (position) => {
                    latitudeInput.value = position.coords.latitude;
                    longitudeInput.value = position.coords.longitude;
                    console.log("Geolocation Obtained.");
                    geolocationReady = true;
                    checkReadiness(); // تحقق من تفعيل الأزرار
                },
                (error) => {
                    console.error("Geolocation error:", error);
                    checkInText.textContent = 'فشل تحديد الموقع';
                    checkOutText.textContent = 'فشل تحديد الموقع';
                    checkInSpinner.style.display = 'none';
                    checkOutSpinner.style.display = 'none';

                    checkInButton.disabled = true;
                    checkOutButton.disabled = true;

                    alert('تعذر تحديد موقعك. يرجى التأكد من تفعيل خدمات الموقع والمحاولة مرة أخرى.');
                    
                    geolocationReady = true; 
                    checkReadiness();
                },
                {
                    enableHighAccuracy: true,
                    timeout: 10000, 
                    maximumAge: 0
                }
            );
        } else {
            checkInText.textContent = 'الموقع غير مدعوم';
            checkOutText.textContent = 'الموقع غير مدعوم';
            checkInSpinner.style.display = 'none';
            checkOutSpinner.style.display = 'none';

            checkInButton.disabled = true;
            checkOutButton.disabled = true;
            
            geolocationReady = true;
            checkReadiness();
        }
    });
</script>

<?php
// Function to calculate the distance between two geographic points (in meters)
function calculateDistance($lat1, $lon1, $lat2, $lon2) {
    $earthRadius = 6371000;
    $dLat = deg2rad($lat2 - $lat1);
    $dLon = deg2rad($lon2 - $lon1);
    $a = sin($dLat / 2) * sin($dLat / 2) +
          cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
          sin($dLon / 2) * sin($dLon / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    return $earthRadius * $c;
}

// Function to check if a point (user's location) is inside a polygon
function isPointInPolygon($user_lat, $user_lon, $polygon_points) {
    $c = false;
    $nvert = count($polygon_points);
    $j = $nvert - 1;
    for ($i = 0; $i < $nvert; $j = $i++) {
        $point1 = $polygon_points[$i];
        $point2 = $polygon_points[$j];
        if (((($point1['lng'] <= $user_lon) && ($user_lon < $point2['lng'])) ||
             (($point2['lng'] <= $user_lon) && ($user_lon < $point1['lng']))) &&
            ($user_lat < ($point2['lat'] - $point1['lat']) * ($user_lon - $point1['lng']) /
            ($point2['lng'] - $point1['lng']) + $point1['lat'])) {
            $c = !$c;
        }
    }
    return $c;
}

?>
<?php include '../../includes/footer.php'; ?>