#pragma once

#include "../../Lib/Utils.hh"
#include "../../Lib/Ass/Ass.hh"
#include <QAbstractItemModel>
#include <QStringList>

namespace Vivy
{
class AssLinesModel final : public QAbstractItemModel {
    Q_OBJECT
    VIVY_UNMOVABLE_OBJECT(AssLinesModel)

private:
    class Item final {
        VIVY_UNMOVABLE_OBJECT(Item)

    public:
        Item(Ass::LineWeakPtr linePtr) noexcept;
        ~Item() noexcept = default;

        enum class Field : int {
            Text,

            // Last, the count
            TotalFieldCount,
        };

        bool getIsComment() const noexcept;
        quint64 getLineNumber() const noexcept;
        QString getLineText() const noexcept;
        QString getLineStyle() const noexcept;

    private:
        Ass::LineWeakPtr line;
    };

    static inline const QStringList headers{ "", "Style", "Text" };

public:
    explicit AssLinesModel(const QVector<Ass::LinePtr> &) noexcept;
    ~AssLinesModel() noexcept;

    QVariant data(const QModelIndex &, int role) const noexcept override;
    bool setData(const QModelIndex &, const QVariant &v, int r = Qt::EditRole) noexcept override;

    QVariant headerData(int section, Qt::Orientation, int r) const noexcept override;
    QModelIndex parent(const QModelIndex &) const noexcept override;
    QModelIndex index(int, int, const QModelIndex &parent = QModelIndex()) const noexcept override;

    int rowCount(const QModelIndex &parent = QModelIndex()) const noexcept override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const noexcept override;

    Qt::ItemFlags flags(const QModelIndex &) const noexcept override;

private:
    QVector<Item *> childs;
    const QVector<Ass::LinePtr> &lineRealData;
};
}