//
// 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_TEST_LEGACY_TOC_PRINTER_HH
#define FRAMECPP_TEST_LEGACY_TOC_PRINTER_HH

#include <iostream>
#include "framecpp/Universal/FrTOC.hh"

namespace FrameCPP
{
    namespace Test
    {
        /// \brief Legacy TOC printer for frame specification versions 3-7
        ///
        /// This class prints FrTOC contents in the exact format specified
        /// by frame specifications v3-v7, using parallel array format that
        /// predates the self-describing structure introduced in v8.
        ///
        /// The Universal::FrTOC internally stores data in v9 format, so this
        /// class reconstructs the version-specific parallel array output by
        /// flattening the structured in-memory representation.
        class LegacyTOCPrinter
        {
        public:
            /// \brief Constructor
            ///
            /// \param[in,out] os Output stream for TOC dump
            /// \param[in] indent Number of spaces to indent each line (default: 2)
            explicit LegacyTOCPrinter( std::ostream& os, unsigned int indent = 2 );

            /// \brief Print complete TOC in version-specific format
            ///
            /// \param[in] toc Table of contents to print
            /// \param[in] version Frame specification version (3-7)
            void print( const Universal::FrTOC* toc, unsigned int version );

        private:
            //---------------------------------------------------------------
            // Component printers - one per FrTOC sub-structure
            //---------------------------------------------------------------

            /// \brief Print FrTOCData section (frame metadata)
            void printFrTOCData( const Universal::FrTOC* toc,
                                 unsigned int             version );

            /// \brief Print FrTOCAdcData section (ADC channel index)
            void printFrTOCAdcData( const Universal::FrTOC* toc,
                                    unsigned int             version );

            /// \brief Print FrTOCProcData section (processed data index)
            void printFrTOCProcData( const Universal::FrTOC* toc,
                                     unsigned int             version );

            /// \brief Print FrTOCSimData section (simulation data index)
            void printFrTOCSimData( const Universal::FrTOC* toc,
                                    unsigned int             version );

            /// \brief Print FrTOCSerData section (serial data index)
            void printFrTOCSerData( const Universal::FrTOC* toc,
                                    unsigned int             version );

            /// \brief Print FrTOCEvent section (event/trigger data)
            void printFrTOCEvent( const Universal::FrTOC* toc,
                                  unsigned int             version );

            /// \brief Print FrTOCSimEvent section (simulation event data)
            void printFrTOCSimEvent( const Universal::FrTOC* toc,
                                     unsigned int             version );

            /// \brief Print FrTOCSummary section (summary/trend data)
            void printFrTOCSummary( const Universal::FrTOC* toc,
                                    unsigned int             version );

            /// \brief Print FrTOCStatData section (static data - deprecated in
            /// v9)
            ///
            /// Only prints for versions < 9
            void printFrTOCStatData( const Universal::FrTOC* toc,
                                     unsigned int             version );

            //---------------------------------------------------------------
            // Helper methods
            //---------------------------------------------------------------

            /// \brief Print simple array on one line
            ///
            /// \param[in] label Field name to print
            /// \param[in] container STL container to print
            template < typename Container >
            void printArray( const char* label, const Container& container );

            std::ostream&  m_os;     ///< Output stream
            unsigned int   m_indent; ///< Number of spaces to indent
            std::string    m_indent_str; ///< Cached indent string
        };

    } // namespace Test
} // namespace FrameCPP

#endif /* FRAMECPP_TEST_LEGACY_TOC_PRINTER_HH */
