<?php
// تفعيل عرض الأخطاء
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

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

checkLogin();

// التحقق من الصلاحية
if (!hasPermission('view_attendance_log')) {
    $_SESSION['error_message'] = 'لا تمتلك صلاحية للدخول الى هذا التقرير..';
    header('Location: ../../index.php');
    exit();
}

$db = getDB();

// متغيرات الفلترة
$employee_id_filter = $_GET['employee_id'] ?? null;
$start_date_filter = $_GET['start_date'] ?? date('Y-m-d', strtotime('-6 days'));
$end_date_filter = $_GET['end_date'] ?? date('Y-m-d');
$location_of_work_filter = $_GET['location_of_work'] ?? null;

// جلب قائمة الموظفين النشطين فقط
$employees_list_sql = "SELECT id, full_name, salary, location_of_work 
                       FROM employees 
                       WHERE status = 1"; // ✅ شرط الموظف فعال
$employees_params = [];

if ($employee_id_filter) {
    $employees_list_sql .= " AND id = ?";
    $employees_params[] = $employee_id_filter;
}
if ($location_of_work_filter) {
    $employees_list_sql .= " AND location_of_work = ?";
    $employees_params[] = $location_of_work_filter;
}

$employees_list_sql .= " ORDER BY full_name ASC";
$employees_list = $db->select($employees_list_sql, $employees_params);
if (!$employees_list) $employees_list = []; // تجنب تحذيرات foreach

// جلب قائمة مواقع العمل الفريدة
$location_of_works_list = $db->select("SELECT DISTINCT location_of_work 
                                       FROM employees 
                                       WHERE status = 1 AND location_of_work IS NOT NULL AND location_of_work != '' 
                                       ORDER BY location_of_work ASC");
if (!$location_of_works_list) $location_of_works_list = [];

$daily_data_lookup = [];
$vacation_lookup = [];
$error_message = '';

try {
    $start_date_obj = new DateTime($start_date_filter);
    $end_date_obj = new DateTime($end_date_filter);
    $end_date_obj_inclusive = (clone $end_date_obj)->modify('+1 day');

    if ($start_date_obj > $end_date_obj) {
        $error_message = "تاريخ البدء يجب أن يكون قبل أو يساوي تاريخ الانتهاء.";
    } else {
        // جلب بيانات الحضور والانصراف للموظفين النشطين
        $sql = "
            SELECT
                ea.employee_id,
                DATE(ea.timestamp) AS attendance_date,
                MIN(CASE WHEN ea.attendance_type = 'check_in' THEN ea.timestamp END) AS first_check_in,
                MAX(CASE WHEN ea.attendance_type = 'check_out' THEN ea.timestamp END) AS last_check_out
            FROM
                employee_attendance ea
            JOIN
                employees e ON ea.employee_id = e.id
            WHERE
                e.status = 1 AND DATE(ea.timestamp) BETWEEN ? AND ?
        ";
        $params = [$start_date_filter, $end_date_filter];

        if ($employee_id_filter) {
            $sql .= " AND ea.employee_id = ?";
            $params[] = $employee_id_filter;
        }
        if ($location_of_work_filter) {
            $sql .= " AND e.location_of_work = ?";
            $params[] = $location_of_work_filter;
        }

        $sql .= " GROUP BY ea.employee_id, attendance_date";

        $results = $db->select($sql, $params);
        if ($results) {
            foreach ($results as $row) {
                $daily_data_lookup[$row['employee_id']][$row['attendance_date']] = $row;
            }
        }

        // جلب بيانات الإجازات للموظفين النشطين
        $sql_vacations = "
            SELECT
                ev.employee_id,
                ev.start_date,
                ev.end_date,
                ev.vacation_type
            FROM
                employee_vacations ev
            JOIN
                employees e ON ev.employee_id = e.id
            WHERE
                e.status = 1 AND
                ((ev.start_date BETWEEN ? AND ?) 
                OR (ev.end_date BETWEEN ? AND ?) 
                OR (? BETWEEN ev.start_date AND ev.end_date))
        ";
        $params_vacations = [
            $start_date_filter, $end_date_filter,
            $start_date_filter, $end_date_filter,
            $start_date_filter
        ];

        if ($employee_id_filter) {
            $sql_vacations .= " AND ev.employee_id = ?";
            $params_vacations[] = $employee_id_filter;
        }
        if ($location_of_work_filter) {
            $sql_vacations .= " AND e.location_of_work = ?";
            $params_vacations[] = $location_of_work_filter;
        }

        $vacation_results = $db->select($sql_vacations, $params_vacations);
        if ($vacation_results) {
            foreach ($vacation_results as $vacation) {
                $vacation_start = new DateTime($vacation['start_date']);
                $vacation_end = (new DateTime($vacation['end_date']))->modify('+1 day');

                $vacation_period = new DatePeriod($vacation_start, new DateInterval('P1D'), $vacation_end);
                foreach ($vacation_period as $date) {
                    $vacation_date_str = $date->format('Y-m-d');
                    if ($vacation_date_str >= $start_date_filter && $vacation_date_str <= $end_date_filter) {
                        $vacation_lookup[$vacation['employee_id']][$vacation_date_str] = $vacation['vacation_type'];
                    }
                }
            }
        }
    }
} catch (Exception $e) {
    error_log("Database or date parsing error: " . $e->getMessage());
    $error_message = "حدث خطأ في معالجة البيانات.";
}

// توليد قائمة الأيام بين التاريخين
$period = new DatePeriod($start_date_obj, new DateInterval('P1D'), $end_date_obj_inclusive);
$dates = [];
foreach ($period as $date) {
    $dates[] = $date->format('Y-m-d');
}

// دالة تحويل نوع الإجازة إلى نص وعنوان CSS
function getVacationDetails($type) {
    $details = [
        'سنوية' => ['رمز' => 'س', 'نص' => 'سنوية', 'لون' => 'bg-annual'],
        'مرضية' => ['رمز' => 'م', 'نص' => 'مرضية', 'لون' => 'bg-sick'],
        'طارئة' => ['رمز' => 'ط', 'نص' => 'طارئة', 'لون' => 'bg-emergency'],
        'بدون_راتب' => ['رمز' => 'ب.ر', 'نص' => 'بدون راتب', 'لون' => 'bg-unpaid'],
        'أخرى' => ['رمز' => 'أ', 'نص' => 'أخرى', 'لون' => 'bg-other'],
        'مكلف_بمهمة' => ['رمز' => 'م.م', 'نص' => 'مهمة', 'لون' => 'bg-mission'],
        'واجب' => ['رمز' => 'و', 'نص' => 'واجب', 'لون' => 'bg-duty'],
        'واجب_وقتي' => ['رمز' => 'و.و', 'نص' => 'واجب وقتي', 'لون' => 'bg-duty-temp'],
        'زمنية' => ['رمز' => 'ز', 'نص' => 'زمنية', 'لون' => 'bg-time'],
        'غياب' => ['رمز' => 'غ', 'نص' => 'غياب', 'لون' => 'bg-absence'],
        'ايفاد' => ['رمز' => 'إ', 'نص' => 'إيفاد', 'لون' => 'bg-delegation'],
        'تفرغ' => ['رمز' => 'ت', 'نص' => 'تفرغ', 'لون' => 'bg-devotion'],
        'استراحة' => ['رمز' => 'ا', 'نص' => 'استراحة', 'لون' => 'bg-break'],
        'دوام_في_عطلة' => ['رمز' => 'د.ع', 'نص' => 'دوام عطلة', 'لون' => 'bg-weekend-work'],
        'غياب_دون_اذن' => ['رمز' => 'غ', 'نص' => 'غياب', 'لون' => 'bg-absent']
    ];
    return $details[$type] ?? ['رمز' => '؟', 'نص' => 'غير معروف', 'لون' => 'bg-secondary'];
}
?>

<style>
    /* CSS لتلوين الخلايا */
    .bg-present { background-color: #d4edda !important; } /* أخضر فاتح - حضور */
    .bg-absent { background-color: #f8d7da !important; } /* أحمر فاتح - غياب */
    
    /* ألوان الإجازات والتصاريح الجديدة */
    .bg-annual { background-color: #a8dadc !important; } /* سنوية - سماوي */
    .bg-sick { background-color: #ffb703 !important; } /* مرضية - برتقالي */
    .bg-emergency { background-color: #adb5bd !important; } /* طارئة - رمادي */
    .bg-unpaid { background-color: #c084fc !important; } /* بدون راتب - بنفسجي */
    .bg-other { background-color: #ffda79 !important; } /* أخرى - أصفر شاحب */
    .bg-mission { background-color: #81b29a !important; } /* مكلف بمهمة - أخضر زيتوني */
    .bg-duty { background-color: #588157 !important; color: #fff !important; } /* واجب - أخضر داكن */
    .bg-duty-temp { background-color: #a3b18a !important; } /* واجب وقتي - أخضر فاتح */
    .bg-time { background-color: #e9c46a !important; } /* زمنية - ذهبي */
    .bg-absence { background-color: #e76f51 !important; } /* غياب (مسجل) - أحمر برتقالي */
    .bg-delegation { background-color: #457b9d !important; color: #fff !important; } /* إيفاد - أزرق غامق */
    .bg-devotion { background-color: #4c688c !important; color: #fff !important; } /* تفرغ - أزرق رمادي */
    .bg-break { background-color: #ffecd1 !important; } /* استراحة - كريمي */
    .bg-weekend-work { background-color: #00b4d8 !important; color: #fff !important; } /* دوام في عطلة - أزرق ساطع */

    /* لتنسيق صف الملخص */
    .summary-row td {
        border-top: 2px solid #000 !important;
        font-weight: bold;
    }
</style>

<div class="content-area">
    <div class="page-header d-flex justify-content-between align-items-center mb-3">
        <h2 class="page-title"><?php echo $pageTitle; ?></h2>
        <div>
            <button onclick="printTable()" class="btn btn-primary"><i class="fas fa-print me-2"></i>طباعة الجدول</button>
            <button onclick="showCurrentlyPresent()" class="btn btn-warning"><i class="fas fa-user-check me-2"></i>الموجود الآن</button>
            <a href="view_all_attendance.php" class="btn btn-info"><i class="fas fa-list-ul me-2"></i>عرض كل السجلات</a>
        </div>
    </div>
    
    <?php if (isset($_SESSION['error_message']) || $error_message): ?>
        <div class="alert alert-danger mt-3"><?php echo htmlspecialchars($_SESSION['error_message'] ?? $error_message); unset($_SESSION['error_message']); ?></div>
    <?php endif; ?>

    <div class="card mb-4 shadow-sm">
        <div class="card-header">
            <h5 class="card-title mb-0">الفلاتر</h5>
        </div>
        <div class="card-body">
            <form action="" method="GET">
                <div class="row g-3">
                    <div class="col-md-3">
                        <label for="employee_id" class="form-label">الموظف</label>
                        <select id="employee_id" name="employee_id" class="form-select">
                            <option value="">جميع الموظفين</option>
                            <?php foreach ($employees_list as $employee): ?>
                                <option value="<?php echo htmlspecialchars($employee['id']); ?>" <?php echo ($employee_id_filter == $employee['id']) ? 'selected' : ''; ?>>
                                    <?php echo htmlspecialchars($employee['full_name']); ?>
                                </option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                    <div class="col-md-3">
                        <label for="location_of_work" class="form-label">موقع العمل</label>
                        <select id="location_of_work" name="location_of_work" class="form-select">
                            <option value="">جميع المواقع</option>
                            <?php foreach ($location_of_works_list as $location): ?>
                                <option value="<?php echo htmlspecialchars($location['location_of_work']); ?>" <?php echo ($location_of_work_filter == $location['location_of_work']) ? 'selected' : ''; ?>>
                                    <?php echo htmlspecialchars($location['location_of_work']); ?>
                                </option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                    <div class="col-md-3">
                        <label for="start_date" class="form-label">من تاريخ</label>
                        <input type="date" id="start_date" name="start_date" class="form-control" value="<?php echo htmlspecialchars($start_date_filter); ?>" required>
                    </div>
                    <div class="col-md-3">
                        <label for="end_date" class="form-label">إلى تاريخ</label>
                        <input type="date" id="end_date" name="end_date" class="form-control" value="<?php echo htmlspecialchars($end_date_filter); ?>" required>
                    </div>
                    <div class="col-12 text-end">
                        <button type="submit" class="btn btn-primary"><i class="fas fa-filter me-2"></i>تطبيق الفلاتر</button>
                        <a href="view_attendance.php" class="btn btn-outline-secondary"><i class="fas fa-times me-2"></i>مسح الفلاتر</a>
                    </div>
                </div>
            </form>
        </div>
    </div>
    
    <div class="card mb-4 shadow-sm">
        <div class="card-header bg-white text-dark">
            <h5 class="card-title mb-0">
                تقرير الحضور
                <small class="d-block mt-1">
                    من تاريخ: <?php echo htmlspecialchars($start_date_filter); ?> إلى تاريخ: <?php echo htmlspecialchars($end_date_filter); ?>
                    <?php if ($location_of_work_filter): ?>
                        | لموقع العمل: <?php echo htmlspecialchars($location_of_work_filter); ?>
                    <?php endif; ?>
                </small>
            </h5>
        </div>
        <div class="card-body">
            <?php if (empty($employees_list) || (empty($daily_data_lookup) && empty($vacation_lookup) && count($dates) > 0)): ?>
                <div class="alert alert-info text-center">
                    <?php if ($employee_id_filter): ?>
                        لا توجد سجلات حضور أو إجازات للموظف المحدد في الفترة الزمنية المحددة.
                    <?php else: ?>
                        لا توجد سجلات حضور أو إجازات لأي موظف في الفترة الزمنية المحددة.
                    <?php endif; ?>
                </div>
            <?php else: ?>
                <div class="table-responsive">
                    <table class="table table-hover table-bordered table-striped text-center" id="attendanceTable" style="min-width: 1000px;">
                        <thead class="table-light">
                            <tr>
                                <th rowspan="2" class="align-middle">الموظف</th>
                                <th colspan="<?php echo count($dates); ?>">الأيام</th>
                            </tr>
                            <tr>
                                <?php foreach ($dates as $date): ?>
                                    <th><?php echo htmlspecialchars(date('d-m', strtotime($date))); ?></th>
                                <?php endforeach; ?>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($employees_list as $employee): ?>
                                <?php 
                                // تخطي الموظفين إذا كانت الفلاتر محددة (تم نقلها للأعلى في استعلام SQL لكن للحماية)
                                if ($employee_id_filter && $employee['id'] != $employee_id_filter) continue;
                                
                                $total_work_seconds = 0;
                                $presence_count = 0;
                                $absences_count = 0;
                                // مصفوفة لتخزين عدد أيام كل نوع من الإجازات/التصاريح
                                $vacations_summary = []; 
                                ?>
                                <tr>
                                    <td class="text-start" style="width: 200px;"><?php echo htmlspecialchars($employee['full_name']); ?></td>
                                    <?php foreach ($dates as $date): ?>
                                        <?php
                                        $status_details = getVacationDetails('غياب_دون_اذن'); // القيمة الافتراضية: غياب
                                        $status_char = $status_details['رمز'];
                                        $status_class = $status_details['لون'];
                                        
                                        // 1. التحقق من الإجازة/التصريح
                                        if (isset($vacation_lookup[$employee['id']][$date])) {
                                            $vacation_type = $vacation_lookup[$employee['id']][$date];
                                            $vacation_details = getVacationDetails($vacation_type);
                                            
                                            $status_char = $vacation_details['رمز'];
                                            $status_class = $vacation_details['لون'];
                                            
                                            // تحديث ملخص الإجازات
                                            $vacations_summary[$vacation_details['نص']] = ($vacations_summary[$vacation_details['نص']] ?? 0) + 1;

                                        // 2. التحقق من الحضور
                                        } else {
                                            $record = $daily_data_lookup[$employee['id']][$date] ?? null;
                                            if ($record) {
                                                $status_char = 'ح';
                                                $status_class = 'bg-present';
                                                $presence_count++; 
                                                if ($record['first_check_in'] && $record['last_check_out']) {
                                                    $start_time = new DateTime($record['first_check_in']);
                                                    $end_time = new DateTime($record['last_check_out']);
                                                    $interval = $start_time->diff($end_time);
                                                    $total_work_seconds += $interval->h * 3600 + $interval->i * 60 + $interval->s;
                                                }
                                            } else {
                                                // لا يوجد سجل حضور ولا إجازة = غياب (غياب دون إذن)
                                                $absences_count++;
                                            }
                                        }
                                        ?>
                                        <td class="<?php echo $status_class; ?>">
                                            <?php echo htmlspecialchars(date('d', strtotime($date))) . ' ' . $status_char; ?>
                                        </td>
                                    <?php endforeach; ?>
                                </tr>
                                <tr class="table-info summary-row">
                                    <td colspan="1">ملخص</td>
                                    <td colspan="<?php echo count($dates); ?>" class="text-start">
                                        <strong>الراتب:</strong> <?php echo number_format($employee['salary'], 2); ?> &nbsp;|&nbsp;
                                        <strong>ساعات العمل:</strong> <?php echo gmdate("H:i:s", $total_work_seconds); ?> &nbsp;|&nbsp;
                                        <strong>أيام الحضور:</strong> <?php echo $presence_count; ?> &nbsp;|&nbsp;
                                        <strong>أيام الغياب:</strong> <?php echo $absences_count; ?> 
                                        
                                        <?php if (!empty($vacations_summary)): ?>
                                            &nbsp;|&nbsp;
                                            <strong class="text-primary">الإجازات:</strong> 
                                            <?php 
                                            $vacation_strings = [];
                                            foreach ($vacations_summary as $type_name => $count) {
                                                $vacation_strings[] = "{$type_name}: {$count}";
                                            }
                                            echo implode('، ', $vacation_strings);
                                            ?>
                                        <?php endif; ?>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                </div>
            <?php endif; ?>
        </div>
    </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>

<script>
function printTable() {
    const printContents = document.getElementById("attendanceTable").outerHTML;
    const originalContents = document.body.innerHTML;

    document.body.innerHTML = `
        <style>
            @page { 
                size: A4 landscape; 
                margin: 10mm; 
            }
            body { 
                direction: rtl; 
                font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif;
            }
            table { 
                width: 100%; 
                border-collapse: collapse; 
                font-size: 10px; /* تصغير الخط حتى ي fit */
            }
            th, td { 
                border: 1px solid #000; 
                padding: 4px; 
                text-align: center; 
            }
            /* إضافة جميع فئات الألوان للطباعة */
            .bg-present { background-color: #d4edda !important; -webkit-print-color-adjust: exact; }
            .bg-absent { background-color: #f8d7da !important; -webkit-print-color-adjust: exact; }
            .bg-annual { background-color: #a8dadc !important; -webkit-print-color-adjust: exact; }
            .bg-sick { background-color: #ffb703 !important; -webkit-print-color-adjust: exact; }
            .bg-emergency { background-color: #adb5bd !important; -webkit-print-color-adjust: exact; }
            .bg-unpaid { background-color: #c084fc !important; -webkit-print-color-adjust: exact; }
            .bg-other { background-color: #ffda79 !important; -webkit-print-color-adjust: exact; }
            .bg-mission { background-color: #81b29a !important; -webkit-print-color-adjust: exact; }
            .bg-duty { background-color: #588157 !important; color: #fff !important; -webkit-print-color-adjust: exact; }
            .bg-duty-temp { background-color: #a3b18a !important; -webkit-print-color-adjust: exact; }
            .bg-time { background-color: #e9c46a !important; -webkit-print-color-adjust: exact; }
            .bg-absence { background-color: #e76f51 !important; -webkit-print-color-adjust: exact; }
            .bg-delegation { background-color: #457b9d !important; color: #fff !important; -webkit-print-color-adjust: exact; }
            .bg-devotion { background-color: #4c688c !important; color: #fff !important; -webkit-print-color-adjust: exact; }
            .bg-break { background-color: #ffecd1 !important; -webkit-print-color-adjust: exact; }
            .bg-weekend-work { background-color: #00b4d8 !important; color: #fff !important; -webkit-print-color-adjust: exact; }
            .summary-row td { border-top: 2px solid #000 !important; }

            h2 { text-align: center; margin-bottom: 15px; }
        </style>
        <h2>تقرير الحضور</h2>
        <div style="transform: scale(0.85); transform-origin: top center;">
            ${printContents}
        </div>
    `;
    window.print();
    document.body.innerHTML = originalContents;
}


    function exportToPDF() {
        const { jsPDF } = window.jspdf;
        const doc = new jsPDF('l', 'mm', 'a4');

        doc.html(document.getElementById("attendanceTable"), {
            callback: function (doc) {
                doc.save('attendance_report.pdf');
            },
            x: 15,
            y: 15,
            width: 260,
            windowWidth: 1000,
        });
    }

    
    function showCurrentlyPresent() {
    // هذه الدالة تعتمد على بيانات الجدول، وليس على استعلام مباشر للحضور/الانصراف
    const now = new Date();
    const today = now.toISOString().split('T')[0]; // YYYY-MM-DD
    const table = document.getElementById("attendanceTable");
    let presentEmployees = [];
    
    // حساب اليوم الحالي (من 1 إلى 31)
    const todayOfMonth = new Date(today).getDate().toString();

    // العثور على عمود اليوم
    const headerRow = table.querySelector("thead tr:nth-child(2)");
    let todayColumnIndex = -1;
    Array.from(headerRow.cells).forEach((cell, index) => {
        // إذا كان العمود هو عمود الموظف، فنتخطاه.
        if (index === 0) return; 
        
        // مقارنة رقم اليوم فقط (d-m)
        const cellDate = cell.innerText.trim().split('-')[0];
        if (cellDate === todayOfMonth) {
            todayColumnIndex = index;
        }
    });

    if (todayColumnIndex === -1) {
        alert("لا يمكن العثور على عمود اليوم الحالي في التقرير.");
        return;
    }

    // المرور على صفوف البيانات (نتخطى صف الملخص)
    const dataRows = Array.from(table.querySelectorAll("tbody tr")).filter(row => !row.classList.contains('summary-row'));

    dataRows.forEach(row => {
        const name = row.cells[0].innerText.trim();
        const todayCell = row.cells[todayColumnIndex];
        
        // التحقق من أن الخلية موجودة وتحتوي على علامة 'ح' وبلون الحضور
        // **ملاحظة:** التحقق من 'ح' يعتمد على أن حالة الحضور هي 'ح'
        if (todayCell && todayCell.classList.contains("bg-present") && todayCell.innerText.includes('ح')) {
            presentEmployees.push(name);
        }
    });

    if (presentEmployees.length > 0) {
        alert("الموظفين الذين سجلوا حضور اليوم:\n" + presentEmployees.join("\n"));
    } else {
        alert("لا يوجد موظفين مسجلين حضور اليوم في هذا التقرير.");
    }
}

</script>

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