// Package lidarr is a typed HTTP client for Lidarr's v1 API. It is the
// only place in the codebase that knows about Lidarr's wire format.
// Callers receive value structs, never raw JSON.
package lidarr

// LookupResult is the normalized shape returned by Lookup{Artist,Album,Track}.
// MBID is the kind's primary identifier (foreignArtistId / foreignAlbumId /
// foreignTrackId from Lidarr). ArtistMBID and AlbumMBID carry parent
// identifiers when the kind has them — request creation and admin
// approval need them to construct the lidarr_requests row and the
// AddArtist/AddAlbum API calls.
type LookupResult struct {
	MBID       string // foreignArtistId / foreignAlbumId / foreignTrackId
	ArtistMBID string // parent artist's foreignArtistId — set on album/track results, empty on artist results
	AlbumMBID  string // parent album's foreignAlbumId — set on track results only
	Name       string // artist name; album/track returns Title here too
	Secondary  string // genre + album count for artist; year for album; album for track
	ImageURL   string // cover-art URL Lidarr surfaced (may be empty)
}

// lidarrImage is the wire shape for image entries in Lidarr's API responses.
type lidarrImage struct {
	CoverType string `json:"coverType"`
	RemoteURL string `json:"remoteUrl"`
	URL       string `json:"url"`
}

// QualityProfile is the dropdown choice in /admin/integrations.
type QualityProfile struct {
	ID   int
	Name string
}

// MetadataProfile controls which release types Lidarr tracks for an artist
// (album / single / EP / compilation). It's a separate Lidarr concept from
// quality profile and is required on POST /api/v1/artist — Lidarr 4xx's
// the request with "'Metadata Profile Id' must be greater than '0'" if
// it's missing or zero.
type MetadataProfile struct {
	ID   int
	Name string
}

// RootFolder is the dropdown choice in /admin/integrations.
type RootFolder struct {
	Path       string
	Accessible bool
	FreeSpace  int64
}

// AddArtistParams are the fields Lidarr requires on POST /api/v1/artist.
// ArtistName and MetadataProfileID are both required; omitting either
// produces a 400 with field-validation errors.
type AddArtistParams struct {
	ForeignArtistID   string
	ArtistName        string
	QualityProfileID  int
	MetadataProfileID int
	RootFolderPath    string
	MonitorAll        bool // true => monitor="all"; false => "future"
}

// AddAlbumParams are the fields Lidarr requires on POST /api/v1/album.
// MetadataProfileID is included for the case where Lidarr has to create
// the parent artist on the fly (when adding an album by an artist not
// yet in the library).
type AddAlbumParams struct {
	ForeignAlbumID    string
	ForeignArtistID   string // Lidarr requires the artist's foreign id too
	ArtistName        string
	QualityProfileID  int
	MetadataProfileID int
	RootFolderPath    string
}

// PingResult is the response shape from GET /api/v1/system/status.
type PingResult struct {
	Version string
}

// LidarrArtist is the subset of Lidarr's artist resource used by M5b
// admin actions. The "id" field is Lidarr's internal numeric ID — needed
// for DELETE /api/v1/artist/{id} calls.
type LidarrArtist struct {
	ID              int    `json:"id"`
	ForeignArtistID string `json:"foreignArtistId"` // MBID
	ArtistName      string `json:"artistName"`
}

// LidarrAlbum is the subset of Lidarr's album resource used by M5b
// admin actions.
type LidarrAlbum struct {
	ID             int    `json:"id"`
	ForeignAlbumID string `json:"foreignAlbumId"` // MBID
	Title          string `json:"title"`
	ArtistID       int    `json:"artistId"`
}
