package infrastructure

import (
	"context"
	"errors"
	"oc-datacenter/conf"

	v1 "k8s.io/api/core/v1"
)

type Infrastructure interface {
	CreateNamespace(ctx context.Context, ns string) error
	DeleteNamespace(ctx context.Context, ns string) error
	GenerateToken(ctx context.Context, ns string, duration int) (string, error)
	CreateServiceAccount(ctx context.Context, ns string) error
	CreateRoleBinding(ctx context.Context, ns string, roleBinding string, role string) error
	CreateRole(ctx context.Context, ns string, role string, groups [][]string, resources [][]string, verbs [][]string) error
	GetTargets(ctx context.Context) ([]string, error)
	CreateAdmiraltySource(context context.Context, executionId string) ([]byte, error)
	CreateKubeconfigSecret(context context.Context, kubeconfig string, executionId string, peerId string) ([]byte, error)
	GetKubeconfigSecret(context context.Context, executionId string, peerId string) ([]byte, error)
	CreateAdmiraltyTarget(context context.Context, executionId string, peerId string) ([]byte, error)
	GetOneNode(context context.Context, executionID string, peerId string) (*v1.Node, error)
	CheckHealth() error
}

var _service = map[string]func() (Infrastructure, error){
	"kubernetes": NewKubernetesService,
}

func NewServiceByType(t string) (Infrastructure, error) {
	service, ok := _service[t]
	if !ok {
		return nil, errors.New("service not found")
	}
	return service()
}

func NewService() (Infrastructure, error) {
	service, ok := _service[conf.GetConfig().Mode]
	if !ok {
		return nil, errors.New("service not found")
	}
	return service()
}
