package clustergateway

import (
	"bytes"
	"context"
	"encoding/json"
	"errors"
	"net/http"

	"github.com/go-resty/resty/v2"
	"github.com/tidbcloud/cluster-service-ng/domain/entity"
)

// ErrRuVersionNotSupported is returned when PD does not support the ru_version API (HTTP 404).
var ErrRuVersionNotSupported = errors.New("PD does not support ru_version API (404)")

func (c *clusterGatewayImpl) SetKeySpaceResourceGroup(ctx context.Context, sharedPool *entity.SharedPool, keySpace string, req *RCURequest) error {
	buf := bytes.NewBuffer(nil)
	err := json.NewEncoder(buf).Encode(req)
	if err != nil {
		return err
	}
	resp, err := c.callClusterProxy(ctx, sharedPool, http.MethodPost, operationMap["SetKeySpaceResourceGroup"], func(request *resty.Request) *resty.Request {
		request.SetPathParam(sharedPoolIdParameter, sharedPool.GetId())
		request.SetPathParam(keySpaceParameter, keySpace)
		request.SetBody(
			buf,
		)
		return request
	})
	if err != nil {
		if resp != nil && resp.StatusCode() == http.StatusConflict {
			return nil
		}

		return err
	}

	return nil
}

func (c *clusterGatewayImpl) SetKeySpaceRuVersion(ctx context.Context, sharedPool *entity.SharedPool, keySpace string, req *SetKeyspaceRuVersionRequest) error {
	buf := bytes.NewBuffer(nil)
	err := json.NewEncoder(buf).Encode(req)
	if err != nil {
		return err
	}
	resp, err := c.callClusterProxy(ctx, sharedPool, http.MethodPost, operationMap["SetKeySpaceRuVersion"], func(request *resty.Request) *resty.Request {
		request.SetPathParam(sharedPoolIdParameter, sharedPool.GetId())
		request.SetPathParam(keySpaceParameter, keySpace)
		request.SetBody(buf)
		return request
	})
	if err != nil {
		if resp != nil && resp.StatusCode() == http.StatusNotFound {
			return ErrRuVersionNotSupported
		}
		return err
	}
	return nil
}
