/*
 * Peony-Qt
 *
 * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * Authors: MeihongHe <hemeihong@kylinos.cn>
 *
 */

#include "label-box-delegate.h"
#include "file-label-model.h"

#include <QStyleOptionViewItem>
#include <QLineEdit>
#include <QDebug>

LabelBoxDelegate::LabelBoxDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
    qDebug() << "LabelBoxDelegate enter";
}

void LabelBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    qDebug() << "LabelBoxDelegate paint";
    auto opt = option;
    opt.decorationSize = QSize();
    QStyledItemDelegate::paint(painter, opt, index);
}

QWidget *LabelBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(option);

    auto labelModel = getSourceModel(index.model());
    if (labelModel) {
        QModelIndex sourceIndex = mapToSourceIndex(index);
        labelModel->setEditingIndex(sourceIndex);
    }

    QLineEdit* editor = new QLineEdit(parent);
    editor->setMaxLength(14);
    return editor;
}

void LabelBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString text = index.model()->data(index, Qt::EditRole).toString();
    QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
    lineEdit->setText(text);
}

void LabelBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
    QString text = lineEdit->text();
    model->setData(index, text, Qt::EditRole);

    auto labelModel = getSourceModel(model);
    if (labelModel) {
        labelModel->clearEditingIndex();
    }
}

void LabelBoxDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const
{
    auto labelModel = getSourceModel(index.model());
    if (labelModel) {
        labelModel->clearEditingIndex();
    }

    QStyledItemDelegate::destroyEditor(editor, index);
}

FileLabelModel* LabelBoxDelegate::getSourceModel(const QAbstractItemModel* model) const
{
    if (auto proxyModel = qobject_cast<const FileLableProxyFilterSortModel*>(model)) {
        return qobject_cast<FileLabelModel*>(proxyModel->sourceModel());
    }
    return qobject_cast<FileLabelModel*>(const_cast<QAbstractItemModel*>(model));
}

QModelIndex LabelBoxDelegate::mapToSourceIndex(const QModelIndex& proxyIndex) const
{
    if (auto proxyModel = qobject_cast<const FileLableProxyFilterSortModel*>(proxyIndex.model())) {
        return proxyModel->mapToSource(proxyIndex);
    }
    return proxyIndex;
}
