#ifndef DOCUMENTSTYLELISTMODEL_H
#define DOCUMENTSTYLELISTMODEL_H

#include <QObject>
#include <QAbstractListModel>
#include <QVector>
#include "../global/doctemplatemanager.h"

class DocumentStyleListModel : public QAbstractListModel
{
    Q_OBJECT

public:
    explicit DocumentStyleListModel(QObject *parent = nullptr);
    ~DocumentStyleListModel();

    static DocumentStyleListModel *getInstance();

    enum DocumentStyleRoleType {
        TemplateUuid = Qt::UserRole + 1,   // 唯一标识符
        TemplateName,                      // 名称
        TemplateOutline,                   // 结构大纲（存储为txt文件路径）
        TemplateTone,                      // 语气风格
        TemplateCount,                     // 长度(页)
        TemplatePrompt,                    // 提示词
        TemplateTip,                       // 模板简介
        TemplateProperty,                  // 模板属性（一气呵成/步骤写作/逐个填空）
        IsReference,                       // 是否启用内容参考
        IsOutline,                         // 是否启用结构大纲
        IsCustom                           // 是否是自定义项
    };

    Q_ENUM(DocumentStyleRoleType)

    // QAbstractListModel interface
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role) const override;
    QHash<int, QByteArray> roleNames() const override;

    // 数据操作接口
    Q_INVOKABLE bool addTemplate(const DocTemplate &info);
    Q_INVOKABLE bool removeTemplate(const QString &uuid);
    Q_INVOKABLE bool updateTemplate(const QString& uuid, const DocTemplate& newData);
    Q_INVOKABLE QVariantMap getTemplate(const QString &uuid) const;
    Q_INVOKABLE int templateCount() const;

    // 通过索引获取模板
    Q_INVOKABLE QVariantMap getTemplateByIndex(int index) const;

    // 检查是否为自定义模板
    Q_INVOKABLE bool isCustomTemplate(const QString& uuid) const;

signals:
    void templateAdded(const DocTemplate& newTemplate);
    void templateRemoved(const QString& uuid);
    void templateUpdated(const DocTemplate& updatedTemplate);

private slots:
    void onTemplateAdded(const DocTemplate &newTemplate);
    void onTemplateRemoved(const QString &uuid);
    void onTemplateUpdated(const DocTemplate &updatedTemplate);

private:
    void loadTemplates();
    int findTemplateIndex(const QString &uuid) const;
    bool isTemplateCustom(const DocTemplate& templateData) const;

    QVector<DocTemplate> m_templates;
    DocTemplateManager *m_templateManager;
    static DocumentStyleListModel *mInstance;
};

#endif // DOCUMENTSTYLELISTMODEL_H
