// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.30.0
// source: personal_access_token.sql

package db

import (
	"context"

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

const createPersonalAccessToken = `-- name: CreatePersonalAccessToken :one
INSERT INTO personal_access_token (user_id, name, token_hash, token_prefix, expires_at)
VALUES ($1, $2, $3, $4, $5)
RETURNING id, user_id, name, token_hash, token_prefix, expires_at, last_used_at, revoked, created_at
`

type CreatePersonalAccessTokenParams struct {
	UserID      pgtype.UUID        `json:"user_id"`
	Name        string             `json:"name"`
	TokenHash   string             `json:"token_hash"`
	TokenPrefix string             `json:"token_prefix"`
	ExpiresAt   pgtype.Timestamptz `json:"expires_at"`
}

func (q *Queries) CreatePersonalAccessToken(ctx context.Context, arg CreatePersonalAccessTokenParams) (PersonalAccessToken, error) {
	row := q.db.QueryRow(ctx, createPersonalAccessToken,
		arg.UserID,
		arg.Name,
		arg.TokenHash,
		arg.TokenPrefix,
		arg.ExpiresAt,
	)
	var i PersonalAccessToken
	err := row.Scan(
		&i.ID,
		&i.UserID,
		&i.Name,
		&i.TokenHash,
		&i.TokenPrefix,
		&i.ExpiresAt,
		&i.LastUsedAt,
		&i.Revoked,
		&i.CreatedAt,
	)
	return i, err
}

const getPersonalAccessTokenByHash = `-- name: GetPersonalAccessTokenByHash :one
SELECT id, user_id, name, token_hash, token_prefix, expires_at, last_used_at, revoked, created_at FROM personal_access_token
WHERE token_hash = $1
  AND revoked = FALSE
  AND (expires_at IS NULL OR expires_at > now())
`

func (q *Queries) GetPersonalAccessTokenByHash(ctx context.Context, tokenHash string) (PersonalAccessToken, error) {
	row := q.db.QueryRow(ctx, getPersonalAccessTokenByHash, tokenHash)
	var i PersonalAccessToken
	err := row.Scan(
		&i.ID,
		&i.UserID,
		&i.Name,
		&i.TokenHash,
		&i.TokenPrefix,
		&i.ExpiresAt,
		&i.LastUsedAt,
		&i.Revoked,
		&i.CreatedAt,
	)
	return i, err
}

const listPersonalAccessTokensByUser = `-- name: ListPersonalAccessTokensByUser :many
SELECT id, user_id, name, token_hash, token_prefix, expires_at, last_used_at, revoked, created_at FROM personal_access_token
WHERE user_id = $1
  AND revoked = FALSE
ORDER BY created_at DESC
`

func (q *Queries) ListPersonalAccessTokensByUser(ctx context.Context, userID pgtype.UUID) ([]PersonalAccessToken, error) {
	rows, err := q.db.Query(ctx, listPersonalAccessTokensByUser, userID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	items := []PersonalAccessToken{}
	for rows.Next() {
		var i PersonalAccessToken
		if err := rows.Scan(
			&i.ID,
			&i.UserID,
			&i.Name,
			&i.TokenHash,
			&i.TokenPrefix,
			&i.ExpiresAt,
			&i.LastUsedAt,
			&i.Revoked,
			&i.CreatedAt,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const revokePersonalAccessToken = `-- name: RevokePersonalAccessToken :exec
UPDATE personal_access_token
SET revoked = TRUE
WHERE id = $1 AND user_id = $2
`

type RevokePersonalAccessTokenParams struct {
	ID     pgtype.UUID `json:"id"`
	UserID pgtype.UUID `json:"user_id"`
}

func (q *Queries) RevokePersonalAccessToken(ctx context.Context, arg RevokePersonalAccessTokenParams) error {
	_, err := q.db.Exec(ctx, revokePersonalAccessToken, arg.ID, arg.UserID)
	return err
}

const updatePersonalAccessTokenLastUsed = `-- name: UpdatePersonalAccessTokenLastUsed :exec
UPDATE personal_access_token
SET last_used_at = now()
WHERE id = $1
`

func (q *Queries) UpdatePersonalAccessTokenLastUsed(ctx context.Context, id pgtype.UUID) error {
	_, err := q.db.Exec(ctx, updatePersonalAccessTokenLastUsed, id)
	return err
}
