package agent

import (
	"context"
	"encoding/json"
	"fmt"
	"github.com/pingcap/errors"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
	"net/http"
	"tcidm/internal/entity"
)

// @Time    : 2024/8/27 15:13
// @Author  : lvhongmeng

const ImportHeader = "X-Lightning-Addr"

type ImportClient struct {
	*AgentClient
	importAddress string
}

func GetImportClient(ctx context.Context, dataflowAgentUrl, ns, serviceName string) (*ImportClient, error) {
	clientInit, err := GetAgentClient(ctx, dataflowAgentUrl)
	if err != nil {
		tilog.Error(ctx, "GetAgentClient Failed", zap.Error(err))
	}

	importAddress := fmt.Sprintf("https://%s.%s.svc.cluster.local:8289", serviceName, ns)
	tilog.Info(ctx, "GetImportClient", zap.String("importAddress", importAddress))

	// copy and config client
	agentClient := *clientInit
	agentClient.Client = clientInit.Client.Clone()

	return &ImportClient{
		AgentClient:   &agentClient,
		importAddress: importAddress,
	}, nil
}

func (c *ImportClient) GetTaskProgress(ctx context.Context) (*entity.TaskProgress, error) {
	path := "progress/task"
	respBytes, err := c.requestImport(ctx, http.MethodGet, path, nil)
	if err != nil {
		return nil, err
	}

	resp := new(entity.TaskProgress)
	if err = json.Unmarshal(respBytes, resp); err != nil {
		return nil, errors.Trace(err)
	}
	return resp, nil
}

func (c *ImportClient) requestImport(ctx context.Context, method, path string, body any) ([]byte, error) {
	targetURL := fmt.Sprintf("%s://%s/proxy/lightning/%s", c.getSchema(), c.BaseURL, path)
	extraHeaders := map[string]string{
		ImportHeader: c.importAddress,
	}
	tilog.Info(ctx, "[for regional data plane] requestImport targetURL", zap.String("targetURL", targetURL))
	return c.getResponseWithHeader(ctx, method, targetURL, body, extraHeaders, defaultErrorUnwrapper)
}
