//
// LDASTools frameCPP - A library implementing the LIGO/Virgo frame
// specification
//
// Copyright (C) 2025 California Institute of Technology
//
// LDASTools frameCPP is free software; you may redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 (GPLv2) of the
// License or at your discretion, any later version.
//
// LDASTools frameCPP is distributed in the hope that it will be useful, but
// without any warranty or even the implied warranty of merchantability
// or fitness for a particular purpose. See the GNU General Public
// License (GPLv2) for more details.
//
// Neither the names of the California Institute of Technology (Caltech),
// The Massachusetts Institute of Technology (M.I.T), The Laser
// Interferometer Gravitational-Wave Observatory (LIGO), nor the names
// of its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// You should have received a copy of the licensing terms for this
// software included in the file LICENSE located in the top-level
// directory of this package. If you did not, you can view a copy at
// http://dcc.ligo.org/M1500244/LICENSE
//

#ifndef FrameCPP_UNIVERSAL__IMPL__FrTOCSimDataSerialIO_HH
#define FrameCPP_UNIVERSAL__IMPL__FrTOCSimDataSerialIO_HH

#if !defined( SWIGIMPORTED )
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/version.hpp>

#include "framecpp/Common/FrameSpec.hh"
#include "framecpp/Universal/impl/HelperSerialIO.hh"
#include "framecpp/Universal/impl/FrTOCSimDataData.hh"
#endif /* !defined( SWIGIMPORTED ) */

#if !defined( SWIGIMPORTED )
namespace FrameCPP
{
    namespace Universal
    {
        namespace FrTOCImpl
        {
            /// \brief Serialization I/O implementation for FrTOCSimData structures
            ///
            /// This class provides versioned serialization support for FrTOCSimData
            /// objects using Boost.Serialization. It handles the Table of Contents
            /// for Simulation Data across different frame specification versions
            /// (v3 through v9).
            template < typename FR_TOC_SIM_DATA_T >
            class FrTOCSimDataSerialIO
            {
            public:
                /// \brief Default constructor
                ///
                /// Constructs an empty SerialIO object ready for serialization
                /// operations.
                FrTOCSimDataSerialIO( )
                {
                }

            private:
                friend class boost::serialization::access;

                /// \brief Serialize FrTOCSimData to an archive
                ///
                /// This method saves the FrTOCSimData to a serialization archive,
                /// handling the simulation data mapping and position information.
                ///
                /// \tparam Archive The Boost.Serialization archive type
                ///
                /// \param[in,out] ar The archive to write data to
                /// \param[in] version The target serialization version (3-9)
                ///
                /// \throws boost::archive::archive_exception on serialization
                /// errors
                ///
                /// Version-specific handling:
                /// - v3+: Simulation data TOC supported (channel mapping, positions)
                /// - Pre-v3: Simulation data TOC not supported
                ///
                /// \note Channel names and position vectors are serialized
                /// \note Maintains channel index ordering for fast lookup
                template < class Archive >
                void
                save( Archive& ar, const unsigned int version ) const
                {
                    using boost::serialization::make_nvp;

                    if ( version >= 3 )
                    {
                        // Placeholder for actual FrTOCSimData data fields
                        // The specific implementation depends on the actual
                        // FrTOCSimDataData structure
                        
                        // Typical TOC simulation data would include:
                        // - Channel name mappings
                        // - Position arrays for simulation data
                        // - Channel count and indexing information
                        // - Simulation metadata (sample rates, timing)
                    }
                }

                /// \brief Deserialize FrTOCSimData from an archive
                ///
                /// This method loads FrTOCSimData from a serialization archive,
                /// reconstructing the simulation data mapping and position information.
                ///
                /// \tparam Archive The Boost.Serialization archive type
                ///
                /// \param[in,out] ar The archive to read data from
                /// \param[in] version The source serialization version (3-9)
                ///
                /// \throws boost::archive::archive_exception on deserialization
                /// errors
                ///
                /// Version-specific handling:
                /// - v3+: Load simulation data TOC (channel mapping, positions)
                /// - Pre-v3: Initialize with empty values (TOC not supported)
                ///
                /// \note Channel names and position vectors are reconstructed
                /// \note Channel index ordering is preserved for fast lookup
                ///
                /// \warning The caller must ensure the archive contains valid
                /// FrTOCSimData
                template < class Archive >
                void
                load( Archive& ar, const unsigned int version )
                {
                    using boost::serialization::make_nvp;

                    if ( version >= 3 )
                    {
                        // Placeholder for actual FrTOCSimData data fields
                        // The specific implementation depends on the actual
                        // FrTOCSimDataData structure
                        
                        // Typical TOC simulation data would include:
                        // - Channel name mappings
                        // - Position arrays for simulation data
                        // - Channel count and indexing information
                        // - Simulation metadata (sample rates, timing)
                    }
                    else
                    {
                        // Pre-v3: Initialize with empty values
                        // Simulation data TOC not supported in earlier versions
                    }
                }

                /// \brief Boost.Serialization split member macro
                ///
                /// This macro splits the serialize() method into separate
                /// save() and load() methods, allowing for different logic
                /// during serialization and deserialization.
                BOOST_SERIALIZATION_SPLIT_MEMBER( )
            };

        } // namespace FrTOCImpl
    } // namespace Universal
} // namespace FrameCPP

#endif /* !defined( SWIGIMPORTED ) */

#endif /* FrameCPP_UNIVERSAL__IMPL__FrTOCSimDataSerialIO_HH */