#include "musiclibrary.h"
#include "artist.h"
#include "record.h"
#include "song.h"
#include "musiclibraryprivate.h"

MusicLibrary::MusicLibrary(QObject *parent) : QObject(parent)
{
    pPtr = new MusicLibraryPrivate();
    pPtr->publicPtr = this;
}

MusicLibrary::~MusicLibrary()
{
    delete pPtr;
}

QList<Artist *> MusicLibrary::artists() const
{
    // QObject stores it's children as list of QObjects, which
    // cannot be directly mapped to a list of artists. Thus,
    // this needs to cast and add each artist separately.
    QList<Artist *> list;
    QList<QObject *> artists = children();
    foreach (QObject *artist, artists) {
        list.append(qobject_cast<Artist *>(artist));
    }
    return list;
}

QList<Record *> MusicLibrary::records() const
{
    QList<Record *> list;
    QList<QObject *> artists = children();
    foreach (QObject *artist, artists) {
        QList<QObject *> records = artist->children();
        foreach (QObject *record, records) {
            list.append(qobject_cast<Record *>(record));
        }
    }
    return list;
}

QList<Song *> MusicLibrary::songs() const
{
    QList<Song *> list;
    QList<Record *> recordList = records();
    foreach (QObject *record, recordList) {
        QList<QObject *> songs = record->children();
        foreach (QObject *song, songs) {
            list.append(qobject_cast<Song *>(song));
        }
    }
    return list;
}
