// MassBuilderSaveTool
// Copyright (C) 2021-2022 Guillaume Jacquemin
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

#include "../BinaryReader.h"
#include "../BinaryWriter.h"
#include "../../Logger/Logger.h"

#include "EnumPropertySerialiser.h"

StringArrayView
EnumPropertySerialiser::types() {
    using namespace Containers::Literals;
    static const Containers::Array<Containers::String> types{InPlaceInit, {"EnumProperty"_s}};
    return types;
}

UnrealPropertyBase::ptr
EnumPropertySerialiser::deserialise(Containers::StringView name, Containers::StringView type, std::size_t value_length,
                                    BinaryReader& reader, PropertySerialiser& serialiser)
{
    auto prop = Containers::pointer<EnumProperty>();

    if(!reader.readUEString(prop->enumType)) {
        LOG_ERROR_FORMAT("Couldn't read enum property {}'s enum type.", name);
        return nullptr;
    }

    char terminator;
    if(!reader.readChar(terminator) || terminator != '\0') {
        LOG_ERROR_FORMAT("Couldn't read a null byte in enum property {}.", name);
        return nullptr;
    }

    if(!reader.readUEString(prop->value)) {
        LOG_ERROR_FORMAT("Couldn't read enum property {}'s enum value.", name);
        return nullptr;
    }

    return prop;
}

bool
EnumPropertySerialiser::serialise(UnrealPropertyBase::ptr& prop, std::size_t& bytes_written, BinaryWriter& writer,
                                  PropertySerialiser& serialiser)
{
    auto enum_prop = dynamic_cast<EnumProperty*>(prop.get());
    if(!enum_prop) {
        LOG_ERROR("The property is not a valid enum property.");
        return false;
    }

    writer.writeUEStringToArray(enum_prop->enumType);
    writer.writeValueToArray<char>('\0');
    bytes_written += writer.writeUEStringToArray(enum_prop->value);

    return true;
}