package personality

import (
	"fmt"
	"strings"
)

// BuildPersonalityPrompt genera un bloque de system prompt a partir de la personalidad.
// Esta funcion es pura: recibe datos, devuelve string, sin side effects.
func BuildPersonalityPrompt(p Personality) string {
	if isEmpty(p) {
		return ""
	}

	var sb strings.Builder
	sb.WriteString("## Tu personalidad\n\n")

	// Role y backstory
	if p.Role != "" || p.Backstory != "" {
		if p.Backstory != "" {
			sb.WriteString(p.Backstory)
			sb.WriteString("\n\n")
		}
		if p.Role != "" {
			sb.WriteString(fmt.Sprintf("**Rol**: %s.\n", p.Role))
		}
	}

	// Expertise
	if len(p.Expertise) > 0 {
		sb.WriteString(fmt.Sprintf("**Expertise**: %s.\n", strings.Join(p.Expertise, ", ")))
	}

	// Limitations
	if len(p.Limitations) > 0 {
		sb.WriteString(fmt.Sprintf("**Limitaciones**: %s.\n", strings.Join(p.Limitations, ", ")))
	}

	// Communication style
	if !isEmptyCommunication(p.Communication) {
		sb.WriteString("\n**Como te comunicas**:\n")

		if p.Communication.Formality != "" {
			sb.WriteString(fmt.Sprintf("- Formalidad: %s\n", p.Communication.Formality))
		}

		if p.Tone != "" {
			sb.WriteString(fmt.Sprintf("- Tono: %s\n", p.Tone))
		}

		if p.Communication.Humor != "" {
			sb.WriteString(fmt.Sprintf("- Humor: %s\n", p.Communication.Humor))
		}

		if p.Communication.Personality != "" {
			sb.WriteString(fmt.Sprintf("- Personalidad: %s\n", p.Communication.Personality))
		}

		if p.Communication.ResponseStyle != "" {
			sb.WriteString(fmt.Sprintf("- Estilo de respuesta: %s\n", p.Communication.ResponseStyle))
		}

		if p.Verbosity != "" {
			sb.WriteString(fmt.Sprintf("- Verbosidad: %s\n", p.Verbosity))
		}

		if len(p.Communication.Quirks) > 0 {
			sb.WriteString(fmt.Sprintf("- Rasgos unicos: %s\n", strings.Join(p.Communication.Quirks, "; ")))
		}

		if len(p.Communication.AvoidTopics) > 0 {
			sb.WriteString(fmt.Sprintf("- Evitas hablar de: %s\n", strings.Join(p.Communication.AvoidTopics, ", ")))
		}

		if len(p.Communication.Catchphrases) > 0 {
			sb.WriteString(fmt.Sprintf("- Frases tipicas: %s\n", strings.Join(p.Communication.Catchphrases, "; ")))
		}
	}

	// Custom directives
	if len(p.CustomDirectives) > 0 {
		sb.WriteString("\n**Directivas especiales**:\n")
		for _, directive := range p.CustomDirectives {
			sb.WriteString(fmt.Sprintf("- %s\n", directive))
		}
	}

	return sb.String()
}

// isEmpty verifica si la personalidad esta vacia o solo tiene valores por defecto.
func isEmpty(p Personality) bool {
	return p.Role == "" &&
		p.Backstory == "" &&
		len(p.Expertise) == 0 &&
		len(p.Limitations) == 0 &&
		isEmptyCommunication(p.Communication) &&
		len(p.CustomDirectives) == 0
}

// isEmptyCommunication verifica si la seccion de comunicacion esta vacia.
func isEmptyCommunication(c Communication) bool {
	return c.Formality == "" &&
		c.Humor == "" &&
		c.Personality == "" &&
		c.ResponseStyle == "" &&
		len(c.Quirks) == 0 &&
		len(c.AvoidTopics) == 0 &&
		len(c.Catchphrases) == 0
}
