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

package db

import (
	"context"
)

const deletePushSubscription = `-- name: DeletePushSubscription :exec
DELETE FROM push_subscriptions
WHERE id = ?
`

func (q *Queries) DeletePushSubscription(ctx context.Context, id string) error {
	_, err := q.db.ExecContext(ctx, deletePushSubscription, id)
	return err
}

const deletePushSubscriptionsByUserDevice = `-- name: DeletePushSubscriptionsByUserDevice :exec
DELETE FROM push_subscriptions
WHERE user_id = ? AND device_name = ?
`

type DeletePushSubscriptionsByUserDeviceParams struct {
	UserID     string `json:"user_id"`
	DeviceName string `json:"device_name"`
}

func (q *Queries) DeletePushSubscriptionsByUserDevice(ctx context.Context, arg DeletePushSubscriptionsByUserDeviceParams) error {
	_, err := q.db.ExecContext(ctx, deletePushSubscriptionsByUserDevice, arg.UserID, arg.DeviceName)
	return err
}

const listAPNsSubscriptionsByUserDevice = `-- name: ListAPNsSubscriptionsByUserDevice :many
SELECT id, user_id, device_name, endpoint, p256dh, auth, user_agent, locale, platform, created_at, last_used_at
FROM push_subscriptions
WHERE user_id = ? AND device_name = ? AND platform = 'apns'
`

type ListAPNsSubscriptionsByUserDeviceParams struct {
	UserID     string `json:"user_id"`
	DeviceName string `json:"device_name"`
}

type ListAPNsSubscriptionsByUserDeviceRow struct {
	ID         string `json:"id"`
	UserID     string `json:"user_id"`
	DeviceName string `json:"device_name"`
	Endpoint   string `json:"endpoint"`
	P256dh     string `json:"p256dh"`
	Auth       string `json:"auth"`
	UserAgent  string `json:"user_agent"`
	Locale     string `json:"locale"`
	Platform   string `json:"platform"`
	CreatedAt  int64  `json:"created_at"`
	LastUsedAt int64  `json:"last_used_at"`
}

func (q *Queries) ListAPNsSubscriptionsByUserDevice(ctx context.Context, arg ListAPNsSubscriptionsByUserDeviceParams) ([]ListAPNsSubscriptionsByUserDeviceRow, error) {
	rows, err := q.db.QueryContext(ctx, listAPNsSubscriptionsByUserDevice, arg.UserID, arg.DeviceName)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []ListAPNsSubscriptionsByUserDeviceRow
	for rows.Next() {
		var i ListAPNsSubscriptionsByUserDeviceRow
		if err := rows.Scan(
			&i.ID,
			&i.UserID,
			&i.DeviceName,
			&i.Endpoint,
			&i.P256dh,
			&i.Auth,
			&i.UserAgent,
			&i.Locale,
			&i.Platform,
			&i.CreatedAt,
			&i.LastUsedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const listPushSubscriptionsByUserDevice = `-- name: ListPushSubscriptionsByUserDevice :many
SELECT id, user_id, device_name, endpoint, p256dh, auth, user_agent, locale, platform, created_at, last_used_at
FROM push_subscriptions
WHERE user_id = ? AND device_name = ? AND platform = 'webpush'
`

type ListPushSubscriptionsByUserDeviceParams struct {
	UserID     string `json:"user_id"`
	DeviceName string `json:"device_name"`
}

type ListPushSubscriptionsByUserDeviceRow struct {
	ID         string `json:"id"`
	UserID     string `json:"user_id"`
	DeviceName string `json:"device_name"`
	Endpoint   string `json:"endpoint"`
	P256dh     string `json:"p256dh"`
	Auth       string `json:"auth"`
	UserAgent  string `json:"user_agent"`
	Locale     string `json:"locale"`
	Platform   string `json:"platform"`
	CreatedAt  int64  `json:"created_at"`
	LastUsedAt int64  `json:"last_used_at"`
}

func (q *Queries) ListPushSubscriptionsByUserDevice(ctx context.Context, arg ListPushSubscriptionsByUserDeviceParams) ([]ListPushSubscriptionsByUserDeviceRow, error) {
	rows, err := q.db.QueryContext(ctx, listPushSubscriptionsByUserDevice, arg.UserID, arg.DeviceName)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []ListPushSubscriptionsByUserDeviceRow
	for rows.Next() {
		var i ListPushSubscriptionsByUserDeviceRow
		if err := rows.Scan(
			&i.ID,
			&i.UserID,
			&i.DeviceName,
			&i.Endpoint,
			&i.P256dh,
			&i.Auth,
			&i.UserAgent,
			&i.Locale,
			&i.Platform,
			&i.CreatedAt,
			&i.LastUsedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const touchPushSubscription = `-- name: TouchPushSubscription :exec
UPDATE push_subscriptions
SET last_used_at = ?
WHERE id = ?
`

type TouchPushSubscriptionParams struct {
	LastUsedAt int64  `json:"last_used_at"`
	ID         string `json:"id"`
}

func (q *Queries) TouchPushSubscription(ctx context.Context, arg TouchPushSubscriptionParams) error {
	_, err := q.db.ExecContext(ctx, touchPushSubscription, arg.LastUsedAt, arg.ID)
	return err
}

const upsertAPNsSubscription = `-- name: UpsertAPNsSubscription :exec
INSERT INTO push_subscriptions (id, user_id, device_name, endpoint, p256dh, auth, user_agent, locale, platform, created_at, last_used_at)
VALUES (?, ?, ?, ?, '', '', '', ?, 'apns', ?, ?)
ON CONFLICT(id) DO UPDATE SET
    user_id      = excluded.user_id,
    device_name  = excluded.device_name,
    locale       = excluded.locale,
    platform     = excluded.platform,
    last_used_at = excluded.last_used_at
`

type UpsertAPNsSubscriptionParams struct {
	ID         string `json:"id"`
	UserID     string `json:"user_id"`
	DeviceName string `json:"device_name"`
	Endpoint   string `json:"endpoint"`
	Locale     string `json:"locale"`
	CreatedAt  int64  `json:"created_at"`
	LastUsedAt int64  `json:"last_used_at"`
}

func (q *Queries) UpsertAPNsSubscription(ctx context.Context, arg UpsertAPNsSubscriptionParams) error {
	_, err := q.db.ExecContext(ctx, upsertAPNsSubscription,
		arg.ID,
		arg.UserID,
		arg.DeviceName,
		arg.Endpoint,
		arg.Locale,
		arg.CreatedAt,
		arg.LastUsedAt,
	)
	return err
}

const upsertPushSubscription = `-- name: UpsertPushSubscription :exec

INSERT INTO push_subscriptions (id, user_id, device_name, endpoint, p256dh, auth, user_agent, locale, platform, created_at, last_used_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'webpush', ?, ?)
ON CONFLICT(id) DO UPDATE SET
    user_id      = excluded.user_id,
    device_name  = excluded.device_name,
    p256dh       = excluded.p256dh,
    auth         = excluded.auth,
    user_agent   = excluded.user_agent,
    locale       = excluded.locale,
    platform     = excluded.platform,
    last_used_at = excluded.last_used_at
`

type UpsertPushSubscriptionParams struct {
	ID         string `json:"id"`
	UserID     string `json:"user_id"`
	DeviceName string `json:"device_name"`
	Endpoint   string `json:"endpoint"`
	P256dh     string `json:"p256dh"`
	Auth       string `json:"auth"`
	UserAgent  string `json:"user_agent"`
	Locale     string `json:"locale"`
	CreatedAt  int64  `json:"created_at"`
	LastUsedAt int64  `json:"last_used_at"`
}

// push_subscriptions: Web Push and APNs subscription records.
// id is hex SHA-256(endpoint/device-token), making upsert idempotent.
// platform distinguishes 'webpush' (browser VAPID) from 'apns' (iOS device token).
// Lookups are by (user_id, device_name, platform) so each channel only sees its own rows.
// Dead endpoints (push service returns 404/410, APNs returns 410) are pruned by DeletePushSubscription.
// NOTE: keep this file pure ASCII; sqlc v1.31.1 drifts byte offsets on
// multibyte runes in query files, corrupting the generated SQL.
func (q *Queries) UpsertPushSubscription(ctx context.Context, arg UpsertPushSubscriptionParams) error {
	_, err := q.db.ExecContext(ctx, upsertPushSubscription,
		arg.ID,
		arg.UserID,
		arg.DeviceName,
		arg.Endpoint,
		arg.P256dh,
		arg.Auth,
		arg.UserAgent,
		arg.Locale,
		arg.CreatedAt,
		arg.LastUsedAt,
	)
	return err
}
