// =============================================
// توابع سیستم تیکتینگ
// =============================================

/**
 * دریافت تیکت‌های یک کاربر
 * @param int $userId شناسه کاربر
 * @param string $status فیلتر وضعیت (new, replied, closed, all)
 * @param string $priority فیلتر اولویت (low, medium, high, critical, all)
 * @param string $search عبارت جستجو
 * @return array لیست تیکت‌ها
 */
function getUserTickets($userId, $status = 'all', $priority = 'all', $search = '') {
    $sql = "SELECT t.*, 
                   u1.name as sender_name, u1.family as sender_family,
                   u2.name as receiver_name, u2.family as receiver_family,
                   r.name as receiver_role_name
            FROM tickets t
            LEFT JOIN users u1 ON t.sender_id = u1.id
            LEFT JOIN users u2 ON t.receiver_id = u2.id
            LEFT JOIN roles r ON t.receiver_role_id = r.id
            WHERE t.sender_id = ? OR t.receiver_id = ? OR t.receiver_role_id = ?";
    $params = [$userId, $userId, getUserRoleId($userId)];
    
    if ($status != 'all') {
        $sql .= " AND t.status = ?";
        $params[] = $status;
    }
    
    if ($priority != 'all') {
        $sql .= " AND t.priority = ?";
        $params[] = $priority;
    }
    
    if (!empty($search)) {
        $sql .= " AND (t.subject LIKE ? OR t.body LIKE ?)";
        $searchTerm = "%$search%";
        $params[] = $searchTerm;
        $params[] = $searchTerm;
    }
    
    $sql .= " ORDER BY t.created_at DESC";
    
    return fetchAll($sql, $params);
}

/**
 * دریافت یک تیکت با شناسه
 * @param int $ticketId شناسه تیکت
 * @return array|null اطلاعات تیکت
 */
function getTicketById($ticketId) {
    return fetchOne(
        "SELECT t.*, 
                u1.name as sender_name, u1.family as sender_family,
                u2.name as receiver_name, u2.family as receiver_family,
                r.name as receiver_role_name
         FROM tickets t
         LEFT JOIN users u1 ON t.sender_id = u1.id
         LEFT JOIN users u2 ON t.receiver_id = u2.id
         LEFT JOIN roles r ON t.receiver_role_id = r.id
         WHERE t.id = ?",
        [$ticketId]
    );
}

/**
 * دریافت پاسخ‌های یک تیکت
 * @param int $ticketId شناسه تیکت
 * @return array لیست پاسخ‌ها
 */
function getTicketReplies($ticketId) {
    return fetchAll(
        "SELECT r.*, u.name, u.family
         FROM ticket_replies r
         LEFT JOIN users u ON r.user_id = u.id
         WHERE r.ticket_id = ?
         ORDER BY r.created_at ASC",
        [$ticketId]
    );
}

/**
 * دریافت نقش کاربر
 * @param int $userId شناسه کاربر
 * @return int|null شناسه نقش
 */
function getUserRoleId($userId) {
    $user = fetchOne("SELECT role_id FROM users WHERE id = ?", [$userId]);
    return $user ? $user['role_id'] : null;
}

/**
 * دریافت آمار تیکت‌های کاربر
 * @param int $userId شناسه کاربر
 * @return array آمار تیکت‌ها
 */
function getTicketStats($userId) {
    $roleId = getUserRoleId($userId);
    
    return [
        'total' => fetchCount(
            "SELECT id FROM tickets WHERE sender_id = ? OR receiver_id = ? OR receiver_role_id = ?",
            [$userId, $userId, $roleId]
        ),
        'new' => fetchCount(
            "SELECT id FROM tickets WHERE (sender_id = ? OR receiver_id = ? OR receiver_role_id = ?) AND status = 'new'",
            [$userId, $userId, $roleId]
        ),
        'replied' => fetchCount(
            "SELECT id FROM tickets WHERE (sender_id = ? OR receiver_id = ? OR receiver_role_id = ?) AND status = 'replied'",
            [$userId, $userId, $roleId]
        ),
        'closed' => fetchCount(
            "SELECT id FROM tickets WHERE (sender_id = ? OR receiver_id = ? OR receiver_role_id = ?) AND status = 'closed'",
            [$userId, $userId, $roleId]
        ),
        'unread' => fetchCount(
            "SELECT id FROM tickets WHERE (receiver_id = ? OR receiver_role_id = ?) AND is_read = 0",
            [$userId, $roleId]
        )
    ];
}

/**
 * ثبت تیکت جدید
 * @param array $data اطلاعات تیکت
 * @return int|false شناسه تیکت یا false در صورت خطا
 */
function createTicket($data) {
    return insertData('tickets', $data);
}

/**
 * ثبت پاسخ جدید
 * @param array $data اطلاعات پاسخ
 * @return int|false شناسه پاسخ یا false در صورت خطا
 */
function createTicketReply($data) {
    return insertData('ticket_replies', $data);
}

/**
 * به‌روزرسانی وضعیت تیکت
 * @param int $ticketId شناسه تیکت
 * @param string $status وضعیت جدید
 * @return bool
 */
function updateTicketStatus($ticketId, $status) {
    return updateData('tickets', ['status' => $status], 'id = :id', ['id' => $ticketId]);
}

/**
 * علامت‌گذاری تیکت به عنوان خوانده شده
 * @param int $ticketId شناسه تیکت
 * @param int $userId شناسه کاربر
 * @return bool
 */
function markTicketAsRead($ticketId, $userId) {
    $ticket = getTicketById($ticketId);
    if (!$ticket) return false;
    
    // فقط اگر کاربر گیرنده باشد
    if ($ticket['receiver_id'] == $userId || $ticket['receiver_role_id'] == getUserRoleId($userId)) {
        return updateData('tickets', [
            'is_read' => 1,
            'read_at' => date('Y-m-d H:i:s'),
            'status' => 'viewed'
        ], 'id = :id', ['id' => $ticketId]);
    }
    return false;
}