package agent

import (
	"context"

	storeagent "github.com/tidbcloud/AgentTeam/internal/store/agent"
	"github.com/tidbcloud/AgentTeam/internal/store/team"
)

type teamStoreAdapter struct{ store *team.Store }

func newAgentTeamStore(store *team.Store) AgentTeamStore {
	if store == nil {
		return nil
	}
	return teamStoreAdapter{store: store}
}

func (adapter teamStoreAdapter) ListTeamsForAgent(
	ctx context.Context,
	principal storeagent.AuthenticatedAgent,
	options AgentTeamListOptions,
) (AgentTeamListPage, error) {
	page, err := adapter.store.ListTeamsForAgentPage(ctx, principal, team.AgentTeamListOptions{
		Query: options.Query, Limit: options.Limit, CursorName: options.CursorName,
		CursorHandle: options.CursorHandle, CursorTeamID: options.CursorTeamID,
	})
	if err != nil {
		return AgentTeamListPage{}, err
	}
	result := make([]AgentTeamSummary, 0, len(page.Teams))
	for _, item := range page.Teams {
		result = append(result, AgentTeamSummary{
			TeamID: item.ID, Handle: item.Handle, DisplayName: item.DisplayName,
			Description: item.Description, Role: item.Role,
		})
	}
	return AgentTeamListPage{Teams: result, HasMore: page.HasMore}, nil
}

func (adapter teamStoreAdapter) GetTeamForAgent(
	ctx context.Context,
	principal storeagent.AuthenticatedAgent,
	teamID string,
) (AgentTeamDetail, error) {
	loaded, members, err := adapter.store.GetTeamForAgent(ctx, principal, teamID)
	if err != nil {
		return AgentTeamDetail{}, err
	}
	result := AgentTeamDetail{
		TeamID: loaded.ID, Handle: loaded.Handle, DisplayName: loaded.DisplayName,
		Description: loaded.Description,
		Members:     make([]AgentTeamMember, 0, len(members)),
	}
	for _, view := range members {
		result.Members = append(result.Members, AgentTeamMember{
			TeamMemberID: view.Member.ID,
			AgentID:      firstNonEmpty(view.ActorProfile.PrincipalID, view.Member.ActorID),
			DisplayName:  firstNonEmpty(view.ActorProfile.DisplayName, view.Member.ActorID),
			RoleLabel:    view.Member.RoleLabel, RoleOverlayPrompt: view.Member.RoleOverlayPrompt,
			WakeOnTeamMention: view.Member.WakeOnTeamMention,
		})
	}
	return result, nil
}
