-- name: CreateReleaseGroup :one
INSERT INTO release_groups (name) VALUES (?)
RETURNING *;

-- name: CreateReleaseGroupFull :one
INSERT INTO release_groups (
  name, cover_art_id, album_artist_credit_id, year, total_tracks, total_discs
) VALUES (?, ?, ?, ?, ?, ?)
RETURNING *;

-- name: GetReleaseGroup :one
SELECT * FROM release_groups 
WHERE id = ? LIMIT 1;

-- name: GetReleaseGroupByNameAndArtist :one
SELECT * FROM release_groups
WHERE name = ? AND album_artist_credit_id = ? LIMIT 1;

-- name: UpsertReleaseGroup :one
INSERT INTO release_groups (name, album_artist_credit_id, year)
VALUES (?, ?, ?)
ON CONFLICT(name, album_artist_credit_id) DO UPDATE SET
  album_artist_credit_id = COALESCE(excluded.album_artist_credit_id, release_groups.album_artist_credit_id),
  year = COALESCE(excluded.year, release_groups.year)
RETURNING *;

-- name: SetReleaseGroupOriginalYear :exec
-- Set the release group's original-release-year (release-group's
-- first-release-date from MusicBrainz).  Called from autotag apply
-- when the user confirms a candidate; the file-tag year stays in
-- the year column.
UPDATE release_groups SET original_year = ? WHERE id = ?;

-- name: UpdateReleaseGroup :exec
UPDATE release_groups 
SET name = ?
WHERE id = ?;

-- name: UpdateReleaseGroupCoverArt :exec
UPDATE release_groups
SET cover_art_id = ?
WHERE id = ?;

-- name: DeleteReleaseGroup :exec
DELETE FROM release_groups 
WHERE id = ?;

-- name: DeleteAllReleaseGroups :exec
DELETE FROM release_groups;

-- name: GetAllReleaseGroups :many
SELECT * FROM release_groups
ORDER BY name;

-- name: GetAllAlbumsWithDetails :many
SELECT
    rg.id,
    rg.name,
    -- year prefers original release year (MB first-release-date)
    -- over the file-tag year so the UI surfaces the album's
    -- original year by default.  release_year keeps the file-tag
    -- year accessible.
    COALESCE(rg.original_year, rg.year) AS year,
    COALESCE(rg.year, 0) AS release_year,
    rg.mbid,
    COALESCE(ac.text, fallback_ac.text, '') as artist_name,
    -- primary (first-credited) album artist's MBID, for linking the
    -- artist name to its detail page.  Empty when the album has no
    -- MB-tagged album-artist credit.
    CAST(COALESCE((
        SELECT a.mbid
        FROM artist_credit_artist aca_p
        JOIN artists a ON a.id = aca_p.artist_id
        WHERE aca_p.credit_id = rg.album_artist_credit_id
        ORDER BY aca_p.id
        LIMIT 1
    ), '') AS TEXT) as artist_mbid,
    COALESCE(ca.file_path, '') as cover_art_path
FROM release_groups rg
LEFT JOIN artist_credit ac ON rg.album_artist_credit_id = ac.id
LEFT JOIN cover_art ca ON rg.cover_art_id = ca.id
LEFT JOIN (
    SELECT rgr.release_group_id, ac2.text
    FROM release_group_recordings rgr
    JOIN recordings rec ON rec.id = rgr.recording_id
    JOIN artist_credit ac2 ON ac2.id = rec.artist_credit_id
    GROUP BY rgr.release_group_id
) fallback_ac ON fallback_ac.release_group_id = rg.id
ORDER BY rg.name;

-- name: GetAllAlbumsWithDetailsByLibrary :many
SELECT
    rg.id,
    rg.name,
    -- year prefers original release year (MB first-release-date)
    -- over the file-tag year so the UI surfaces the album's
    -- original year by default.  release_year keeps the file-tag
    -- year accessible.
    COALESCE(rg.original_year, rg.year) AS year,
    COALESCE(rg.year, 0) AS release_year,
    rg.mbid,
    COALESCE(ac.text, fallback_ac.text, '') as artist_name,
    -- primary (first-credited) album artist's MBID, for linking the
    -- artist name to its detail page.  Empty when the album has no
    -- MB-tagged album-artist credit.
    CAST(COALESCE((
        SELECT a.mbid
        FROM artist_credit_artist aca_p
        JOIN artists a ON a.id = aca_p.artist_id
        WHERE aca_p.credit_id = rg.album_artist_credit_id
        ORDER BY aca_p.id
        LIMIT 1
    ), '') AS TEXT) as artist_mbid,
    COALESCE(ca.file_path, '') as cover_art_path
FROM release_groups rg
LEFT JOIN artist_credit ac ON rg.album_artist_credit_id = ac.id
LEFT JOIN cover_art ca ON rg.cover_art_id = ca.id
LEFT JOIN (
    SELECT rgr.release_group_id, ac2.text
    FROM release_group_recordings rgr
    JOIN recordings rec ON rec.id = rgr.recording_id
    JOIN artist_credit ac2 ON ac2.id = rec.artist_credit_id
    GROUP BY rgr.release_group_id
) fallback_ac ON fallback_ac.release_group_id = rg.id
WHERE rg.id IN (
    SELECT DISTINCT rgr2.release_group_id
    FROM release_group_recordings rgr2
    JOIN recordings r2 ON r2.id = rgr2.recording_id
    JOIN audio_files af2 ON af2.recording_id = r2.id
    WHERE af2.library_id = ?
)
ORDER BY rg.name;

-- name: GetAlbumsByArtist :many
SELECT
    rg.id,
    rg.name,
    COALESCE(rg.original_year, rg.year) AS year,
    COALESCE(rg.year, 0) AS release_year,
    COALESCE(ac.text, fallback_ac.text, '') as artist_name,
    -- primary (first-credited) album artist's MBID, for linking the
    -- artist name to its detail page.  Empty when the album has no
    -- MB-tagged album-artist credit.
    CAST(COALESCE((
        SELECT a.mbid
        FROM artist_credit_artist aca_p
        JOIN artists a ON a.id = aca_p.artist_id
        WHERE aca_p.credit_id = rg.album_artist_credit_id
        ORDER BY aca_p.id
        LIMIT 1
    ), '') AS TEXT) as artist_mbid,
    COALESCE(ca.file_path, '') as cover_art_path
FROM release_groups rg
JOIN artist_credit ac ON rg.album_artist_credit_id = ac.id
JOIN artist_credit_artist aca ON aca.credit_id = ac.id
LEFT JOIN cover_art ca ON rg.cover_art_id = ca.id
LEFT JOIN (
    SELECT rgr.release_group_id, ac2.text
    FROM release_group_recordings rgr
    JOIN recordings rec ON rec.id = rgr.recording_id
    JOIN artist_credit ac2 ON ac2.id = rec.artist_credit_id
    GROUP BY rgr.release_group_id
) fallback_ac ON fallback_ac.release_group_id = rg.id
WHERE aca.artist_id = ?
ORDER BY rg.name;

-- name: CountReleaseGroupRecordings :one
SELECT COUNT(*) FROM release_group_recordings WHERE release_group_id = ?;

-- name: GetAlbumsByArtistByLibrary :many
SELECT
    rg.id,
    rg.name,
    COALESCE(rg.original_year, rg.year) AS year,
    COALESCE(rg.year, 0) AS release_year,
    COALESCE(ac.text, fallback_ac.text, '') as artist_name,
    -- primary (first-credited) album artist's MBID, for linking the
    -- artist name to its detail page.  Empty when the album has no
    -- MB-tagged album-artist credit.
    CAST(COALESCE((
        SELECT a.mbid
        FROM artist_credit_artist aca_p
        JOIN artists a ON a.id = aca_p.artist_id
        WHERE aca_p.credit_id = rg.album_artist_credit_id
        ORDER BY aca_p.id
        LIMIT 1
    ), '') AS TEXT) as artist_mbid,
    COALESCE(ca.file_path, '') as cover_art_path
FROM release_groups rg
JOIN artist_credit ac ON rg.album_artist_credit_id = ac.id
JOIN artist_credit_artist aca ON aca.credit_id = ac.id
LEFT JOIN cover_art ca ON rg.cover_art_id = ca.id
LEFT JOIN (
    SELECT rgr.release_group_id, ac2.text
    FROM release_group_recordings rgr
    JOIN recordings rec ON rec.id = rgr.recording_id
    JOIN artist_credit ac2 ON ac2.id = rec.artist_credit_id
    GROUP BY rgr.release_group_id
) fallback_ac ON fallback_ac.release_group_id = rg.id
WHERE aca.artist_id = ?
  AND rg.id IN (
    SELECT DISTINCT rgr2.release_group_id
    FROM release_group_recordings rgr2
    JOIN recordings r2 ON r2.id = rgr2.recording_id
    JOIN audio_files af2 ON af2.recording_id = r2.id
    WHERE af2.library_id = ?
)
ORDER BY rg.name;
