-- name: CreateNotification :one
INSERT INTO notifications (
        id,
        recipient_id,
        type,
        level,
        error_severity,
        reciever,
        is_read,
        delivery_status,
        delivery_channel,
        payload,
        priority,
        timestamp,
        expires,
        img,
        metadata
    )
VALUES (
        $1,
        $2,
        $3,
        $4,
        $5,
        $6,
        $7,
        $8,
        $9,
        $10,
        $11,
        $12,
        $13,
        $14,
        $15
    )
RETURNING *;
-- name: GetNotification :one
SELECT *
FROM notifications
WHERE id = $1
LIMIT 1;
-- name: GetAllNotifications :many
SELECT *
FROM notifications
ORDER BY timestamp DESC
LIMIT $1 OFFSET $2;
-- name: GetTotalNotificationCount :one
SELECT COUNT(*)
FROM notifications;
-- name: GetUserNotifications :many
SELECT *
FROM notifications
WHERE recipient_id = $1
ORDER BY timestamp DESC
LIMIT $2 OFFSET $3;
-- name: GetUserNotificationCount :one
SELECT COUNT(*)
FROM notifications
WHERE recipient_id = $1;
-- name: CountUnreadNotifications :one
SELECT count(id)
FROM notifications
WHERE recipient_id = $1
    AND is_read = false;
-- name: UpdateNotificationStatus :one
UPDATE notifications
SET delivery_status = $2,
    is_read = $3,
    metadata = $4
WHERE id = $1
RETURNING *;
-- name: ListFailedNotifications :many
SELECT *
FROM notifications
WHERE delivery_status = 'failed'
    AND timestamp < NOW() - INTERVAL '1 hour'
ORDER BY timestamp ASC
LIMIT $1;
-- name: ListRecipientIDsByReceiver :many
SELECT recipient_id
FROM notifications
WHERE reciever = $1;
-- name: GetNotificationCounts :many
SELECT COUNT(*) as total,
    COUNT(
        CASE
            WHEN is_read = true THEN 1
        END
    ) as read,
    COUNT(
        CASE
            WHEN is_read = false THEN 1
        END
    ) as unread
FROM notifications;

-- name: DeleteOldNotifications :exec
DELETE FROM notifications
WHERE expires < now();