/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWebEngine module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qquickwebenginehistory_p.h"
#include "qquickwebenginehistory_p_p.h"

#include "qquickwebenginefaviconprovider_p_p.h"
#include "qquickwebengineloadrequest_p.h"
#include "qquickwebengineview_p_p.h"
#include "web_contents_adapter.h"

QT_BEGIN_NAMESPACE

QQuickWebEngineHistoryListModelPrivate::QQuickWebEngineHistoryListModelPrivate(QQuickWebEngineViewPrivate *view)
    : view(view)
{
}

QQuickWebEngineHistoryListModelPrivate::~QQuickWebEngineHistoryListModelPrivate()
{
}

int QQuickWebEngineHistoryListModelPrivate::count() const
{
    return adapter()->navigationEntryCount();
}

int QQuickWebEngineHistoryListModelPrivate::index(int index) const
{
    return index;
}

int QQuickWebEngineHistoryListModelPrivate::offsetForIndex(int index) const
{
    return index - adapter()->currentNavigationEntryIndex();
}

QtWebEngineCore::WebContentsAdapter *QQuickWebEngineHistoryListModelPrivate::adapter() const
{
    return view->adapter.data();
}

QQuickWebEngineBackHistoryListModelPrivate::QQuickWebEngineBackHistoryListModelPrivate(QQuickWebEngineViewPrivate *view)
    : QQuickWebEngineHistoryListModelPrivate(view)
{
}

int QQuickWebEngineBackHistoryListModelPrivate::count() const
{
    return adapter()->currentNavigationEntryIndex();
}

int QQuickWebEngineBackHistoryListModelPrivate::index(int i) const
{
    Q_ASSERT(i >= 0 && i < count());
    return count() - 1 - i;
}

int QQuickWebEngineBackHistoryListModelPrivate::offsetForIndex(int index) const
{
    return - index - 1;
}

QQuickWebEngineForwardHistoryListModelPrivate::QQuickWebEngineForwardHistoryListModelPrivate(QQuickWebEngineViewPrivate *view)
    : QQuickWebEngineHistoryListModelPrivate(view)
{
}

int QQuickWebEngineForwardHistoryListModelPrivate::count() const
{
    if (!adapter()->isInitialized())
        return 0;
    return adapter()->navigationEntryCount() - adapter()->currentNavigationEntryIndex() - 1;
}

int QQuickWebEngineForwardHistoryListModelPrivate::index(int i) const
{
    return adapter()->currentNavigationEntryIndex() + i + 1;
}

int QQuickWebEngineForwardHistoryListModelPrivate::offsetForIndex(int index) const
{
    return index + 1;
}

/*!
    \qmltype WebEngineHistoryListModel
    \instantiates QQuickWebEngineHistoryListModel
    \inqmlmodule QtWebEngine
    \since QtWebEngine 1.1

    \brief A data model that represents the history of a web engine page.

    The WebEngineHistoryListModel type exposes the \e title, \e url, \e icon, and \e offset roles.
    The \e title, \e url and \e icon specify the title, URL, and favicon of the visited page.
    The \e offset specifies
    the position of the page in respect to the current page (0). A positive number indicates that
    the page was visited after the current page, whereas a negative number indicates that the page
    was visited before the current page.

    This type is uncreatable, but it can be accessed by using the
    \l{WebEngineView::navigationHistory}{WebEngineView.navigationHistory} property.

    \sa WebEngineHistory
*/

QQuickWebEngineHistoryListModel::QQuickWebEngineHistoryListModel()
    : QAbstractListModel()
{
}

QQuickWebEngineHistoryListModel::QQuickWebEngineHistoryListModel(QQuickWebEngineHistoryListModelPrivate *d)
    : QAbstractListModel()
    , d_ptr(d)
{
}

QQuickWebEngineHistoryListModel::~QQuickWebEngineHistoryListModel()
{
}

QHash<int, QByteArray> QQuickWebEngineHistoryListModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[QQuickWebEngineHistory::UrlRole] = "url";
    roles[QQuickWebEngineHistory::TitleRole] = "title";
    roles[QQuickWebEngineHistory::OffsetRole] = "offset";
    roles[QQuickWebEngineHistory::IconUrlRole] = "icon";
    return roles;
}

int QQuickWebEngineHistoryListModel::rowCount(const QModelIndex &index) const
{
    Q_UNUSED(index);
    Q_D(const QQuickWebEngineHistoryListModel);
    return d->count();
}

QVariant QQuickWebEngineHistoryListModel::data(const QModelIndex &index, int role) const
{
    Q_D(const QQuickWebEngineHistoryListModel);

    if (!index.isValid())
        return QVariant();

    if (role < QQuickWebEngineHistory::UrlRole || role > QQuickWebEngineHistory::IconUrlRole)
        return QVariant();

    if (role == QQuickWebEngineHistory::UrlRole)
        return QUrl(d->adapter()->getNavigationEntryUrl(d->index(index.row())));

    if (role == QQuickWebEngineHistory::TitleRole)
        return QString(d->adapter()->getNavigationEntryTitle(d->index(index.row())));

    if (role == QQuickWebEngineHistory::OffsetRole)
        return d->offsetForIndex(index.row());

    if (role == QQuickWebEngineHistory::IconUrlRole) {
        QUrl iconUrl = QUrl(d->adapter()->getNavigationEntryIconUrl(d->index(index.row())));
        return QQuickWebEngineFaviconProvider::faviconProviderUrl(iconUrl);
    }

    return QVariant();
}

void QQuickWebEngineHistoryListModel::reset()
{
    beginResetModel();
    endResetModel();
}

QQuickWebEngineHistoryPrivate::QQuickWebEngineHistoryPrivate(QQuickWebEngineViewPrivate *view)
    : m_view(view)
{
}

QQuickWebEngineHistoryPrivate::~QQuickWebEngineHistoryPrivate()
{
}

/*!
    \qmltype WebEngineHistory
    \instantiates QQuickWebEngineHistory
    \inqmlmodule QtWebEngine
    \since QtWebEngine 1.1

    \brief Provides data models that represent the history of a web engine page.

    The WebEngineHistory type can be accessed by using the
    \l{WebEngineView::navigationHistory}{WebEngineView.navigationHistory} property.

    The WebEngineHistory type provides the following WebEngineHistoryListModel data model objects:

    \list
        \li \c backItems, which contains the URLs of visited pages.
        \li \c forwardItems, which contains the URLs of the pages that were visited after visiting
            the current page.
        \li \c items, which contains the URLs of the back and forward items, as well as the URL of
            the current page.
    \endlist

    The easiest way to use these models is to use them in a ListView as illustrated by the
    following code snippet:

    \code
    ListView {
        id: historyItemsList
        anchors.fill: parent
        model: webEngineView.navigationHistory.items
        delegate:
            Text {
                color: "black"
                text: model.title + " - " + model.url + " (" + model.offset + ")"
            }
    }
    \endcode

    The ListView shows the content of the corresponding model. The delegate is responsible for the
    format of the list items. The appearance of each item of the list in the delegate can be defined
    separately (it is not web engine specific).

    The model roles \e title, \e url, and \e icon specify the title, URL, and favicon of the
    visited page. The \e offset
    role specifies the position of the page in respect to the current page (0). A positive number
    indicates that the page was visited after the current page, whereas a negative number indicates
    that the page was visited before the current page.

    The data models can also be used to create a menu, as illustrated by the following code
    snippet:

    \quotefromfile webengine/quicknanobrowser/BrowserWindow.qml
    \skipto ToolBar
    \printuntil onObjectRemoved
    \printuntil }
    \printuntil }
    \printuntil }

    For the complete example, see \l{WebEngine Quick Nano Browser}.

    \sa WebEngineHistoryListModel
*/

QQuickWebEngineHistory::QQuickWebEngineHistory(QQuickWebEngineViewPrivate *view)
    : d_ptr(new QQuickWebEngineHistoryPrivate(view))
{
}

QQuickWebEngineHistory::~QQuickWebEngineHistory()
{
}

/*!
    \qmlproperty WebEngineHistoryListModel WebEngineHistory::items
    \readonly

    URLs of back items, forward items, and the current item in the history.
*/
QQuickWebEngineHistoryListModel *QQuickWebEngineHistory::items() const
{
    Q_D(const QQuickWebEngineHistory);
    if (!d->m_navigationModel)
        d->m_navigationModel.reset(new QQuickWebEngineHistoryListModel(new QQuickWebEngineHistoryListModelPrivate(d->m_view)));
    return d->m_navigationModel.data();
}

/*!
    \qmlproperty WebEngineHistoryListModel WebEngineHistory::backItems
    \readonly

    URLs of visited pages.
*/
QQuickWebEngineHistoryListModel *QQuickWebEngineHistory::backItems() const
{
    Q_D(const QQuickWebEngineHistory);
    if (!d->m_backNavigationModel)
        d->m_backNavigationModel.reset(new QQuickWebEngineHistoryListModel(new QQuickWebEngineBackHistoryListModelPrivate(d->m_view)));
    return d->m_backNavigationModel.data();
}

/*!
    \qmlproperty WebEngineHistoryListModel WebEngineHistory::forwardItems
    \readonly

    URLs of the pages that were visited after visiting the current page.
*/
QQuickWebEngineHistoryListModel *QQuickWebEngineHistory::forwardItems() const
{
    Q_D(const QQuickWebEngineHistory);
    if (!d->m_forwardNavigationModel)
        d->m_forwardNavigationModel.reset(new QQuickWebEngineHistoryListModel(new QQuickWebEngineForwardHistoryListModelPrivate(d->m_view)));
    return d->m_forwardNavigationModel.data();
}

/*!
    \qmlmethod void WebEngineHistory::clear()
    \since QtWebEngine 1.11

    Clears the history.
*/
void QQuickWebEngineHistory::clear()
{
    Q_D(QQuickWebEngineHistory);
    d->m_view->adapter->clearNavigationHistory();
    d->m_view->updateNavigationActions();
    reset();
}

void QQuickWebEngineHistory::reset()
{
    Q_D(QQuickWebEngineHistory);
    if (d->m_navigationModel)
        d->m_navigationModel->reset();
    if (d->m_backNavigationModel)
        d->m_backNavigationModel->reset();
    if (d->m_forwardNavigationModel)
        d->m_forwardNavigationModel->reset();
}


QT_END_NAMESPACE
