package exec

import (
	"context"
	"fmt"
	"net/url"
	"strconv"
	"strings"

	"github.com/tidbcloud/AgentTeam/desktop/internal/wire/apiclient"
)

type teamRemote struct {
	client  *apiclient.Client
	read    remoteReadTransport
	receipt requestReceiptTransport
}

func (remote teamRemote) readTransport() remoteReadTransport {
	transport := remote.read
	transport.client = remote.client
	return transport
}

func (remote teamRemote) receiptTransport() requestReceiptTransport {
	transport := remote.receipt
	transport.client = remote.client
	return transport
}

func (remote teamRemote) list(ctx context.Context, input teamListInput) (teamListOutput, error) {
	if err := requireRuntimeClient(remote.client); err != nil {
		return teamListOutput{}, err
	}
	values := url.Values{}
	if query := strings.TrimSpace(input.Query); query != "" {
		values.Set("q", query)
	}
	if input.Limit > 0 {
		values.Set("limit", strconv.Itoa(input.Limit))
	}
	if cursor := strings.TrimSpace(input.Cursor); cursor != "" {
		values.Set("cursor", cursor)
	}
	path := remote.client.AgentRuntimePath("/teams")
	if encoded := values.Encode(); encoded != "" {
		path += "?" + encoded
	}
	var result teamListOutput
	if err := remote.readTransport().get(ctx, path, &result); err != nil {
		return teamListOutput{}, err
	}
	if result.Teams == nil {
		result.Teams = []teamListItem{}
	}
	return result, nil
}

func (remote teamRemote) get(ctx context.Context, teamID string) (teamGetOutput, error) {
	if err := requireRuntimeClient(remote.client); err != nil {
		return teamGetOutput{}, err
	}
	teamID = strings.TrimSpace(teamID)
	if teamID == "" {
		return teamGetOutput{}, fmt.Errorf("team get requires a Team id")
	}
	var result teamGetOutput
	err := remote.readTransport().post(
		ctx,
		remote.client.AgentRuntimePath("/teams/get"),
		map[string]string{"teamId": teamID},
		&result,
	)
	return result, err
}

func (remote teamRemote) update(ctx context.Context, teamID string, input teamUpdateRequest) (teamUpdateOutput, error) {
	if err := requireRuntimeClient(remote.client); err != nil {
		return teamUpdateOutput{}, err
	}
	teamID = strings.TrimSpace(teamID)
	if teamID == "" {
		return teamUpdateOutput{}, fmt.Errorf("team update requires a Team id")
	}
	var result teamUpdateOutput
	err := remote.receiptTransport().post(
		ctx,
		remote.client.AgentRuntimePath("/teams/update"),
		input,
		&result,
		replayHeaders(input.RequestID),
	)
	return result, err
}
