// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.31.1
// source: clipboard.sql

package db

import (
	"context"
)

const clearExpiredClipboards = `-- name: ClearExpiredClipboards :execrows
UPDATE clipboard_state
SET content = NULL, source_device = NULL
WHERE content IS NOT NULL AND updated_at < ?
`

// ClearExpiredClipboards empties content older than the cutoff (content /
// source_device set NULL) for the short-TTL exposure limit; the row is kept.
// Called periodically by the clipboard sweeper.
//
// ASCII only: sqlc 1.31.x miscomputes byte offsets on multibyte comments and
// truncates the generated SQL const. This query was silently cut to "SET content ="
// (the sweeper then failed at runtime with "incomplete input"). Keep ASCII.
func (q *Queries) ClearExpiredClipboards(ctx context.Context, updatedAt int64) (int64, error) {
	result, err := q.db.ExecContext(ctx, clearExpiredClipboards, updatedAt)
	if err != nil {
		return 0, err
	}
	return result.RowsAffected()
}

const getClipboard = `-- name: GetClipboard :one
SELECT user_id, content_type, content, source_device, updated_at, version, origin_ts
FROM clipboard_state
WHERE user_id = ?
`

func (q *Queries) GetClipboard(ctx context.Context, userID string) (ClipboardState, error) {
	row := q.db.QueryRowContext(ctx, getClipboard, userID)
	var i ClipboardState
	err := row.Scan(
		&i.UserID,
		&i.ContentType,
		&i.Content,
		&i.SourceDevice,
		&i.UpdatedAt,
		&i.Version,
		&i.OriginTs,
	)
	return i, err
}

const upsertClipboard = `-- name: UpsertClipboard :one
INSERT INTO clipboard_state (user_id, content_type, content, source_device, updated_at, version, origin_ts)
VALUES (?, ?, ?, ?, ?, 1, ?)
ON CONFLICT (user_id) DO UPDATE SET
    content_type  = excluded.content_type,
    content       = excluded.content,
    source_device = excluded.source_device,
    updated_at    = excluded.updated_at,
    version       = clipboard_state.version + 1,
    origin_ts     = excluded.origin_ts
WHERE excluded.origin_ts > clipboard_state.origin_ts
RETURNING version
`

type UpsertClipboardParams struct {
	UserID       string  `json:"user_id"`
	ContentType  string  `json:"content_type"`
	Content      *string `json:"content"`
	SourceDevice *string `json:"source_device"`
	UpdatedAt    int64   `json:"updated_at"`
	OriginTs     int64   `json:"origin_ts"`
}

// New rows start version 1; conflicts bump version by 1 (per-user monotonic).
// LWW: the DO UPDATE only runs when the new origin_ts is strictly greater than
// the stored one, so a delayed / out-of-order older copy changes nothing and
// RETURNING yields no row (the service reads sql.ErrNoRows as "stale, rejected").
func (q *Queries) UpsertClipboard(ctx context.Context, arg UpsertClipboardParams) (int64, error) {
	row := q.db.QueryRowContext(ctx, upsertClipboard,
		arg.UserID,
		arg.ContentType,
		arg.Content,
		arg.SourceDevice,
		arg.UpdatedAt,
		arg.OriginTs,
	)
	var version int64
	err := row.Scan(&version)
	return version, err
}
