from models.library import LibraryAlbum as LibraryAlbum
from models.library import LibraryGroupedAlbum as LibraryGroupedAlbum
from models.library import LibraryGroupedArtist as LibraryGroupedArtist
from infrastructure.msgspec_fastapi import AppStruct


class LibraryArtist(AppStruct):
    mbid: str
    name: str
    album_count: int = 0
    date_added: int | None = None


class LibraryResponse(AppStruct):
    library: list[LibraryAlbum]


class LibraryArtistsResponse(AppStruct):
    artists: list[LibraryArtist]
    total: int


class LibraryAlbumsResponse(AppStruct):
    albums: list[LibraryAlbum]
    total: int


class PaginatedLibraryAlbumsResponse(AppStruct):
    albums: list[LibraryAlbum] = []
    total: int = 0
    offset: int = 0
    limit: int = 50


class PaginatedLibraryArtistsResponse(AppStruct):
    artists: list[LibraryArtist] = []
    total: int = 0
    offset: int = 0
    limit: int = 50


class RecentlyAddedResponse(AppStruct):
    albums: list[LibraryAlbum] = []
    artists: list[LibraryArtist] = []


class LibraryStatsResponse(AppStruct):
    artist_count: int
    album_count: int
    db_size_bytes: int
    db_size_mb: float
    last_sync: int | None = None


class AlbumRemoveResponse(AppStruct):
    success: bool
    artist_removed: bool = False
    artist_name: str | None = None


class AlbumRemovePreviewResponse(AppStruct):
    success: bool
    artist_will_be_removed: bool = False
    artist_name: str | None = None


class SyncLibraryResponse(AppStruct):
    status: str
    artists: int
    albums: int


class LibraryMbidsResponse(AppStruct):
    mbids: list[str] = []
    requested_mbids: list[str] = []


class LibraryGroupedResponse(AppStruct):
    library: list[LibraryGroupedArtist] = []


class TrackResolveItem(AppStruct):
    release_group_mbid: str | None = None
    disc_number: int | None = None
    track_number: int | None = None


class TrackResolveRequest(AppStruct):
    items: list[TrackResolveItem] = []


class ResolvedTrack(AppStruct):
    release_group_mbid: str | None = None
    disc_number: int | None = None
    track_number: int | None = None
    source: str | None = None
    track_source_id: str | None = None
    stream_url: str | None = None
    format: str | None = None
    duration: float | None = None


class TrackResolveResponse(AppStruct):
    items: list[ResolvedTrack] = []
