///This file holds the main classes of NIF Records used by everything else.
#ifndef OPENMW_COMPONENTS_NIF_BASE_HPP
#define OPENMW_COMPONENTS_NIF_BASE_HPP

#include "record.hpp"
#include "niffile.hpp"
#include "recordptr.hpp"
#include "nifstream.hpp"
#include "nifkey.hpp"

namespace Nif
{
// An extra data record. All the extra data connected to an object form a linked list.
struct Extra : public Record
{
    std::string name;
    ExtraPtr next; // Next extra data record in the list
    unsigned int recordSize{0u};

    void read(NIFStream *nif) override
    {
        if (nif->getVersion() >= NIFStream::generateVersion(10,0,1,0))
            name = nif->getString();
        else if (nif->getVersion() <= NIFStream::generateVersion(4,2,2,0))
        {
            next.read(nif);
            recordSize = nif->getUInt();
        }
    }

    void post(NIFFile *nif) override { next.post(nif); }
};

struct Controller : public Record
{
    ControllerPtr next;
    int flags;
    float frequency, phase;
    float timeStart, timeStop;
    NamedPtr target;

    void read(NIFStream *nif) override;
    void post(NIFFile *nif) override;
};

/// Has name, extra-data and controller
struct Named : public Record
{
    std::string name;
    ExtraPtr extra;
    ExtraList extralist;
    ControllerPtr controller;

    void read(NIFStream *nif) override
    {
        name = nif->getString();
        if (nif->getVersion() < NIFStream::generateVersion(10,0,1,0))
            extra.read(nif);
        else
            extralist.read(nif);
        controller.read(nif);
    }

    void post(NIFFile *nif) override
    {
        extra.post(nif);
        extralist.post(nif);
        controller.post(nif);
    }
};
using NiSequenceStreamHelper = Named;

} // Namespace
#endif
