package ru.dbotthepony.kstarbound.defs

import ru.dbotthepony.kstarbound.json.builder.IStringSerializable
import ru.dbotthepony.kstarbound.json.builder.JsonAlias
import ru.dbotthepony.kstarbound.json.builder.JsonFactory

@JsonFactory
data class PerlinNoiseParameters(
	val type: Type = Type.PERLIN,
	val seed: Long? = null,
	val scale: Int = DEFAULT_SCALE,
	val octaves: Int = 1,
	val gain: Double = 2.0,
	val offset: Double = 1.0,
	val beta: Double = 1.0,
	val alpha: Double = 2.0,
	val frequency: Double = 1.0,
	val amplitude: Double = 1.0,
	val bias: Double = 0.0,
) {
	init {
		require(scale >= 16) { "Too little perlin noise scale: $scale" }
		require(scale <= 2048) { "Absurd noise scale: $scale" }
	}

	enum class Type(override val jsonName: String) : IStringSerializable {
		UNITIALIZED("uninitialized"),
		PERLIN("perlin"),
		BILLOW("billow"),
		RIDGED_MULTI("ridgedMulti");

		private val lower = jsonName.lowercase()

		override fun match(name: String): Boolean {
			return name.lowercase() == lower
		}
	}

	companion object {
		const val DEFAULT_SCALE = 512
	}
}
