package ds_client

import (
	"net/http"
	"time"

	"github.com/go-resty/resty/v2"
	"github.com/tidbcloud/auto-deploy/internal/utils"
)

type DataServiceClient struct {
	client *resty.Client
}

type Response struct {
	Data Data   `json:"data"`
	Type string `json:"type"`
}

type Data struct {
	Columns []Column            `json:"columns"`
	Rows    []map[string]string `json:"rows"`
	Result  Result              `json:"result"`
}

type Column struct {
	Col      string `json:"col"`
	DataType string `json:"data_type"`
	Nullable bool   `json:"nullable"`
}
type Result struct {
	Code      int    `json:"code"`
	Message   string `json:"message"`
	StartAt   int    `json:"start_ms"`
	EndAt     int    `json:"end_ms"`
	Latency   string `json:"latency"`
	RowCount  int    `json:"row_count"`
	RowAffect int    `json:"row_affect"`
	Limit     int    `json:"limit"`
}

const DEFAULT_TIMEOUT = time.Second * 1000

func NewDataServiceClient(publicKey, privateKey string, timeout time.Duration, debug bool) *DataServiceClient {
	baseUrl := "https://us-west-2.data.tidbcloud.com"
	client := &DataServiceClient{
		client: resty.NewWithClient(&http.Client{
			Timeout:   timeout,
			Transport: http.DefaultTransport,
		}),
	}
	client.client.Debug = debug
	client.client.SetBaseURL(baseUrl)
	client.client.SetAuthScheme("Digest")
	client.client.SetDigestAuth(publicKey, privateKey)
	utils.MaskSensitiveGithubOutput(privateKey)
	return client
}

func (c *DataServiceClient) Get(url string, query map[string]string, response *Response) error {
	_, err := c.client.NewRequest().SetResult(&response).SetQueryParams(query).Get(url)
	return err
}

func (c *DataServiceClient) Post(url string, query map[string]string, body map[string]any, response *Response) error {
	_, err := c.client.NewRequest().SetHeader("Content-Type", "application/json").
		SetResult(&response).SetQueryParams(query).SetBody(body).Post(url)
	return err
}

func (c *DataServiceClient) Put(url string, query map[string]string, body map[string]any, response *Response) error {
	_, err := c.client.NewRequest().SetHeader("Content-Type", "application/json").
		SetResult(&response).SetQueryParams(query).SetBody(body).Put(url)
	return err
}

func (c *DataServiceClient) Delete(url string, query map[string]string, response *Response) error {
	_, err := c.client.NewRequest().SetQueryParams(query).SetResult(&response).Delete(url)
	return err
}
