<?php
declare(strict_types=1);

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

require_once __DIR__ . '/db.php';
require_once __DIR__ . '/inc/auth.php';

if (empty($_SESSION['user_id'])) {
    header("Location: index.html?e=1");
    exit;
}

$pdo = db();
if (!$pdo instanceof PDO) {
    http_response_code(500);
    exit('DB not ready');
}

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header("Location: cases.php");
    exit;
}

if (!function_exists('valid_ymd')) {
    function valid_ymd(string $date): bool
    {
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) {
            return false;
        }

        [$y, $m, $d] = array_map('intval', explode('-', $date));
        return checkdate($m, $d, $y);
    }
}

$caseId      = (int)($_POST['case_id'] ?? 0);
$sessionDate = trim((string)($_POST['session_date'] ?? ''));
$sessionTime = trim((string)($_POST['session_time'] ?? ''));
$sessionType = trim((string)($_POST['session_type'] ?? ''));
$courtName   = trim((string)($_POST['court_name'] ?? ''));
$location    = trim((string)($_POST['location'] ?? ''));
$status      = strtoupper(trim((string)($_POST['status'] ?? 'SCHEDULED')));
$notes       = trim((string)($_POST['notes'] ?? ''));
$userId      = (int)($_SESSION['user_id'] ?? 0);

if ($caseId <= 0 || $sessionDate === '') {
    exit('بيانات ناقصة');
}

if (!valid_ymd($sessionDate)) {
    exit('تاريخ الجلسة غير صحيح');
}

if ($sessionTime !== '' && !preg_match('/^\d{2}:\d{2}$/', $sessionTime)) {
    $sessionTime = '';
}

$allowedStatus = ['SCHEDULED', 'DONE', 'POSTPONED', 'CANCELLED'];
if (!in_array($status, $allowedStatus, true)) {
    $status = 'SCHEDULED';
}

try {
    $pdo->beginTransaction();

    /* التأكد من وجود القضية وجلب رقمها */
    $stCase = $pdo->prepare("
        SELECT id, case_no, title
        FROM cases
        WHERE id = ?
        LIMIT 1
    ");
    $stCase->execute([$caseId]);
    $caseRow = $stCase->fetch(PDO::FETCH_ASSOC);

    if (!$caseRow) {
        $pdo->rollBack();
        exit('القضية غير موجودة');
    }

    $caseNo    = trim((string)($caseRow['case_no'] ?? ''));
    $caseTitle = trim((string)($caseRow['title'] ?? ''));

    /* إضافة الجلسة */
    $st = $pdo->prepare("
        INSERT INTO case_sessions
        (
            case_id,
            session_date,
            session_time,
            session_type,
            court_name,
            location,
            status,
            notes,
            created_by
        )
        VALUES
        (
            :case_id,
            :session_date,
            :session_time,
            :session_type,
            :court_name,
            :location,
            :status,
            :notes,
            :created_by
        )
    ");

    $st->execute([
        'case_id'      => $caseId,
        'session_date' => $sessionDate,
        'session_time' => ($sessionTime !== '' ? $sessionTime : null),
        'session_type' => ($sessionType !== '' ? $sessionType : null),
        'court_name'   => ($courtName !== '' ? $courtName : null),
        'location'     => ($location !== '' ? $location : null),
        'status'       => $status,
        'notes'        => ($notes !== '' ? $notes : null),
        'created_by'   => ($userId > 0 ? $userId : null),
    ]);

    /* تحديث تاريخ الجلسة القادمة في القضية */
    $up = $pdo->prepare("
        UPDATE cases
        SET next_hearing_date = :next_hearing_date
        WHERE id = :id
        LIMIT 1
    ");
    $up->execute([
        'next_hearing_date' => $sessionDate,
        'id'                => $caseId
    ]);

    $pdo->commit();

    /* تسجيل الإنجاز */
    if (function_exists('log_employee_achievement')) {
        log_employee_achievement(
            $pdo,
            'إضافة جلسة',
            'تمت إضافة جلسة للقضية رقم: ' . ($caseNo !== '' ? $caseNo : (string)$caseId)
            . ($caseTitle !== '' ? ' | نوع القضية: ' . $caseTitle : '')
            . ' | التاريخ: ' . $sessionDate
            . ($sessionTime !== '' ? ' | الوقت: ' . $sessionTime : '')
        );
    }

    header("Location: case_edit.php?id=" . $caseId . "#sessionsBox");
    exit;

} catch (Throwable $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }

    http_response_code(500);
    exit('حدث خطأ أثناء حفظ الجلسة: ' . $e->getMessage());
}