/*
 * Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
 */

#include <ox/model/model.hpp>

#include <keel/module.hpp>

#include <nostalgia/gfx/palette.hpp>
#include <nostalgia/gfx/tilesheet.hpp>

#include "typeconv.hpp"

namespace nostalgia::gfx {

static struct: keel::Module {

	[[nodiscard]]
	ox::String id() const noexcept override {
		return ox::String{"net.drinkingtea.nostalgia.gfx"};
	}

	[[nodiscard]]
	ox::Vector<keel::TypeDescGenerator> types() const noexcept final {
		return {
			keel::generateTypeDesc<TileSheetV1>,
			keel::generateTypeDesc<TileSheetV2>,
			keel::generateTypeDesc<TileSheetV3>,
			keel::generateTypeDesc<TileSheetV4>,
			keel::generateTypeDesc<TileSheetV5>,
			keel::generateTypeDesc<CompactTileSheetV1>,
			keel::generateTypeDesc<PaletteV1>,
			keel::generateTypeDesc<PaletteV2>,
			keel::generateTypeDesc<PaletteV3>,
			keel::generateTypeDesc<PaletteV4>,
			keel::generateTypeDesc<PaletteV5>,
			keel::generateTypeDesc<CompactPaletteV1>,
		};
	}

	[[nodiscard]]
	ox::Vector<keel::Converter> converters() const noexcept final {
		return {
			keel::Converter::make<convertNostalgiaPaletteToPaletteV1>(),
			keel::Converter::make<convertPaletteV1ToPaletteV2>(),
			keel::Converter::make<convertPaletteV2ToPaletteV3>(),
			keel::Converter::make<convertPaletteV3ToPaletteV4>(),
			keel::Converter::make<convertPaletteV4ToPaletteV5>(),
			keel::Converter::make<convertPaletteToCompactPalette>(),
			keel::Converter::make<convertTileSheetV1ToTileSheetV2>(),
			keel::Converter::make<convertTileSheetV2ToTileSheetV3>(),
			keel::Converter::make<convertTileSheetV3ToTileSheetV4>(),
			keel::Converter::make<convertTileSheetV4ToTileSheetV5>(),
			keel::Converter::make<convertTileSheetToCompactTileSheet>(),
		};
	}

	[[nodiscard]]
	ox::Vector<keel::PackTransform> packTransforms() const noexcept final {
		return {
			// convert tilesheets to CompactTileSheets
			keel::transformRule<TileSheetV1, CompactTileSheet>,
			keel::transformRule<TileSheetV2, CompactTileSheet>,
			keel::transformRule<TileSheetV3, CompactTileSheet>,
			keel::transformRule<TileSheetV4, CompactTileSheet>,
			keel::transformRule<TileSheetV5, CompactTileSheet>,
			// convert palettes to CompactPalettes
			keel::transformRule<NostalgiaPalette, CompactPalette>,
			keel::transformRule<PaletteV1, CompactPalette>,
			keel::transformRule<PaletteV2, CompactPalette>,
			keel::transformRule<PaletteV3, CompactPalette>,
			keel::transformRule<PaletteV4, CompactPalette>,
			keel::transformRule<PaletteV5, CompactPalette>,
		};
	}

} const mod;

keel::Module const *keelModule() noexcept {
	return &mod;
}

}
