package persona

// FaceDNA contains all facial feature specifications for a character.
// These features are selected BEFORE generation and must be used verbatim.
// The combination of these features creates the character's unique facial identity.
type FaceDNA struct {
	// ========== Structure ==========

	// FaceShape is the overall face shape category.
	FaceShape FaceShapeCategory `json:"face_shape" yaml:"face_shape"`

	// BoneStructure describes the underlying facial bone structure.
	BoneStructure BoneStructureCategory `json:"bone_structure" yaml:"bone_structure"`

	// Jawline describes the jawline shape and definition.
	Jawline JawlineCategory `json:"jawline" yaml:"jawline"`

	// Cheekbones describes cheekbone prominence and position.
	Cheekbones CheekbonesCategory `json:"cheekbones" yaml:"cheekbones"`

	// ========== Eyes ==========

	// EyeShape is the structural category of eye shape.
	EyeShape EyeShapeCategory `json:"eye_shape" yaml:"eye_shape"`

	// EyeColor is the iris color category.
	EyeColor EyeColorCategory `json:"eye_color" yaml:"eye_color"`

	// EyeSpacing describes the distance between the eyes.
	EyeSpacing EyeSpacingCategory `json:"eye_spacing" yaml:"eye_spacing"`

	// EyeSize describes the relative size of the eyes.
	EyeSize EyeSizeCategory `json:"eye_size" yaml:"eye_size"`

	// ========== Nose ==========

	// NoseShape is the structural category of nose shape.
	NoseShape NoseShapeCategory `json:"nose_shape" yaml:"nose_shape"`

	// NoseBridge describes the nose bridge characteristics.
	NoseBridge NoseBridgeCategory `json:"nose_bridge" yaml:"nose_bridge"`

	// NoseTip describes the nose tip characteristics.
	NoseTip NoseTipCategory `json:"nose_tip" yaml:"nose_tip"`

	// ========== Lips ==========

	// LipShape is the structural category of lip shape.
	LipShape LipShapeCategory `json:"lip_shape" yaml:"lip_shape"`

	// LipFullness describes the volume/fullness of the lips.
	LipFullness LipFullnessCategory `json:"lip_fullness" yaml:"lip_fullness"`

	// SmileType describes the characteristic smile pattern.
	SmileType SmileTypeCategory `json:"smile_type" yaml:"smile_type"`

	// ========== Brows ==========

	// BrowShape is the structural category of eyebrow shape.
	BrowShape BrowShapeCategory `json:"brow_shape" yaml:"brow_shape"`

	// BrowThickness describes the thickness/density of the eyebrows.
	BrowThickness BrowThicknessCategory `json:"brow_thickness" yaml:"brow_thickness"`

	// ========== Skin ==========

	// SkinTone is the overall skin tone category.
	SkinTone SkinToneCategory `json:"skin_tone" yaml:"skin_tone"`

	// SkinUndertone is the undertone category (warm, cool, neutral).
	SkinUndertone SkinUndertoneCategory `json:"skin_undertone" yaml:"skin_undertone"`

	// SkinTexture describes the skin texture characteristics.
	SkinTexture SkinTextureCategory `json:"skin_texture" yaml:"skin_texture"`

	// ========== Hair ==========

	// HairColor is the natural hair color category.
	HairColor HairColorCategory `json:"hair_color" yaml:"hair_color"`

	// HairTexture is the natural hair texture category.
	HairTexture HairTextureCategory `json:"hair_texture" yaml:"hair_texture"`

	// HairLength describes the current hair length.
	HairLength HairLengthCategory `json:"hair_length" yaml:"hair_length"`

	// HairThickness describes the hair strand thickness/density.
	HairThickness HairThicknessCategory `json:"hair_thickness" yaml:"hair_thickness"`

	// ========== Unique Features ==========

	// UniqueFeatures contains distinctive facial features.
	// ALLOWED: dimples, cleft chin, widow's peak
	UniqueFeatures []UniqueFeatureCategory `json:"unique_features,omitempty" yaml:"unique_features,omitempty"`
}

// Face shape categories
type FaceShapeCategory string

const (
	FaceShapeOval    FaceShapeCategory = "oval"
	FaceShapeHeart   FaceShapeCategory = "heart"
	FaceShapeSquare  FaceShapeCategory = "square"
	FaceShapeRound   FaceShapeCategory = "round"
	FaceShapeDiamond FaceShapeCategory = "diamond"
	FaceShapeOblong  FaceShapeCategory = "oblong"
)

// Bone structure categories
type BoneStructureCategory string

const (
	BoneStructureDelicate BoneStructureCategory = "delicate"
	BoneStructureModerate BoneStructureCategory = "moderate"
	BoneStructureStrong   BoneStructureCategory = "strong"
)

// Jawline categories
type JawlineCategory string

const (
	JawlineSoft    JawlineCategory = "soft"
	JawlineRounded JawlineCategory = "rounded"
	JawlineDefined JawlineCategory = "defined"
	JawlineAngular JawlineCategory = "angular"
	JawlineSquare  JawlineCategory = "square"
)

// Cheekbones categories
type CheekbonesCategory string

const (
	CheekbonesSubtle    CheekbonesCategory = "subtle"
	CheekbonesModerate  CheekbonesCategory = "moderate"
	CheekbonesProminent CheekbonesCategory = "prominent"
	CheekbonesHigh      CheekbonesCategory = "high"
)

// Eye shape categories
type EyeShapeCategory string

const (
	EyeShapeAlmond     EyeShapeCategory = "almond"
	EyeShapeRound      EyeShapeCategory = "round"
	EyeShapeHooded     EyeShapeCategory = "hooded"
	EyeShapeMonolid    EyeShapeCategory = "monolid"
	EyeShapeUpturned   EyeShapeCategory = "upturned"
	EyeShapeDownturned EyeShapeCategory = "downturned"
	EyeShapeDeepSet    EyeShapeCategory = "deep_set"
)

// Eye color categories
type EyeColorCategory string

const (
	EyeColorDarkBrown EyeColorCategory = "dark_brown"
	EyeColorBrown     EyeColorCategory = "brown"
	EyeColorHazel     EyeColorCategory = "hazel"
	EyeColorAmber     EyeColorCategory = "amber"
	EyeColorGreen     EyeColorCategory = "green"
	EyeColorBlue      EyeColorCategory = "blue"
	EyeColorGray      EyeColorCategory = "gray"
)

// Eye spacing categories
type EyeSpacingCategory string

const (
	EyeSpacingClose   EyeSpacingCategory = "close_set"
	EyeSpacingAverage EyeSpacingCategory = "average"
	EyeSpacingWide    EyeSpacingCategory = "wide_set"
)

// Eye size categories
type EyeSizeCategory string

const (
	EyeSizeSmall   EyeSizeCategory = "small"
	EyeSizeAverage EyeSizeCategory = "average"
	EyeSizeLarge   EyeSizeCategory = "large"
)

// Nose shape categories
type NoseShapeCategory string

const (
	NoseShapeButton   NoseShapeCategory = "button"
	NoseShapeStraight NoseShapeCategory = "straight"
	NoseShapeWide     NoseShapeCategory = "wide"
	NoseShapeRoman    NoseShapeCategory = "roman"
	NoseShapeAquiline NoseShapeCategory = "aquiline"
)

// Nose bridge categories
type NoseBridgeCategory string

const (
	NoseBridgeLow      NoseBridgeCategory = "low"
	NoseBridgeModerate NoseBridgeCategory = "moderate"
	NoseBridgeHigh     NoseBridgeCategory = "high"
	NoseBridgeBumped   NoseBridgeCategory = "bumped"
)

// Nose tip categories
type NoseTipCategory string

const (
	NoseTipRounded  NoseTipCategory = "rounded"
	NoseTipPointed  NoseTipCategory = "pointed"
	NoseTipUpturned NoseTipCategory = "upturned"
	NoseTipBulbous  NoseTipCategory = "bulbous"
)

// Lip shape categories
type LipShapeCategory string

const (
	LipShapeFull    LipShapeCategory = "full"
	LipShapeThin    LipShapeCategory = "thin"
	LipShapeBow     LipShapeCategory = "bow"
	LipShapeRounded LipShapeCategory = "rounded"
	LipShapeWide    LipShapeCategory = "wide"
)

// Lip fullness categories
type LipFullnessCategory string

const (
	LipFullnessSubtle     LipFullnessCategory = "subtle"
	LipFullnessModerate   LipFullnessCategory = "moderate"
	LipFullnessPlump      LipFullnessCategory = "plump"
	LipFullnessVoluptuous LipFullnessCategory = "voluptuous"
)

// Smile type categories
type SmileTypeCategory string

const (
	SmileTypeSubtle     SmileTypeCategory = "subtle"
	SmileTypeBroad      SmileTypeCategory = "broad"
	SmileTypeAsymmetric SmileTypeCategory = "asymmetric"
	SmileTypeGummy      SmileTypeCategory = "gummy"
	SmileTypeClosed     SmileTypeCategory = "closed"
)

// Brow shape categories
type BrowShapeCategory string

const (
	BrowShapeNatural  BrowShapeCategory = "natural"
	BrowShapeArched   BrowShapeCategory = "arched"
	BrowShapeStraight BrowShapeCategory = "straight"
	BrowShapeRounded  BrowShapeCategory = "rounded"
	BrowShapeAngled   BrowShapeCategory = "angled"
)

// Brow thickness categories
type BrowThicknessCategory string

const (
	BrowThicknessThin     BrowThicknessCategory = "thin"
	BrowThicknessNatural  BrowThicknessCategory = "natural"
	BrowThicknessThick    BrowThicknessCategory = "thick"
	BrowThicknessFluffy   BrowThicknessCategory = "fluffy"
	BrowThicknessBleached BrowThicknessCategory = "bleached"
)

// Skin tone categories
type SkinToneCategory string

const (
	SkinToneFair      SkinToneCategory = "fair"
	SkinToneLight     SkinToneCategory = "light"
	SkinToneMedium    SkinToneCategory = "medium"
	SkinToneOlive     SkinToneCategory = "olive"
	SkinToneTan       SkinToneCategory = "tan"
	SkinToneBrown     SkinToneCategory = "brown"
	SkinToneDarkBrown SkinToneCategory = "dark_brown"
	SkinToneDeep      SkinToneCategory = "deep"
)

// Skin undertone categories
type SkinUndertoneCategory string

const (
	SkinUndertoneWarm    SkinUndertoneCategory = "warm"
	SkinUndertoneCool    SkinUndertoneCategory = "cool"
	SkinUndertoneNeutral SkinUndertoneCategory = "neutral"
)

// Skin texture categories
type SkinTextureCategory string

const (
	SkinTextureSmooth   SkinTextureCategory = "smooth"
	SkinTextureNormal   SkinTextureCategory = "normal"
	SkinTextureTextured SkinTextureCategory = "textured"
	SkinTextureMature   SkinTextureCategory = "mature"
)

// Hair color categories
type HairColorCategory string

const (
	HairColorBlack      HairColorCategory = "black"
	HairColorDarkBrown  HairColorCategory = "dark_brown"
	HairColorBrown      HairColorCategory = "brown"
	HairColorLightBrown HairColorCategory = "light_brown"
	HairColorBlonde     HairColorCategory = "blonde"
	HairColorRed        HairColorCategory = "red"
	HairColorAuburn     HairColorCategory = "auburn"
	HairColorGray       HairColorCategory = "gray"
)

// Hair texture categories
type HairTextureCategory string

const (
	HairTextureStraight HairTextureCategory = "straight"
	HairTextureWavy     HairTextureCategory = "wavy"
	HairTextureCurly    HairTextureCategory = "curly"
	HairTextureCoily    HairTextureCategory = "coily"
	HairTextureKinky    HairTextureCategory = "kinky"
)

// Hair length categories
type HairLengthCategory string

const (
	HairLengthPixie    HairLengthCategory = "pixie"
	HairLengthShort    HairLengthCategory = "short"
	HairLengthChin     HairLengthCategory = "chin"
	HairLengthShoulder HairLengthCategory = "shoulder"
	HairLengthMidBack  HairLengthCategory = "mid_back"
	HairLengthLong     HairLengthCategory = "long"
	HairLengthVeryLong HairLengthCategory = "very_long"
)

// Hair thickness categories
type HairThicknessCategory string

const (
	HairThicknessFine   HairThicknessCategory = "fine"
	HairThicknessMedium HairThicknessCategory = "medium"
	HairThicknessThick  HairThicknessCategory = "thick"
)

// Unique feature categories (allowed features only)
type UniqueFeatureCategory string

const (
	UniqueFeatureDimples    UniqueFeatureCategory = "dimples"
	UniqueFeatureCleftChin  UniqueFeatureCategory = "cleft_chin"
	UniqueFeatureWidowsPeak UniqueFeatureCategory = "widows_peak"
)
