#include "bookmarks.h"
#include <QFile>
#include <QDataStream>
#include <QCoreApplication>
#include <QFileInfo>

#include <QList>

#include "yacreader_global.h"

Bookmarks::Bookmarks()
    : lastPageIndex(0)
{
    list.load();
}
void Bookmarks::setLastPage(int index, const QImage &page)
{
    lastPageIndex = index;
    lastPage = page;
}
void Bookmarks::setBookmark(int index, const QImage &page)
{
    if (!bookmarks.contains(index)) {
        bookmarks.insert(index, page);
        latestBookmarks.push_front(index);
        if (latestBookmarks.count() > 3) {
            bookmarks.remove(latestBookmarks.back());
            latestBookmarks.pop_back();
        }
    } else // udate de pixmap;
    {
        bookmarks[index] = page;
    }
}

void Bookmarks::removeBookmark(int index)
{
    bookmarks.remove(index);
}

QList<int> Bookmarks::getBookmarkPages() const
{
    return bookmarks.keys();
}

QImage Bookmarks::getBookmarkPixmap(int page) const
{
    return bookmarks.value(page);
}

QImage Bookmarks::getLastPagePixmap() const
{
    return lastPage;
}

int Bookmarks::getLastPage() const
{
    return lastPageIndex;
}

bool Bookmarks::isBookmark(int page)
{
    return bookmarks.contains(page);
}

bool Bookmarks::imageLoaded(int page)
{
    return !bookmarks.value(page).isNull();
}

void Bookmarks::newComic(const QString &path)
{
    QFileInfo f(path);
    QString comicID = f.fileName().toLower() + QString::number(f.size());
    clear();
    BookmarksList::Bookmark b = list.get(comicID);
    comicPath = comicID;
    lastPageIndex = b.lastPage;
    latestBookmarks = b.bookmarks;
    for (int i = 0; i < latestBookmarks.count(); i++)
        bookmarks.insert(latestBookmarks.at(i), QImage());
    added = b.added;
}

void Bookmarks::clear()
{
    bookmarks.clear();
    latestBookmarks.clear();
    lastPageIndex = 0;
    lastPage = QImage();
}

bool Bookmarks::load(const QList<int> &bookmarkIndexes, int lastPage)
{
    lastPageIndex = lastPage;
    foreach (int b, bookmarkIndexes)
        if (b != -1) {
            latestBookmarks.push_back(b);
            bookmarks.insert(b, QImage());
        }

    return true;
}

void Bookmarks::save()
{
    BookmarksList::Bookmark b;
    b.lastPage = lastPageIndex;
    b.bookmarks = getBookmarkPages();

    BookmarksList::Bookmark previousBookmarks;
    bool updated = ((previousBookmarks.lastPage != b.lastPage) || (previousBookmarks.bookmarks != b.bookmarks));

    if (b.added.isNull() || updated)
        b.added = QDateTime::currentDateTime();
    list.add(comicPath, b);
    list.save();
}
//-----------------------------------------------------------------------------
void BookmarksList::load()
{
    QFile f(YACReader::getSettingsPath() + "/bookmarks.yacr");
    try {
        if (f.open(QIODevice::ReadOnly)) {
            QDataStream dataS(&f);
            dataS >> list;
            f.close();
        }
    } catch (const std::exception &e) {
        f.close();

        f.remove();
    }
}

void BookmarksList::save()
{
    QFile f(YACReader::getSettingsPath() + "/bookmarks.yacr");
    f.open(QIODevice::WriteOnly);
    QDataStream dataS(&f);
    if (list.count() > numMaxBookmarks)
        deleteOldest(list.count() - numMaxBookmarks);
    dataS << list;
    f.close();
}

void BookmarksList::deleteOldest(int num)
{
    Q_UNUSED(num)
    QString comic;
    auto date = QDate().endOfDay();
    for (QMap<QString, Bookmark>::const_iterator itr = list.constBegin(); itr != list.constEnd(); itr++) {
        if (itr->added < date) {
            comic = itr.key();
            date = itr->added;
        }
    }
    list.remove(comic);
}

void BookmarksList::add(const QString &comicID, const Bookmark &b)
{
    list.insert(comicID, b);
}

BookmarksList::Bookmark BookmarksList::get(const QString &comicID)
{
    // if(list.contains(comicID)
    return list.value(comicID);
}
