package exec

import (
	"encoding/base64"
	"encoding/json"
	"strings"

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

const agentListCursorVersion = 2

type agentListCursor struct {
	Version  int    `json:"v"`
	Revision string `json:"r"`
	Query    string `json:"q,omitempty"`
	AgentID  string `json:"id"`
}

func encodeAgentListCursor(revision, query, agentID string) string {
	payload, _ := json.Marshal(agentListCursor{
		Version:  agentListCursorVersion,
		Revision: strings.TrimSpace(revision),
		Query:    strings.ToLower(strings.TrimSpace(query)),
		AgentID:  strings.TrimSpace(agentID),
	})
	return "a2." + base64.RawURLEncoding.EncodeToString(payload)
}

func decodeAgentListCursor(raw, query string) (agentListCursor, error) {
	raw = strings.TrimSpace(raw)
	if raw == "" {
		return agentListCursor{}, nil
	}
	if !strings.HasPrefix(raw, "a2.") || len(raw) > 512 {
		return agentListCursor{}, agent.NewPageError(agent.PageErrorMalformed, "invalid agent list cursor")
	}
	encoded := strings.TrimPrefix(raw, "a2.")
	payload, err := base64.RawURLEncoding.DecodeString(encoded)
	if err != nil || len(payload) == 0 || len(payload) > 384 {
		return agentListCursor{}, agent.NewPageError(agent.PageErrorMalformed, "invalid agent list cursor")
	}
	var cursor agentListCursor
	if err := json.Unmarshal(payload, &cursor); err != nil ||
		cursor.Version != agentListCursorVersion ||
		strings.TrimSpace(cursor.Revision) == "" ||
		strings.TrimSpace(cursor.AgentID) == "" {
		return agentListCursor{}, agent.NewPageError(agent.PageErrorMalformed, "invalid agent list cursor")
	}
	if cursor.Query != strings.ToLower(strings.TrimSpace(query)) {
		return agentListCursor{}, agent.NewPageError(agent.PageErrorQueryMismatch, "agent list cursor does not match query")
	}
	return cursor, nil
}
