#ifndef VIVY_DOCUMENTSTORE_H
#define VIVY_DOCUMENTSTORE_H

#include "VivyDocument.hh"

#include <QMap>
#include <QString>
#include <memory>

class VivyDocumentStore final {
public:
    explicit VivyDocumentStore() noexcept = default;
    ~VivyDocumentStore() noexcept         = default;

    /* Don't move this object around */
    VivyDocumentStore(const VivyDocumentStore &) = delete;            // Copy
    VivyDocumentStore(VivyDocumentStore &&)      = delete;            // Move
    VivyDocumentStore &operator=(const VivyDocumentStore &) = delete; // Copy assign
    VivyDocumentStore &operator=(VivyDocumentStore &&) = delete;      // Move assign

    /* Create/load documents */
    std::weak_ptr<VivyDocument> loadDocument(const QString &file);
    std::weak_ptr<VivyDocument> newDocument();

    /* Get to see if a document is already present or not */
    [[nodiscard("handle-it")]] bool isDocumentPresent(const QString &name) noexcept;

    /* Close a document, please be sure to not used any of the dangling
     * references to the closed document... */
    void closeDocument(const QString &name) noexcept;

    /* Get stored documents */
    std::weak_ptr<VivyDocument> getDocument(const QString &name) const;

private:
    QMap<QString, std::shared_ptr<VivyDocument>> documents;
    uint newDocumentNumber{1};
    static inline const QString newDocumentBaseName = "Untitled ";
};

#endif // VIVY_DOCUMENTSTORE_H