package api

import (
	"net/http"

	"git.fabledsword.com/bvandeusen/minstrel/internal/apierror"
	"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
)

// coverageRollupResp is the wire shape for GET /api/admin/library/coverage.
// All fields are non-negative counts. with_art + pending + settled = total;
// pending_no_mbid is a subset of pending.
type coverageRollupResp struct {
	Total         int64 `json:"total"`
	WithArt       int64 `json:"with_art"`
	Pending       int64 `json:"pending"`
	Settled       int64 `json:"settled"`
	PendingNoMbid int64 `json:"pending_no_mbid"`
}

// handleGetLibraryCoverage implements GET /api/admin/library/coverage.
// Surfaces a library-wide rollup of albums.cover_art_source for the admin
// dashboard gauge. Always 200; zeros on an empty library.
func (h *handlers) handleGetLibraryCoverage(w http.ResponseWriter, r *http.Request) {
	q := dbq.New(h.pool)
	row, err := q.GetAlbumCoverageRollup(r.Context())
	if err != nil {
		writeErrWithLog(w, h.logger, "admin: get coverage rollup", apierror.InternalMsg("lookup failed", err))
		return
	}
	writeJSON(w, http.StatusOK, coverageRollupResp{
		Total:         row.Total,
		WithArt:       row.WithArt,
		Pending:       row.Pending,
		Settled:       row.Settled,
		PendingNoMbid: row.PendingNoMbid,
	})
}
