// Package personality defines pure types for agent personality and behavior.
package personality

type Tone string

const (
	ToneDirect    Tone = "direct"
	ToneFriendly  Tone = "friendly"
	ToneFormal    Tone = "formal"
	ToneCasual    Tone = "casual"
	ToneTechnical Tone = "technical"
)

type Verbosity string

const (
	VerbosityMinimal  Verbosity = "minimal"
	VerbosityConcise  Verbosity = "concise"
	VerbosityDetailed Verbosity = "detailed"
	VerbosityVerbose  Verbosity = "verbose"
)

type EmojiStyle string

const (
	EmojiNone     EmojiStyle = "none"
	EmojiMinimal  EmojiStyle = "minimal"
	EmojiModerate EmojiStyle = "moderate"
	EmojiHeavy    EmojiStyle = "heavy"
)

type ErrorStyle string

const (
	ErrorTerse   ErrorStyle = "terse"
	ErrorHelpful ErrorStyle = "helpful"
	ErrorDetailed ErrorStyle = "detailed"
)

type Formality string

const (
	FormalityFormal     Formality = "formal"
	FormalitySemiformal Formality = "semiformal"
	FormalityCasual     Formality = "casual"
	FormalityColoquial  Formality = "coloquial"
)

type Humor string

const (
	HumorNone     Humor = "none"
	HumorSubtle   Humor = "subtle"
	HumorModerate Humor = "moderate"
	HumorFrequent Humor = "frequent"
)

type PersonalityType string

const (
	PersonalityAnalytical PersonalityType = "analytical"
	PersonalityCreative   PersonalityType = "creative"
	PersonalityPragmatic  PersonalityType = "pragmatic"
	PersonalityEmpathetic PersonalityType = "empathetic"
	PersonalityAssertive  PersonalityType = "assertive"
)

type ResponseStyle string

const (
	ResponseStructured      ResponseStyle = "structured"
	ResponseConversational  ResponseStyle = "conversational"
	ResponseBulletPoints    ResponseStyle = "bullet_points"
	ResponseNarrative       ResponseStyle = "narrative"
)

type Templates struct {
	Greeting         string
	UnknownCommand   string
	PermissionDenied string
	Error            string
	Success          string
	Busy             string
}

type Behavior struct {
	Proactive         bool
	AskConfirmation   bool
	ShowReasoning     bool
	ThreadReplies     bool
	TypingIndicator   bool
	AcknowledgeReceipt bool
}

type Communication struct {
	Formality     Formality
	Humor         Humor
	Personality   PersonalityType
	ResponseStyle ResponseStyle
	Quirks        []string
	AvoidTopics   []string
	Catchphrases  []string
}

type Personality struct {
	Tone               Tone
	Verbosity          Verbosity
	Language           string
	LanguagesSupported []string
	EmojiStyle         EmojiStyle
	Prefix             string
	ErrorStyle         ErrorStyle
	Templates          Templates
	Behavior           Behavior

	// Identidad narrativa
	Role          string
	Backstory     string
	Expertise     []string
	Limitations   []string

	// Estilo de comunicacion
	Communication Communication

	// Directivas personalizadas
	CustomDirectives []string
}

// DefaultPersonality returns a sensible baseline.
func DefaultPersonality() Personality {
	return Personality{
		Tone:       ToneFriendly,
		Verbosity:  VerbosityConcise,
		Language:   "en",
		EmojiStyle: EmojiMinimal,
		ErrorStyle: ErrorHelpful,
		Templates: Templates{
			Greeting:         "Ready. What do you need?",
			UnknownCommand:   "Unknown command. Use `!help` for available commands.",
			PermissionDenied: "You don't have permission for that.",
			Error:            "Something failed: {{.Error}}",
			Success:          "Done. {{.Summary}}",
			Busy:             "I'm busy with another task. Wait or use `!queue`.",
		},
		Behavior: Behavior{
			AskConfirmation:    true,
			ThreadReplies:      true,
			TypingIndicator:    true,
			AcknowledgeReceipt: true,
		},
	}
}
