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

package dbq

import (
	"context"

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

const countUsers = `-- name: CountUsers :one
SELECT count(*) FROM users
`

func (q *Queries) CountUsers(ctx context.Context) (int64, error) {
	row := q.db.QueryRow(ctx, countUsers)
	var count int64
	err := row.Scan(&count)
	return count, err
}

const createUser = `-- name: CreateUser :one
INSERT INTO users (username, password_hash, api_token, is_admin)
VALUES ($1, $2, $3, $4)
RETURNING id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled
`

type CreateUserParams struct {
	Username     string
	PasswordHash string
	ApiToken     string
	IsAdmin      bool
}

func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (User, error) {
	row := q.db.QueryRow(ctx, createUser,
		arg.Username,
		arg.PasswordHash,
		arg.ApiToken,
		arg.IsAdmin,
	)
	var i User
	err := row.Scan(
		&i.ID,
		&i.Username,
		&i.PasswordHash,
		&i.ApiToken,
		&i.IsAdmin,
		&i.CreatedAt,
		&i.SubsonicPassword,
		&i.ListenbrainzToken,
		&i.ListenbrainzEnabled,
	)
	return i, err
}

const getListenBrainzConfig = `-- name: GetListenBrainzConfig :one
SELECT
    u.listenbrainz_token,
    u.listenbrainz_enabled,
    (SELECT MAX(pe.scrobbled_at)::timestamptz
     FROM play_events pe
     WHERE pe.user_id = u.id) AS last_scrobbled_at
FROM users u
WHERE u.id = $1
`

type GetListenBrainzConfigRow struct {
	ListenbrainzToken   *string
	ListenbrainzEnabled bool
	LastScrobbledAt     pgtype.Timestamptz
}

// Returns the user's LB token + enabled flag and the most recent
// play_events.scrobbled_at for last-scrobbled-at status.
func (q *Queries) GetListenBrainzConfig(ctx context.Context, id pgtype.UUID) (GetListenBrainzConfigRow, error) {
	row := q.db.QueryRow(ctx, getListenBrainzConfig, id)
	var i GetListenBrainzConfigRow
	err := row.Scan(&i.ListenbrainzToken, &i.ListenbrainzEnabled, &i.LastScrobbledAt)
	return i, err
}

const getUserByAPIToken = `-- name: GetUserByAPIToken :one
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled FROM users WHERE api_token = $1
`

func (q *Queries) GetUserByAPIToken(ctx context.Context, apiToken string) (User, error) {
	row := q.db.QueryRow(ctx, getUserByAPIToken, apiToken)
	var i User
	err := row.Scan(
		&i.ID,
		&i.Username,
		&i.PasswordHash,
		&i.ApiToken,
		&i.IsAdmin,
		&i.CreatedAt,
		&i.SubsonicPassword,
		&i.ListenbrainzToken,
		&i.ListenbrainzEnabled,
	)
	return i, err
}

const getUserByID = `-- name: GetUserByID :one
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled FROM users WHERE id = $1
`

func (q *Queries) GetUserByID(ctx context.Context, id pgtype.UUID) (User, error) {
	row := q.db.QueryRow(ctx, getUserByID, id)
	var i User
	err := row.Scan(
		&i.ID,
		&i.Username,
		&i.PasswordHash,
		&i.ApiToken,
		&i.IsAdmin,
		&i.CreatedAt,
		&i.SubsonicPassword,
		&i.ListenbrainzToken,
		&i.ListenbrainzEnabled,
	)
	return i, err
}

const getUserByUsername = `-- name: GetUserByUsername :one
SELECT id, username, password_hash, api_token, is_admin, created_at, subsonic_password, listenbrainz_token, listenbrainz_enabled FROM users WHERE username = $1
`

func (q *Queries) GetUserByUsername(ctx context.Context, username string) (User, error) {
	row := q.db.QueryRow(ctx, getUserByUsername, username)
	var i User
	err := row.Scan(
		&i.ID,
		&i.Username,
		&i.PasswordHash,
		&i.ApiToken,
		&i.IsAdmin,
		&i.CreatedAt,
		&i.SubsonicPassword,
		&i.ListenbrainzToken,
		&i.ListenbrainzEnabled,
	)
	return i, err
}

const setListenBrainzEnabled = `-- name: SetListenBrainzEnabled :exec
UPDATE users
SET listenbrainz_enabled = $2
WHERE id = $1
`

type SetListenBrainzEnabledParams struct {
	ID                  pgtype.UUID
	ListenbrainzEnabled bool
}

func (q *Queries) SetListenBrainzEnabled(ctx context.Context, arg SetListenBrainzEnabledParams) error {
	_, err := q.db.Exec(ctx, setListenBrainzEnabled, arg.ID, arg.ListenbrainzEnabled)
	return err
}

const setListenBrainzToken = `-- name: SetListenBrainzToken :exec
UPDATE users
SET listenbrainz_token = $2,
    listenbrainz_enabled = CASE WHEN COALESCE($2, '') = '' THEN FALSE ELSE listenbrainz_enabled END
WHERE id = $1
`

type SetListenBrainzTokenParams struct {
	ID                pgtype.UUID
	ListenbrainzToken *string
}

func (q *Queries) SetListenBrainzToken(ctx context.Context, arg SetListenBrainzTokenParams) error {
	_, err := q.db.Exec(ctx, setListenBrainzToken, arg.ID, arg.ListenbrainzToken)
	return err
}

const setSubsonicPassword = `-- name: SetSubsonicPassword :exec
UPDATE users SET subsonic_password = $2 WHERE id = $1
`

type SetSubsonicPasswordParams struct {
	ID               pgtype.UUID
	SubsonicPassword *string
}

// Stores (or clears with NULL) the per-user Subsonic legacy credential used
// for t/s and p auth on /rest/*. Must be plaintext; see migration 0003.
func (q *Queries) SetSubsonicPassword(ctx context.Context, arg SetSubsonicPasswordParams) error {
	_, err := q.db.Exec(ctx, setSubsonicPassword, arg.ID, arg.SubsonicPassword)
	return err
}
