package gitops

import (
	"github.com/pingcap/errors"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/shared-provider/pkg/types"
)

type ProviderConfigProvider struct{}

var _ ConfigProvider = &ProviderConfigProvider{}

func NewProviderConfigProvider() ConfigProvider {
	return &ProviderConfigProvider{}
}

func (m *ProviderConfigProvider) GetMachineSpec(
	provider *cloudv1.Provider, c cloudv1.ClusterComponent) (*MachineSpec, error) {
	return nil, errors.New("Not Implemented")
}

func (m *ProviderConfigProvider) GetResourceSpec(
	provider *cloudv1.Provider, c cloudv1.ClusterComponent) (*ResourceSpec, error) {
	spec, err := types.SharedProviderSpecForProvider(provider)
	if err != nil {
		return nil, err
	}

	storageClassName := types.DefaultStorageClassName
	if c.GetUseLocalStorage() {
		return nil, errors.New("do not support use local storage")
	}

	componentType := string(c.GetComponentType())

	var component map[string]types.Resource

	switch c.GetComponentType() {
	case cloudv1.ComponentTiDB:
		component = spec.TiDB
	case cloudv1.ComponentPD:
		component = spec.PD
	case cloudv1.ComponentTiKV:
		component = spec.TiKV
	case cloudv1.ComponentTiFlash:
		component = spec.TiFlash
	case cloudv1.ComponentBackup, cloudv1.ComponentRestore, cloudv1.ComponentTiCDC:
		return nil, errors.Errorf("not implemented for type %s", c.GetComponentType())
	default:
		return nil, errors.Errorf("unknown component type %s", c.GetComponentType())
	}

	resources, ok := component[c.GetInstanceType()]
	if !ok {
		return nil, errors.Errorf("no instance type %q for component %q", c.GetInstanceType(), componentType)
	}

	return &ResourceSpec{
		Resources:    resources.ResourceRequirements,
		StorageClass: storageClassName,
	}, nil
}
