// SPDX-FileCopyrightText: 2022 Francesco Pretto <ceztko@gmail.com>
// SPDX-License-Identifier: LGPL-2.0-or-later OR MPL-2.0

#ifndef PDF_CATALOG
#define PDF_CATALOG

#include "PdfElement.h"

namespace PoDoFo
{
    class PODOFO_API PdfCatalog final : public PdfDictionaryElement
    {
        friend class PdfDocument;

    private:
        PdfCatalog(PdfObject& obj);

    public:
        /// Get access to the StructTreeRoot dictionary
        /// @returns PdfObject the StructTreeRoot dictionary
        PdfObject* GetStructTreeRootObject();
        const PdfObject* GetStructTreeRootObject() const;

        /// Get access to the MarkInfo dictionary (ISO 32000-1:2008 14.7.1)
        /// @returns PdfObject the MarkInfo dictionary
        PdfObject* GetMarkInfoObject();
        const PdfObject* GetMarkInfoObject() const;

        /// Get access to the RFC 3066 natural language id for the document (ISO 32000-1:2008 14.9.2.1)
        /// @returns PdfObject the language ID string
        PdfObject* GetLangObject();
        const PdfObject* GetLangObject() const;

        /// Sets the opening mode for a document.
        /// @param mode which mode to set
        void SetPageMode(nullable<PdfPageMode> mode);

        /// Gets the opening mode for a document.
        /// @returns which mode is set
        PdfPageMode GetPageMode() const;

        /// Sets the opening mode for a document to be in full screen.
        void SetUseFullScreen();

        /// Sets the page layout for a document.
        void SetPageLayout(nullable<PdfPageLayout> layout);

        /// Set the document's Viewer Preferences:
        /// Hide the toolbar in the viewer.
        void SetHideToolbar();

        /// Set the document's Viewer Preferences:
        /// Hide the menubar in the viewer.
        void SetHideMenubar();

        /// Set the document's Viewer Preferences:
        /// Show only the documents contents and no control
        /// elements such as buttons and scrollbars in the viewer.
        void SetHideWindowUI();

        /// Set the document's Viewer Preferences:
        /// Fit the document in the viewer's window.
        void SetFitWindow();

        /// Set the document's Viewer Preferences:
        /// Center the document in the viewer's window.
        void SetCenterWindow();

        /// Set the document's Viewer Preferences:
        /// Display the title from the document information
        /// in the title of the viewer.
        ///
        /// @see SetTitle
        void SetDisplayDocTitle();

        /// Set the document's Viewer Preferences:
        /// Set the default print scaling of the document.
        ///
        /// TODO: DS use an enum here!
        void SetPrintScaling(const PdfName& scalingType);

        /// Set the document's Viewer Preferences:
        /// Set the base URI of the document.
        ///
        /// TODO: DS document value!
        void SetBaseURI(const std::string_view& baseURI);

        /// Set the document's Viewer Preferences:
        /// Set the language of the document.
        void SetLanguage(const std::string_view& language);

        /// Set the document's Viewer Preferences:
        /// Set the document's binding direction.
        void SetBindingDirection(const PdfName& direction);

        /// Get access to the Metadata stream
        /// @returns PdfObject the Metadata stream (should be in XML, using XMP grammar)
        PdfObject* GetMetadataObject();
        const PdfObject* GetMetadataObject() const;
        PdfObject& GetOrCreateMetadataObject();

        std::string GetMetadataStreamValue() const;
        void SetMetadataStreamValue(const std::string_view& value);

    private:
        /// Low-level APIs for setting a viewer preference.
        /// @param whichPref the dictionary key to set
        /// @param valueObj the object to be set
        void setViewerPreference(const PdfName& whichPref, const PdfObject& valueObj);

        /// Low-level APIs for setting a viewer preference.
        /// Convenience overload.
        /// @param whichPref the dictionary key to set
        /// @param inValue the object to be set
        void setViewerPreference(const PdfName& whichPref, bool inValue);
    };
}

#endif // PDF_CATALOG
