package persona

// Lifestyle contains the persona's interests, fashion sense, and vacation style.
// Generated in Stage 3 of the specgen pipeline using identity and psychology as inputs.
type Lifestyle struct {
	// Interests captures the persona's hobbies and passions.
	Interests Interests `json:"interests" yaml:"interests"`

	// FashionSense describes the persona's clothing style preferences.
	FashionSense FashionSense `json:"fashion_sense" yaml:"fashion_sense"`

	// VacationStyle describes travel preferences.
	VacationStyle VacationStyle `json:"vacation_style" yaml:"vacation_style"`
}

// Interests captures a persona's hobbies and passions across 5 categories.
type Interests struct {
	// Creative interests: art, music, writing, photography, etc.
	Creative []string `json:"creative" yaml:"creative"`

	// Active interests: sports, fitness, dance, hiking, etc.
	Active []string `json:"active" yaml:"active"`

	// Social interests: dining, travel, nightlife, community, etc.
	Social []string `json:"social" yaml:"social"`

	// Intellectual interests: books, philosophy, science, tech, etc.
	Intellectual []string `json:"intellectual" yaml:"intellectual"`

	// Lifestyle interests: cooking, gardening, home decor, wellness, etc.
	Lifestyle []string `json:"lifestyle" yaml:"lifestyle"`
}

// FashionSense describes a persona's clothing style.
type FashionSense struct {
	// Primary is the dominant fashion context name.
	Primary FashionContextName `json:"primary" yaml:"primary"`

	// Secondary is a secondary style influence (optional).
	Secondary FashionContextName `json:"secondary,omitempty" yaml:"secondary,omitempty"`

	// SignatureDetails are specific personal styling touches (e.g., "always wears gold hoops").
	SignatureDetails []string `json:"signature_details,omitempty" yaml:"signature_details,omitempty"`
}

// VacationStyle describes a persona's travel preferences.
type VacationStyle struct {
	// Primary is the dominant vacation type: "beach", "city", "adventure", "luxury", "cultural".
	Primary string `json:"primary" yaml:"primary"`

	// Activities are preferred vacation activities.
	Activities []string `json:"activities,omitempty" yaml:"activities,omitempty"`

	// DreamDestinations are top travel destinations.
	DreamDestinations []string `json:"dream_destinations,omitempty" yaml:"dream_destinations,omitempty"`
}

// FashionContextName identifies one of the 15 defined fashion contexts.
type FashionContextName string

const (
	FashionClassicMinimalist FashionContextName = "classic_minimalist"
	FashionStreetwearChic    FashionContextName = "streetwear_chic"
	FashionBohemianSpirit    FashionContextName = "bohemian_free_spirit"
	FashionAthleisurePro     FashionContextName = "athleisure_pro"
	FashionBusinessCasual    FashionContextName = "business_casual"
	FashionRomanticFeminine  FashionContextName = "romantic_feminine"
	FashionEdgyAlternative   FashionContextName = "edgy_alternative"
	FashionCoastalCasual     FashionContextName = "coastal_casual"
	FashionUrbanProfessional FashionContextName = "urban_professional"
	FashionFestivalGlam      FashionContextName = "festival_glam"
	FashionPreppyClassic     FashionContextName = "preppy_classic"
	FashionDarkAcademia      FashionContextName = "dark_academia"
	FashionCottagecore       FashionContextName = "cottagecore"
	FashionY2KRevival        FashionContextName = "y2k_revival"
	FashionLuxeLoungewear    FashionContextName = "luxe_loungewear"
)

// FashionContext describes a named fashion style with styling details.
type FashionContext struct {
	// Name is the canonical identifier.
	Name FashionContextName `json:"name" yaml:"name"`

	// Description is a one-line style summary.
	Description string `json:"description" yaml:"description"`

	// KeyPieces are the defining wardrobe items.
	KeyPieces []string `json:"key_pieces" yaml:"key_pieces"`

	// Brands are representative brands for this aesthetic.
	Brands []string `json:"brands" yaml:"brands"`

	// Silhouette describes the overall shape/fit profile.
	Silhouette string `json:"silhouette" yaml:"silhouette"`
}

// AllFashionContexts returns the catalog of all 15 defined fashion contexts.
func AllFashionContexts() []FashionContext {
	return []FashionContext{
		{
			Name:        FashionClassicMinimalist,
			Description: "Clean lines, neutral palette, and timeless silhouettes",
			KeyPieces:   []string{"crisp white shirt", "tailored trousers", "structured blazer", "minimal gold jewelry"},
			Brands:      []string{"COS", "Everlane", "The Row", "A.P.C."},
			Silhouette:  "slim, structured, minimal layering",
		},
		{
			Name:        FashionStreetwearChic,
			Description: "Urban-influenced with oversized fits, sneakers, and bold logos",
			KeyPieces:   []string{"oversized hoodie", "cargo pants", "chunky sneakers", "bucket hat"},
			Brands:      []string{"Off-White", "Supreme", "Stüssy", "PANGAIA"},
			Silhouette:  "oversized tops, tapered or wide bottoms",
		},
		{
			Name:        FashionBohemianSpirit,
			Description: "Free-flowing fabrics, earthy tones, and global-inspired prints",
			KeyPieces:   []string{"flowy maxi dress", "embroidered blouse", "woven bag", "layered necklaces"},
			Brands:      []string{"Free People", "Spell", "Anthropologie", "Zimmermann"},
			Silhouette:  "loose, flowing, layered",
		},
		{
			Name:        FashionAthleisurePro,
			Description: "Performance fabrics worn stylishly beyond the gym",
			KeyPieces:   []string{"seamless leggings", "sports bra", "zip-up hoodie", "white sneakers"},
			Brands:      []string{"Lululemon", "Alo Yoga", "Gymshark", "Vuori"},
			Silhouette:  "form-fitting, streamlined",
		},
		{
			Name:        FashionBusinessCasual,
			Description: "Polished and professional with approachable comfort",
			KeyPieces:   []string{"fitted blazer", "straight-leg trousers", "silk blouse", "loafers"},
			Brands:      []string{"Banana Republic", "Theory", "J.Crew", "& Other Stories"},
			Silhouette:  "tailored, clean lines, moderate coverage",
		},
		{
			Name:        FashionRomanticFeminine,
			Description: "Soft, delicate pieces with florals, lace, and pastel tones",
			KeyPieces:   []string{"floral midi dress", "lace cami", "ballet flats", "pearl accessories"},
			Brands:      []string{"Reformation", "Loveshackfancy", "Hill House Home", "Rixo"},
			Silhouette:  "fitted bodice with full or flowy skirts",
		},
		{
			Name:        FashionEdgyAlternative,
			Description: "Dark palette, punk and rock influences, leather and hardware",
			KeyPieces:   []string{"leather jacket", "black skinny jeans", "combat boots", "silver chain jewelry"},
			Brands:      []string{"AllSaints", "Saint Laurent", "Helmut Lang", "Rick Owens"},
			Silhouette:  "slim, angular, layered with hardware",
		},
		{
			Name:        FashionCoastalCasual,
			Description: "Relaxed, sun-kissed looks inspired by beach and ocean lifestyles",
			KeyPieces:   []string{"linen shorts", "striped tee", "espadrilles", "canvas tote"},
			Brands:      []string{"Outerknown", "Marine Layer", "Vilebrequin", "Solid & Striped"},
			Silhouette:  "relaxed, breezy, effortless",
		},
		{
			Name:        FashionUrbanProfessional,
			Description: "Sharp city-dweller style blending fashion and function",
			KeyPieces:   []string{"tailored coat", "ankle boots", "structured handbag", "monochrome sets"},
			Brands:      []string{"Toteme", "Cos", "Sandro", "BOSS"},
			Silhouette:  "sleek, polished, statement outerwear",
		},
		{
			Name:        FashionFestivalGlam,
			Description: "Bold prints, glitter, and maximalist looks built for events",
			KeyPieces:   []string{"crop top with sequins", "fringe jacket", "platform sandals", "body chains"},
			Brands:      []string{"House of CB", "PrettyLittleThing", "Fashion Nova", "Nasty Gal"},
			Silhouette:  "skin-baring, layered accessories, high visual impact",
		},
		{
			Name:        FashionPreppyClassic,
			Description: "Collegiate-inspired clean aesthetics with a polished finish",
			KeyPieces:   []string{"polo shirt", "chino trousers", "boat shoes", "cable-knit sweater"},
			Brands:      []string{"Ralph Lauren", "Brooks Brothers", "Tommy Hilfiger", "Lacoste"},
			Silhouette:  "classic proportions, clean and put-together",
		},
		{
			Name:        FashionDarkAcademia,
			Description: "Literary and scholarly aesthetic with earth tones and vintage pieces",
			KeyPieces:   []string{"tweed blazer", "turtleneck", "pleated skirt", "oxford shoes"},
			Brands:      []string{"Cordera", "Mango", "H&M Studio", "Massimo Dutti"},
			Silhouette:  "layered, traditional, intellectual",
		},
		{
			Name:        FashionCottagecore,
			Description: "Pastoral romanticism with floral prints, ruffles, and natural textures",
			KeyPieces:   []string{"prairie dress", "puff-sleeve blouse", "wicker bag", "mary jane shoes"},
			Brands:      []string{"Doen", "For Love & Lemons", "Batsheva", "Emilia Wickstead"},
			Silhouette:  "loose, romantic, tiered or smocked",
		},
		{
			Name:        FashionY2KRevival,
			Description: "Early 2000s nostalgia with low-rise, butterfly prints, and metallics",
			KeyPieces:   []string{"low-rise jeans", "halter top", "platform boots", "mini bag"},
			Brands:      []string{"Blumarine", "Diesel", "Juicy Couture", "Paris Hilton Collection"},
			Silhouette:  "crop tops with low-rise bottoms, skin-baring midriff",
		},
		{
			Name:        FashionLuxeLoungewear,
			Description: "Elevated comfort dressing in premium fabrics and tonal sets",
			KeyPieces:   []string{"cashmere loungewear set", "silk slip", "fuzzy slides", "oversized cashmere cardigan"},
			Brands:      []string{"Skims", "Eberjey", "Brunello Cucinelli", "Leset"},
			Silhouette:  "relaxed but polished, tonal and monochromatic",
		},
	}
}

// FashionContextFor returns the FashionContext definition for the given name.
// Returns a zero-value FashionContext if the name is not found.
func FashionContextFor(name FashionContextName) FashionContext {
	for _, fc := range AllFashionContexts() {
		if fc.Name == name {
			return fc
		}
	}
	return FashionContext{}
}

// AllFashionContextNames returns all 15 fashion context names.
func AllFashionContextNames() []FashionContextName {
	all := AllFashionContexts()
	names := make([]FashionContextName, len(all))
	for i, fc := range all {
		names[i] = fc.Name
	}
	return names
}
