/* ***********************************************************************
//
//   Copyright (C) 2025 -- The 4D-STAR Collaboration
//   File Author: Emily Boudreaux
//   Last Modified: March 20, 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 <string>
#include <variant>
#include <memory>
#include "helm.h"

namespace serif::eos {

    // EOS table format includes

    using EOSTable = std::variant<
                     std::unique_ptr<serif::eos::helmholtz::HELMTable>
                     >;

    /**
     * @class EOSio
     * @brief Handles the input/output operations for EOS tables.
     *
     * The EosIO class is responsible for loading and managing EOS tables from files.
     * It supports different formats, currently only HELM format.
     *
     * Example usage:
     * @code
     * EosIO eosIO("path/to/file");
     * std::string format = eosIO.getFormat();
     * EOSTable& table = eosIO.getTable();
     * @endcode
     */
    class EOSio {
    private:
        std::string m_filename; ///< The filename of the EOS table.
        bool m_loaded = false; ///< Flag indicating if the table is loaded.
        std::string m_format; ///< The format of the EOS table.
        EOSTable m_table; ///< The EOS table data.

        /**
         * @brief Loads the EOS table from the file.
         */
        void load();

        /**
         * @brief Loads the HELM format EOS table.
         */
        void loadHelm();
    public:
        /**
         * @brief Constructs an EosIO object with the given filename.
         * @param filename The filename of the EOS table.
         */
        explicit EOSio(const std::string &filename);

        /**
         * @brief Default destructor.
         */
        ~EOSio() = default;

        /**
         * @brief Gets the format of the EOS table.
         * @return The format of the EOS table as a string.
         */
        [[nodiscard]] std::string getFormat() const;

        /**
         * @brief Gets the EOS table.
         * @return A reference to the EOS table.
         */
        [[nodiscard]] EOSTable& getTable();

        [[nodiscard]] std::string getFilename() const { return m_filename; }
    };
}

