/* ***********************************************************************
//
//   Copyright (C) 2025 -- The 4D-STAR Collaboration
//   File Author: Emily Boudreaux
//   Last Modified: March 18, 2025
//
//   4DSSE is free software; you can use it and/or modify
//   it under the terms and restrictions the GNU General Library Public
//   License version 3 (GPLv3) as published by the Free Software Foundation.
//
//   4DSSE is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//   See the GNU Library General Public License for more details.
//
//   You should have received a copy of the GNU Library General Public License
//   along with this software; if not, write to the Free Software
//   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// *********************************************************************** */
#pragma once

#include "mfem.hpp"
#include <string>

namespace serif::mesh {
    /**
     * @brief Class for handling mesh input/output operations.
     */
    class MeshIO
    {
    private:
        bool loaded_; ///< Flag to indicate if the mesh is loaded
        std::string mesh_file_; ///< Filename of the mesh file
        std::unique_ptr<mfem::Mesh> m_mesh; ///< The mesh object

    public:
        /**
         * @brief Constructor that initializes the MeshIO object with a mesh file.
         * @param mesh_file The name of the mesh file.
         * @param scale_factor
         */
        explicit MeshIO(const std::string &mesh_file, double scale_factor = 1.0);

        /**
         * @brief Destructor for the MeshIO class.
         */
        ~MeshIO();

        /**
         * @brief Rescale the mesh by a linear factor.
         * @param scale_factor The factor by which to scale the mesh.
         */
        void LinearRescale(double scale_factor) const;

        /**
         * @brief Get the mesh object.
         * @return Pointer to the mesh object.
         */
        [[nodiscard]] mfem::Mesh & GetMesh() const noexcept;

        /**
         * @brief Check if the mesh is loaded.
         * @return True if the mesh is loaded, false otherwise.
         */
        [[nodiscard]] bool IsLoaded() const;
    };
}