#ifndef EOSIO_H
#define EOSIO_H

#include <string>
#include <variant>
#include <memory>

// EOS table format includes
#include "helm.h"

using EOSTable = std::variant<
                 std::unique_ptr<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.
     */
    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.
     */
    std::string getFormat() const;

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

#endif // EOSIO_H