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

package dbq

import (
	"context"

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

const listUserHistory = `-- name: ListUserHistory :many
SELECT pe.id           AS event_id,
       pe.started_at,
       t.id, t.title, t.album_id, t.artist_id, t.track_number, t.disc_number, t.duration_ms, t.file_path, t.file_size, t.file_format, t.bitrate, t.mbid, t.genre, t.added_at, t.updated_at, t.tag_source, t.tag_sources_version, t.tag_read_version, t.missing_since,
       albums.title    AS album_title,
       artists.name    AS artist_name
  FROM play_events pe
  JOIN tracks  t       ON t.id       = pe.track_id
  JOIN albums          ON albums.id  = t.album_id
  JOIN artists         ON artists.id = t.artist_id
 WHERE pe.user_id = $1
   AND pe.was_skipped = false
   AND NOT EXISTS (
       SELECT 1 FROM lidarr_quarantine q
        WHERE q.user_id = $1 AND q.track_id = t.id
   )
 ORDER BY pe.started_at DESC
 LIMIT $2 OFFSET $3
`

type ListUserHistoryParams struct {
	UserID pgtype.UUID
	Limit  int32
	Offset int32
}

type ListUserHistoryRow struct {
	EventID    pgtype.UUID
	StartedAt  pgtype.Timestamptz
	Track      Track
	AlbumTitle string
	ArtistName string
}

// M7 #365: track-level listening history. Returns one row per
// play_events entry, newest first, joined with tracks/albums/artists
// so the SPA can render a TrackRef without follow-up fetches. Filters
// out skipped events and tracks the user has quarantined (per-user
// soft-hide). $1 = user_id, $2 = limit, $3 = offset.
func (q *Queries) ListUserHistory(ctx context.Context, arg ListUserHistoryParams) ([]ListUserHistoryRow, error) {
	rows, err := q.db.Query(ctx, listUserHistory, arg.UserID, arg.Limit, arg.Offset)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []ListUserHistoryRow
	for rows.Next() {
		var i ListUserHistoryRow
		if err := rows.Scan(
			&i.EventID,
			&i.StartedAt,
			&i.Track.ID,
			&i.Track.Title,
			&i.Track.AlbumID,
			&i.Track.ArtistID,
			&i.Track.TrackNumber,
			&i.Track.DiscNumber,
			&i.Track.DurationMs,
			&i.Track.FilePath,
			&i.Track.FileSize,
			&i.Track.FileFormat,
			&i.Track.Bitrate,
			&i.Track.Mbid,
			&i.Track.Genre,
			&i.Track.AddedAt,
			&i.Track.UpdatedAt,
			&i.Track.TagSource,
			&i.Track.TagSourcesVersion,
			&i.Track.TagReadVersion,
			&i.Track.MissingSince,
			&i.AlbumTitle,
			&i.ArtistName,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}
