-- name: CreateNotification :one
INSERT INTO notifications (
    user_id,
    receiver_type,
    type,
    level,
    channel,
    title,
    message,
    payload
)
VALUES (
    $1,
    $2,
    $3,
    $4,
    $5,
    $6,
    $7,
    $8
)
RETURNING *;

-- name: GetNotification :one
SELECT *
FROM notifications
WHERE id = $1
LIMIT 1;

-- name: GetAllNotifications :many
SELECT *
FROM notifications
ORDER BY created_at DESC
LIMIT $1 OFFSET $2;

-- name: GetTotalNotificationCount :one
SELECT COUNT(*)
FROM notifications;

-- name: GetUserNotifications :many
SELECT *
FROM notifications
WHERE user_id = $1
ORDER BY created_at DESC
LIMIT $2 OFFSET $3;

-- name: GetUserNotificationCount :one
SELECT COUNT(*)
FROM notifications
WHERE user_id = $1;

-- name: CountUnreadNotifications :one
SELECT COUNT(*)
FROM notifications
WHERE user_id = $1
  AND is_read = FALSE;

-- name: MarkNotificationAsRead :one
UPDATE notifications
SET is_read = TRUE,
    read_at = NOW()
WHERE id = $1
RETURNING *;

-- name: MarkAllUserNotificationsAsRead :exec
UPDATE notifications
SET is_read = TRUE,
    read_at = NOW()
WHERE user_id = $1
  AND is_read = FALSE;

-- name: MarkNotificationAsUnread :one
UPDATE notifications
SET is_read = FALSE,
    read_at = NULL
WHERE id = $1
RETURNING *;

-- name: MarkAllUserNotificationsAsUnread :exec
UPDATE notifications
SET is_read = FALSE,
    read_at = NULL
WHERE user_id = $1
  AND is_read = TRUE;

-- name: DeleteUserNotifications :exec
DELETE FROM notifications
WHERE user_id = $1;

-- name: GetFilteredNotifications :many
SELECT *
FROM notifications
WHERE
    (sqlc.narg('filter_channel')::text IS NULL OR channel = sqlc.narg('filter_channel'))
    AND (sqlc.narg('filter_type')::text IS NULL OR type = sqlc.narg('filter_type'))
    AND (sqlc.narg('filter_user_id')::bigint IS NULL OR user_id = sqlc.narg('filter_user_id'))
    AND (sqlc.narg('filter_is_read')::boolean IS NULL OR is_read = sqlc.narg('filter_is_read'))
    AND (sqlc.narg('filter_after')::timestamptz IS NULL OR created_at >= sqlc.narg('filter_after'))
    AND (sqlc.narg('filter_before')::timestamptz IS NULL OR created_at <= sqlc.narg('filter_before'))
ORDER BY created_at DESC
LIMIT @page_limit OFFSET @page_offset;

-- name: GetFilteredNotificationCount :one
SELECT COUNT(*)
FROM notifications
WHERE
    (sqlc.narg('filter_channel')::text IS NULL OR channel = sqlc.narg('filter_channel'))
    AND (sqlc.narg('filter_type')::text IS NULL OR type = sqlc.narg('filter_type'))
    AND (sqlc.narg('filter_user_id')::bigint IS NULL OR user_id = sqlc.narg('filter_user_id'))
    AND (sqlc.narg('filter_is_read')::boolean IS NULL OR is_read = sqlc.narg('filter_is_read'))
    AND (sqlc.narg('filter_after')::timestamptz IS NULL OR created_at >= sqlc.narg('filter_after'))
    AND (sqlc.narg('filter_before')::timestamptz IS NULL OR created_at <= sqlc.narg('filter_before'));
