package persona

// BodyDNA contains all body specifications for a character.
// These define the physical build and proportions for consistent rendering.
type BodyDNA struct {
	// Height is the descriptive height category.
	Height HeightCategory `json:"height" yaml:"height"`

	// HeightCM is the exact height in centimeters.
	HeightCM int `json:"height_cm" yaml:"height_cm"`

	// Build is the overall body type category.
	Build BodyBuildCategory `json:"build" yaml:"build"`

	// BodyFatPercent is the approximate body fat percentage (for rendering guidance).
	BodyFatPercent int `json:"body_fat_percent" yaml:"body_fat_percent"`

	// MuscleDefinition describes the level of visible muscle definition.
	MuscleDefinition MuscleDefinitionCategory `json:"muscle_definition" yaml:"muscle_definition"`

	// ShoulderWidth describes shoulder width relative to body.
	ShoulderWidth ShoulderWidthCategory `json:"shoulder_width" yaml:"shoulder_width"`

	// HipWidth describes hip width relative to body.
	HipWidth HipWidthCategory `json:"hip_width" yaml:"hip_width"`

	// WHRatio is the waist-to-hip ratio (e.g., 0.7 for hourglass figure).
	WHRatio float64 `json:"wh_ratio" yaml:"wh_ratio"`

	// LegLength describes leg length proportion.
	LegLength LegLengthCategory `json:"leg_length" yaml:"leg_length"`

	// TorsoLength describes torso length proportion.
	TorsoLength TorsoLengthCategory `json:"torso_length" yaml:"torso_length"`

	// BustSize describes bust size for female/feminine characters.
	BustSize BustSizeCategory `json:"bust_size,omitempty" yaml:"bust_size,omitempty"`

	// PostureType describes characteristic posture.
	PostureType PostureCategory `json:"posture_type" yaml:"posture_type"`
}

// Height categories
type HeightCategory string

const (
	HeightPetite   HeightCategory = "petite"    // < 5'2" / 157cm
	HeightShort    HeightCategory = "short"     // 5'2"-5'4" / 157-163cm
	HeightAverage  HeightCategory = "average"   // 5'4"-5'6" / 163-168cm
	HeightTall     HeightCategory = "tall"      // 5'6"-5'9" / 168-175cm
	HeightVeryTall HeightCategory = "very_tall" // > 5'9" / 175cm+
)

// HeightCategoryFromCM returns the height category for a given height in cm.
func HeightCategoryFromCM(cm int) HeightCategory {
	switch {
	case cm < 157:
		return HeightPetite
	case cm < 163:
		return HeightShort
	case cm < 168:
		return HeightAverage
	case cm < 175:
		return HeightTall
	default:
		return HeightVeryTall
	}
}

// Body build categories
type BodyBuildCategory string

const (
	BodyBuildSlender   BodyBuildCategory = "slender"
	BodyBuildAthletic  BodyBuildCategory = "athletic"
	BodyBuildCurvy     BodyBuildCategory = "curvy"
	BodyBuildMuscular  BodyBuildCategory = "muscular"
	BodyBuildAverage   BodyBuildCategory = "average"
	BodyBuildPlusCurvy BodyBuildCategory = "plus_curvy"
	BodyBuildPetite    BodyBuildCategory = "petite"
)

// Muscle definition categories
type MuscleDefinitionCategory string

const (
	MuscleDefinitionNone     MuscleDefinitionCategory = "none"
	MuscleDefinitionSubtle   MuscleDefinitionCategory = "subtle"
	MuscleDefinitionModerate MuscleDefinitionCategory = "moderate"
	MuscleDefinitionDefined  MuscleDefinitionCategory = "defined"
	MuscleDefinitionRipped   MuscleDefinitionCategory = "ripped"
)

// Shoulder width categories
type ShoulderWidthCategory string

const (
	ShoulderWidthNarrow  ShoulderWidthCategory = "narrow"
	ShoulderWidthAverage ShoulderWidthCategory = "average"
	ShoulderWidthBroad   ShoulderWidthCategory = "broad"
)

// Hip width categories
type HipWidthCategory string

const (
	HipWidthNarrow  HipWidthCategory = "narrow"
	HipWidthAverage HipWidthCategory = "average"
	HipWidthWide    HipWidthCategory = "wide"
)

// Leg length categories
type LegLengthCategory string

const (
	LegLengthShort        LegLengthCategory = "short"
	LegLengthProportional LegLengthCategory = "proportional"
	LegLengthLong         LegLengthCategory = "long"
)

// Torso length categories
type TorsoLengthCategory string

const (
	TorsoLengthShort        TorsoLengthCategory = "short"
	TorsoLengthProportional TorsoLengthCategory = "proportional"
	TorsoLengthLong         TorsoLengthCategory = "long"
)

// Bust size categories
type BustSizeCategory string

const (
	BustSizeSmall     BustSizeCategory = "small"
	BustSizeMedium    BustSizeCategory = "medium"
	BustSizeLarge     BustSizeCategory = "large"
	BustSizeVeryLarge BustSizeCategory = "very_large"
)

// Posture categories
type PostureCategory string

const (
	PostureUpright   PostureCategory = "upright"
	PostureRelaxed   PostureCategory = "relaxed"
	PostureConfident PostureCategory = "confident"
	PostureAthletic  PostureCategory = "athletic"
)
