// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.27.0
// source: song.sql

package repository

import (
	"context"
)

const addHashToSong = `-- name: AddHashToSong :exec
UPDATE song SET hash=$1 where path=$2
`

type AddHashToSongParams struct {
	Hash string `json:"hash"`
	Path string `json:"path"`
}

func (q *Queries) AddHashToSong(ctx context.Context, arg AddHashToSongParams) error {
	_, err := q.db.Exec(ctx, addHashToSong, arg.Hash, arg.Path)
	return err
}

const addSong = `-- name: AddSong :exec
INSERT INTO song(game_id, song_name, path, file_name, hash) VALUES ($1, $2, $3, $4, $5)
`

type AddSongParams struct {
	GameID   int32   `json:"game_id"`
	SongName string  `json:"song_name"`
	Path     string  `json:"path"`
	FileName *string `json:"file_name"`
	Hash     string  `json:"hash"`
}

func (q *Queries) AddSong(ctx context.Context, arg AddSongParams) error {
	_, err := q.db.Exec(ctx, addSong,
		arg.GameID,
		arg.SongName,
		arg.Path,
		arg.FileName,
		arg.Hash,
	)
	return err
}

const addSongPlayed = `-- name: AddSongPlayed :exec
UPDATE song SET times_played = times_played + 1
WHERE game_id = $1 AND song_name = $2
`

type AddSongPlayedParams struct {
	GameID   int32  `json:"game_id"`
	SongName string `json:"song_name"`
}

func (q *Queries) AddSongPlayed(ctx context.Context, arg AddSongPlayedParams) error {
	_, err := q.db.Exec(ctx, addSongPlayed, arg.GameID, arg.SongName)
	return err
}

const checkSong = `-- name: CheckSong :one
SELECT COUNT(*) FROM song WHERE path = $1
`

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

const checkSongWithHash = `-- name: CheckSongWithHash :one
SELECT COUNT(*) FROM song WHERE hash = $1
`

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

const clearSongs = `-- name: ClearSongs :exec
DELETE FROM song
`

func (q *Queries) ClearSongs(ctx context.Context) error {
	_, err := q.db.Exec(ctx, clearSongs)
	return err
}

const clearSongsByGameId = `-- name: ClearSongsByGameId :exec
DELETE FROM song WHERE game_id = $1
`

func (q *Queries) ClearSongsByGameId(ctx context.Context, gameID int32) error {
	_, err := q.db.Exec(ctx, clearSongsByGameId, gameID)
	return err
}

const fetchAllSongs = `-- name: FetchAllSongs :many
SELECT game_id, song_name, path, times_played, hash, file_name FROM song
`

func (q *Queries) FetchAllSongs(ctx context.Context) ([]Song, error) {
	rows, err := q.db.Query(ctx, fetchAllSongs)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []Song
	for rows.Next() {
		var i Song
		if err := rows.Scan(
			&i.GameID,
			&i.SongName,
			&i.Path,
			&i.TimesPlayed,
			&i.Hash,
			&i.FileName,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const findSongsFromGame = `-- name: FindSongsFromGame :many
SELECT game_id, song_name, path, times_played, hash, file_name
FROM song
WHERE game_id = $1
`

func (q *Queries) FindSongsFromGame(ctx context.Context, gameID int32) ([]Song, error) {
	rows, err := q.db.Query(ctx, findSongsFromGame, gameID)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []Song
	for rows.Next() {
		var i Song
		if err := rows.Scan(
			&i.GameID,
			&i.SongName,
			&i.Path,
			&i.TimesPlayed,
			&i.Hash,
			&i.FileName,
		); err != nil {
			return nil, err
		}
		items = append(items, i)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

const getSongWithHash = `-- name: GetSongWithHash :one
SELECT game_id, song_name, path, times_played, hash, file_name FROM song WHERE hash = $1
`

func (q *Queries) GetSongWithHash(ctx context.Context, hash string) (Song, error) {
	row := q.db.QueryRow(ctx, getSongWithHash, hash)
	var i Song
	err := row.Scan(
		&i.GameID,
		&i.SongName,
		&i.Path,
		&i.TimesPlayed,
		&i.Hash,
		&i.FileName,
	)
	return i, err
}

const removeBrokenSong = `-- name: RemoveBrokenSong :exec
DELETE FROM song WHERE path = $1
`

func (q *Queries) RemoveBrokenSong(ctx context.Context, path string) error {
	_, err := q.db.Exec(ctx, removeBrokenSong, path)
	return err
}

const removeBrokenSongs = `-- name: RemoveBrokenSongs :exec
DELETE FROM song where path = any ($1)
`

func (q *Queries) RemoveBrokenSongs(ctx context.Context, paths []string) error {
	_, err := q.db.Exec(ctx, removeBrokenSongs, paths)
	return err
}

const updateSong = `-- name: UpdateSong :exec
UPDATE song SET song_name=$1, file_name=$2, path=$3 where hash=$4
`

type UpdateSongParams struct {
	SongName string  `json:"song_name"`
	FileName *string `json:"file_name"`
	Path     string  `json:"path"`
	Hash     string  `json:"hash"`
}

func (q *Queries) UpdateSong(ctx context.Context, arg UpdateSongParams) error {
	_, err := q.db.Exec(ctx, updateSong,
		arg.SongName,
		arg.FileName,
		arg.Path,
		arg.Hash,
	)
	return err
}
