package regionalapi

import (
	"context"
	"fmt"

	"github.com/tidbcloud/pkgv2/bizerr"
)

const (
	logBackupNamePathParam = "log_backup_name"

	enableCRRFPath  = "/cluster-server/api/v1/clusters/{cluster_id}/logbackups/{log_backup_name}:enableCRRF"
	disableCRRFPath = "/cluster-server/api/v1/clusters/{cluster_id}/logbackups/{log_backup_name}:disableCRRF"
	getCRRFPath     = "/cluster-server/api/v1/clusters/{cluster_id}/logbackups/{log_backup_name}:getCRRF"
)

type crrfClient struct {
	regionalCli RegionalClient
}

// NewCRRFFacade returns a CRRFFacade that calls the CRRF daemon API on cluster-server.
func NewCRRFFacade(regionalCli RegionalClient) CRRFFacade {
	return &crrfClient{regionalCli: regionalCli}
}

func (c *crrfClient) EnableCRRF(ctx context.Context, region *Region, req *EnableCRRFRequest) (*CRRFInfo, bizerr.BizError) {
	pathParams := c.crrfPathParams(req.ClusterId, req.LogBackupName)
	var resp CRRFInfo
	if err := c.regionalCli.Post(ctx, region, enableCRRFPath, pathParams, nil, req, &resp); err != nil {
		return nil, err
	}
	return &resp, nil
}

func (c *crrfClient) DisableCRRF(ctx context.Context, region *Region, req *DisableCRRFRequest) (*CRRFInfo, bizerr.BizError) {
	pathParams := c.crrfPathParams(req.ClusterId, req.LogBackupName)
	var resp CRRFInfo
	if err := c.regionalCli.Post(ctx, region, disableCRRFPath, pathParams, nil, req, &resp); err != nil {
		return nil, err
	}
	return &resp, nil
}

func (c *crrfClient) GetCRRF(ctx context.Context, region *Region, req *GetCRRFRequest) (*CRRFInfo, bizerr.BizError) {
	pathParams := c.crrfPathParams(req.ClusterId, req.LogBackupName)
	var resp CRRFInfo
	if err := c.regionalCli.Get(ctx, region, getCRRFPath, pathParams, nil, &resp); err != nil {
		return nil, err
	}
	return &resp, nil
}

func (c *crrfClient) crrfPathParams(clusterID, logBackupName string) map[string]string {
	return map[string]string{
		clusterIDPathParam:     clusterID,
		logBackupNamePathParam: logBackupName,
	}
}

// CRRFDaemonID returns the stable CRRF daemon ID for a given CRRFSetting row ID.
// This is used as the crrf_id in EnableCRRF/DisableCRRF requests so both
// the enable and disable DAG steps can derive the same ID independently.
func CRRFDaemonID(crrfSettingID uint64) string {
	return fmt.Sprintf("crrf-%d", crrfSettingID)
}
