package resourcepool

import (
	clusterngv1beta "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func tikvRemoteWorkersToRegional(
	workers []globalngv1.ComponentType,
) ([]clusterngv1beta.ComponentType, bizerr.BizError) {
	if len(workers) == 0 {
		return nil, nil
	}

	// Keep global scoped to transport concerns: reject ambiguous input and
	// translate the public enum to CSNG's enum. CSNG owns the semantic rules,
	// such as required worker combinations, supported capacity modes, defaults,
	// and user-facing validation messages.
	seen := make(map[globalngv1.ComponentType]struct{}, len(workers))
	result := make([]clusterngv1beta.ComponentType, 0, len(workers))
	for _, worker := range workers {
		if _, ok := seen[worker]; ok {
			return nil, bizerr.New(bizerr.ErrCodeParams, "duplicate enabled_tikv_remote_workers: %s", worker)
		}
		seen[worker] = struct{}{}

		regionalWorker, err := tikvRemoteWorkerToRegional(worker)
		if err != nil {
			return nil, err
		}
		result = append(result, regionalWorker)
	}

	return result, nil
}

func tikvRemoteWorkerToRegional(
	worker globalngv1.ComponentType,
) (clusterngv1beta.ComponentType, bizerr.BizError) {
	switch worker {
	case globalngv1.ComponentType_TIKV_WORKER:
		return clusterngv1beta.ComponentType_TIKV_WORKER, nil
	case globalngv1.ComponentType_COPROCESSOR_WORKER:
		return clusterngv1beta.ComponentType_COPROCESSOR_WORKER, nil
	default:
		return clusterngv1beta.ComponentType_COMPONENT_TYPE_UNSPECIFIED,
			bizerr.New(bizerr.ErrCodeParams, "unsupported enabled_tikv_remote_workers: %s", worker)
	}
}

func tikvRemoteWorkersFromRegional(
	workers []clusterngv1beta.ComponentType,
) ([]globalngv1.ComponentType, bizerr.BizError) {
	if len(workers) == 0 {
		return nil, nil
	}

	result := make([]globalngv1.ComponentType, 0, len(workers))
	for _, worker := range workers {
		globalWorker, err := tikvRemoteWorkerFromRegional(worker)
		if err != nil {
			return nil, err
		}
		result = append(result, globalWorker)
	}

	return result, nil
}

func tikvRemoteWorkerFromRegional(
	worker clusterngv1beta.ComponentType,
) (globalngv1.ComponentType, bizerr.BizError) {
	switch worker {
	case clusterngv1beta.ComponentType_TIKV_WORKER:
		return globalngv1.ComponentType_TIKV_WORKER, nil
	case clusterngv1beta.ComponentType_COPROCESSOR_WORKER:
		return globalngv1.ComponentType_COPROCESSOR_WORKER, nil
	default:
		return globalngv1.ComponentType_COMPONENT_TYPE_UNSPECIFIED,
			bizerr.New(bizerr.ErrCodeParams, "unsupported regional enabled_tikv_remote_workers: %s", worker)
	}
}
