package promptcompiler

import (
	"strings"

	"github.com/tidbcloud/AgentTeam/desktop/internal/types"
)

const (
	promptTeamDescriptionMaxRunes  = 6000
	promptTeamRoleOverlayMaxRunes  = 4000
	promptTeamRosterMaxItems       = 20
	promptTeamRosterDutiesMaxRunes = 1200
)

func formatTeamContextPromptDetails(contexts []types.TeamContext) string {
	if len(contexts) == 0 {
		return ""
	}
	teams := make([]TeamPromptTemplateContext, 0, len(contexts))
	for _, context := range contexts {
		team := TeamPromptTemplateContext{
			Label:       formatTeamContextLabel(context.TeamHandle, context.TeamID),
			ID:          strings.TrimSpace(context.TeamID),
			Description: indentPromptBlock(promptTrimRunes(context.TeamDescription, promptTeamDescriptionMaxRunes), "    "),
			Role:        strings.TrimSpace(context.Role),
			RoleLabel:   strings.TrimSpace(context.RoleLabel),
			Overlay:     indentPromptBlock(promptTrimRunes(context.RoleOverlayPrompt, promptTeamRoleOverlayMaxRunes), "    "),
			Leader:      strings.EqualFold(strings.TrimSpace(context.Role), "leader"),
		}
		limit := len(context.MemberRoster)
		if limit > promptTeamRosterMaxItems {
			limit = promptTeamRosterMaxItems
		}
		team.RosterRemaining = len(context.MemberRoster) - limit
		for _, member := range context.MemberRoster[:limit] {
			label := promptTeamRosterMemberLabel(member)
			if label == "" {
				continue
			}
			team.Roster = append(team.Roster, TeamPromptTemplateMember{
				Label: label, ID: strings.TrimSpace(member.TeamMemberID), Role: strings.TrimSpace(member.Role),
				Duties:    indentPromptBlock(promptTrimRunes(member.RoleOverlayPrompt, promptTeamRosterDutiesMaxRunes), "        "),
				ActorKind: strings.TrimSpace(member.ActorKind), RoleLabel: strings.TrimSpace(member.RoleLabel), ActiveParticipant: member.WakeOnTeamMention, Self: member.Self,
			})
		}
		if strings.EqualFold(strings.TrimSpace(context.Role), "leader") && len(context.MemberRoster) > promptTeamRosterMaxItems {
			hasMissingResponsibility := false
			for _, member := range context.MemberRoster {
				if strings.TrimSpace(member.RoleOverlayPrompt) == "" {
					hasMissingResponsibility = true
					break
				}
			}
			if hasMissingResponsibility {
				for _, member := range context.MemberRoster {
					memberID := strings.TrimSpace(member.TeamMemberID)
					if memberID == "" {
						team.MemberIndex = nil
						break
					}
					team.MemberIndexMembers = append(team.MemberIndexMembers, TeamPromptTemplateMember{ID: memberID, Label: promptTeamRosterMemberLabel(member), Role: strings.TrimSpace(member.Role), RoleLabel: strings.TrimSpace(member.RoleLabel)})
				}
			}
		}
		teams = append(teams, team)
	}
	return renderRegisteredPromptText("event.team_context", newTeamPromptInput(TeamPromptTemplateData{Teams: teams}))
}

func formatTeamContextLabel(handle string, fallback string) string {
	if trimmedHandle := strings.TrimSpace(handle); trimmedHandle != "" {
		return "@" + strings.TrimPrefix(trimmedHandle, "@")
	}
	return strings.TrimSpace(fallback)
}

func promptTeamRosterMemberLabel(member types.TeamRosterMember) string {
	label := firstNonEmptyPromptAuthorValue(member.DisplayName, member.Handle, member.ActorID)
	if handle := strings.TrimSpace(member.Handle); handle != "" {
		label = "@" + strings.TrimPrefix(handle, "@")
		if displayName := strings.TrimSpace(member.DisplayName); displayName != "" && displayName != handle {
			label += " (" + displayName + ")"
		}
	}
	return label
}

func indentPromptBlock(text string, prefix string) string {
	text = strings.TrimSpace(text)
	if text == "" {
		return ""
	}
	lines := strings.Split(text, "\n")
	for i := range lines {
		lines[i] = prefix + strings.TrimRight(lines[i], " \t")
	}
	return strings.Join(lines, "\n")
}
