#include "yacreader_library_list_widget.h"

#include "yacreader_library_item_widget.h"
#include <QVBoxLayout>
#include <QMouseEvent>
#include <QMenu>
#include "qnaturalsorting.h"

YACReaderLibraryListWidget::YACReaderLibraryListWidget(QWidget *parent)
    : QWidget(parent), currentLibraryIndex(-1)
{
    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->setSpacing(0);
    mainLayout->setContentsMargins(0, 0, 0, 0);

    this->setLayout(mainLayout);
}

void YACReaderLibraryListWidget::addItem(QString name, QString path)
{
    QVBoxLayout *mainLayout = dynamic_cast<QVBoxLayout *>(layout());

    YACReaderLibraryItemWidget *library = new YACReaderLibraryItemWidget(name, path, this);
    connect(library, &YACReaderLibraryItemWidget::showOptions, this, &YACReaderLibraryListWidget::showContextMenu);
    QList<YACReaderLibraryItemWidget *>::iterator itr;
    int i = 0;
    for (itr = librariesList.begin(); itr != librariesList.end() && !naturalSortLessThanCI(name, (*itr)->name); itr++)
        i++;

    librariesList.insert(itr, library);

    // connect(library,SIGNAL(selected(QString,QString)),this,SIGNAL(librarySelected(QString,QString)));
    // connect(library,SIGNAL(selected(QString,QString)),this,SLOT(updateLibraries(QString,QString)));

    mainLayout->insertWidget(i, library);
}

QString YACReaderLibraryListWidget::currentText()
{
    return librariesList.at(currentLibraryIndex)->name;
}
int YACReaderLibraryListWidget::findText(QString text)
{
    for (int i = 0; i < librariesList.count(); i++) {
        if (librariesList.at(i)->name == text)
            return i;
    }
    return -1;
}
void YACReaderLibraryListWidget::setCurrentIndex(int index)
{
    if (index >= 0 && index < librariesList.count()) {
        librariesList.at(index)->select();
        currentLibraryIndex = index;
        deselectAllBut(index);
        emit currentIndexChanged(librariesList.at(currentLibraryIndex)->name);
    }
}

int YACReaderLibraryListWidget::currentIndex()
{
    return currentLibraryIndex;
}
void YACReaderLibraryListWidget::removeItem(int index)
{
    YACReaderLibraryItemWidget *itemWidget = librariesList.at(index);
    this->layout()->removeWidget(itemWidget);
    librariesList.removeAt(index);
    if (librariesList.count() > 0) {
        setCurrentIndex(0);
    }
    delete itemWidget;
}

void YACReaderLibraryListWidget::mousePressEvent(QMouseEvent *event)
{
    if (librariesList.count() > 0) {
        int h = librariesList.at(0)->height();
        int item = event->pos().y() / h;
        if (item != currentLibraryIndex) {
            setCurrentIndex(item);
        }
    }
}

void YACReaderLibraryListWidget::deselectAllBut(int index)
{
    for (int i = 0; i < librariesList.count(); i++) {
        if (i != index)
            librariesList.at(i)->deselect();
    }
}

void YACReaderLibraryListWidget::showContextMenu()
{
    YACReaderLibraryItemWidget *itemWidget = librariesList.at(currentLibraryIndex);
    QMenu::exec(actions(), itemWidget->mapToGlobal(QPoint(itemWidget->width() - 8, itemWidget->height() / 2)));
}

void YACReaderLibraryListWidget::renameCurrentLibrary(QString newName)
{
    YACReaderLibraryItemWidget *itemWidget = librariesList.at(currentLibraryIndex);

    this->layout()->removeWidget(itemWidget);
    librariesList.removeOne(itemWidget);

    itemWidget->setName(newName);

    QList<YACReaderLibraryItemWidget *>::iterator itr;
    int i = 0;
    for (itr = librariesList.begin(); itr != librariesList.end() && !naturalSortLessThanCI(newName, (*itr)->name); itr++)
        i++;

    librariesList.insert(itr, itemWidget);

    QVBoxLayout *mainLayout = dynamic_cast<QVBoxLayout *>(layout());
    mainLayout->insertWidget(i, itemWidget);

    currentLibraryIndex = i;
}
