package agent

import (
	"context"
	"fmt"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/core/secrets"
	"github.com/tidbcloud/AgentTeam/internal/coredb"
	"github.com/tidbcloud/AgentTeam/internal/store/storeerr"
)

// MemberIDForAgentAuthToken resolves the agent member id for a bearer token.
//
// The upstream daemon uses the agent auth token not only for the workspace-scoped Agent Runtime API,
// but also when downloading attachments from `/api/v1/workspaces/:workspaceId/attachments/:id`.
func (service *Service) MemberIDForAgentAuthToken(ctx context.Context, bearerToken string) (string, error) {
	trimmedToken := strings.TrimSpace(bearerToken)
	if trimmedToken == "" {
		return "", storeerr.ErrUnauthorized
	}

	tokenHash := secrets.HashToken(trimmedToken)
	row := service.db.QueryRow(ctx, `
SELECT a.member_id
FROM agents a
JOIN machines mac
  ON mac.workspace_id = a.workspace_id
 AND mac.id = a.machine_id
WHERE a.auth_token_hash = $1
  AND a.status <> 'archived'
  AND mac.status = 'active'
`, tokenHash)

	var memberID string
	if err := row.Scan(&memberID); err != nil {
		if coredb.IsNotFound(err) {
			return "", storeerr.ErrUnauthorized
		}
		return "", fmt.Errorf("resolve agent member token: %w", err)
	}

	trimmedMemberID := strings.TrimSpace(memberID)
	if trimmedMemberID == "" {
		return "", fmt.Errorf("invalid agent member id")
	}
	return trimmedMemberID, nil
}

// UpdateAgentAvatarURL updates the avatar_url for an agent.
func (service *Service) UpdateAgentAvatarURL(ctx context.Context, workspaceID string, agentID string, avatarURL string) error {
	trimmed := strings.TrimSpace(avatarURL)
	var value *string
	if trimmed != "" {
		value = &trimmed
	}
	_, err := service.db.Exec(ctx, `
UPDATE agents SET avatar_url = $3, updated_at = NOW()
WHERE workspace_id = $1 AND id = $2
`, workspaceID, agentID, value)
	if err != nil {
		return fmt.Errorf("update agent avatar: %w", err)
	}
	return nil
}
