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

package dbq

import (
	"context"

	"github.com/jackc/pgx/v5/pgtype"
)

const createPasswordReset = `-- name: CreatePasswordReset :exec
INSERT INTO password_resets (token, user_id, expires_at)
VALUES ($1, $2, $3)
`

type CreatePasswordResetParams struct {
	Token     string
	UserID    pgtype.UUID
	ExpiresAt pgtype.Timestamptz
}

func (q *Queries) CreatePasswordReset(ctx context.Context, arg CreatePasswordResetParams) error {
	_, err := q.db.Exec(ctx, createPasswordReset, arg.Token, arg.UserID, arg.ExpiresAt)
	return err
}

const deleteExpiredPasswordResets = `-- name: DeleteExpiredPasswordResets :exec
DELETE FROM password_resets WHERE expires_at < now() - interval '7 days'
`

// Cleanup: drop tokens that have been expired more than 7 days.
// Not wired in U3; useful to have for a future cron sweep.
func (q *Queries) DeleteExpiredPasswordResets(ctx context.Context) error {
	_, err := q.db.Exec(ctx, deleteExpiredPasswordResets)
	return err
}

const getPasswordReset = `-- name: GetPasswordReset :one
SELECT token, user_id, created_at, expires_at, used_at FROM password_resets WHERE token = $1
`

func (q *Queries) GetPasswordReset(ctx context.Context, token string) (PasswordReset, error) {
	row := q.db.QueryRow(ctx, getPasswordReset, token)
	var i PasswordReset
	err := row.Scan(
		&i.Token,
		&i.UserID,
		&i.CreatedAt,
		&i.ExpiresAt,
		&i.UsedAt,
	)
	return i, err
}

const usePasswordReset = `-- name: UsePasswordReset :execrows
UPDATE password_resets
   SET used_at = now()
 WHERE token   = $1
   AND used_at IS NULL
   AND expires_at > now()
`

// Atomic claim: marks the token used only if currently unused
// and not expired. Returns rows-affected so the caller can
// distinguish "successful claim" (rows=1) from "already used /
// expired / nonexistent" (rows=0).
func (q *Queries) UsePasswordReset(ctx context.Context, token string) (int64, error) {
	result, err := q.db.Exec(ctx, usePasswordReset, token)
	if err != nil {
		return 0, err
	}
	return result.RowsAffected(), nil
}
