package ru.dbotthepony.kstarbound.defs

import com.google.common.collect.ImmutableList
import com.google.common.collect.ImmutableSet
import ru.dbotthepony.kstarbound.Registry
import ru.dbotthepony.kstarbound.defs.image.SpriteReference
import ru.dbotthepony.kstarbound.defs.actor.player.BlueprintLearnList
import ru.dbotthepony.kstarbound.defs.item.ItemDescriptor
import ru.dbotthepony.kstarbound.json.builder.JsonFactory

@JsonFactory
data class Species(
	val kind: String,
	val charCreationTooltip: Tooltip,
	val nameGen: ImmutableList<String>,
	val ouchNoises: ImmutableList<String>,
	val charGenTextLabels: ImmutableList<String>,
	val skull: String,
	val defaultBlueprints: BlueprintLearnList,
	val headOptionAsFacialhair: Boolean = false,
	val altOptionAsUndyColor: Boolean = false,
	val altOptionAsHairColor: Boolean = false,
	val bodyColorAsFacialMaskSubColor: Boolean = false,
	val hairColorAsBodySubColor: Boolean = false,
	val bodyColor: ImmutableList<ColorReplacements>,
	val undyColor: ImmutableList<ColorReplacements>,
	val hairColor: ImmutableList<ColorReplacements>,
	val genders: ImmutableList<Gender>,
	val statusEffects: ImmutableSet<Registry.Ref<StatusEffectDefinition>> = ImmutableSet.of(),
) {
	@JsonFactory
	data class Tooltip(val title: String, val subTitle: String, val description: String)

	@JsonFactory
	data class Gender(
		val name: String,
		val image: SpriteReference,
		val characterImage: SpriteReference,
		val hairGroup: String? = null,
		val hair: ImmutableSet<String>,
		val shirt: ImmutableSet<ItemDescriptor>,
		val pants: ImmutableSet<ItemDescriptor>,
		val facialHairGroup: String? = null,
		val facialHair: ImmutableSet<String> = ImmutableSet.of(),
		val facialMaskGroup: String? = null,
		val facialMask: ImmutableList<String> = ImmutableList.of(),
	)
}
