/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/

#include "AssetTreeItem.h"

#include <QApplication>
#include <QFileIconProvider>
#include <QIcon>
#include <QStyle>
#include <QVariant>

namespace AssetProcessor
{

    AssetTreeItemData::AssetTreeItemData(const AZStd::string& assetDbName, QString name, bool isFolder, const AZ::Uuid& uuid) :
        m_assetDbName(assetDbName),
        m_name(name),
        m_isFolder(isFolder),
        m_uuid(uuid)
    {
        QFileInfo fileInfo(name);
        m_extension = fileInfo.completeSuffix();
    }

    AssetTreeItem::AssetTreeItem(
        AZStd::shared_ptr<AssetTreeItemData> data,
        QIcon errorIcon,
        AssetTreeItem* parentItem) :
        m_data(data),
        m_parent(parentItem),
        m_errorIcon(errorIcon), // QIcon is implicitily shared.
        m_folderIcon(QIcon(QStringLiteral(":/Gallery/Asset_Folder.svg"))),
        m_fileIcon(QIcon(QStringLiteral(":/Gallery/Asset_File.svg")))
    {
        m_folderIcon.addFile(QStringLiteral(":/Gallery/Asset_Folder.svg"), QSize(), QIcon::Selected);
    }

    AssetTreeItem::~AssetTreeItem()
    {
    }

    AssetTreeItem* AssetTreeItem::CreateChild(AZStd::shared_ptr<AssetTreeItemData> data)
    {
        m_childItems.emplace_back(new AssetTreeItem(data, m_errorIcon, this));
        return m_childItems.back().get();
    }

    AssetTreeItem* AssetTreeItem::GetChild(int row) const
    {
        if (row < 0 || row >= getChildCount())
        {
            return nullptr;
        }
        return m_childItems.at(row).get();
    }

    void AssetTreeItem::EraseChild(AssetTreeItem* child)
    {
        for (auto& item : m_childItems)
        {
            if (item.get() == child)
            {
                m_childItems.erase(&item);
                break;
            }
        }
    }

    int AssetTreeItem::getChildCount() const
    {
        return static_cast<int>(m_childItems.size());
    }

    int AssetTreeItem::GetRow() const
    {
        if (m_parent)
        {
            int index = 0;
            for (const auto& item : m_parent->m_childItems)
            {
                if (item.get() == this)
                {
                    return index;
                }
                ++index;
            }
        }
        return 0;
    }

    int AssetTreeItem::GetColumnCount() const
    {
        return static_cast<int>(AssetTreeColumns::Max);
    }

    QVariant AssetTreeItem::GetDataForColumn(int column) const
    {
        if (column < 0 || column >= GetColumnCount() || !m_data)
        {
            return QVariant();
        }
        switch (column)
        {
            case static_cast<int>(AssetTreeColumns::Name):
                return m_data->m_name;
            case static_cast<int>(AssetTreeColumns::Extension):
                if (m_data->m_isFolder)
                {
                    return QVariant();
                }
                return m_data->m_extension;
            default:
                AZ_Warning("AssetProcessor", false, "Unhandled AssetTree column %d", column);
                break;
        }
        return QVariant();
    }

    QIcon AssetTreeItem::GetIcon() const
    {
        if (!m_data)
        {
            return QIcon();
        }
        if (m_data->m_assetHasUnresolvedIssue)
        {
            return m_errorIcon;
        }
        if (m_data->m_isFolder)
        {
            return m_folderIcon;
        }
        else
        {
            return m_fileIcon;
        }
    }

    AssetTreeItem* AssetTreeItem::GetParent() const
    {
        return m_parent;
    }

    AssetTreeItem* AssetTreeItem::GetChildFolder(QString folder) const
    {
        for (const auto& item : m_childItems)
        {
            if (!item->m_data ||
                !item->m_data->m_isFolder)
            {
                continue;
            }
            if (item->m_data->m_name == folder)
            {
                return item.get();
            }
        }
        return nullptr;
    }

}