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) ([]byte, error) 
	GetKubeconfigSecret(context context.Context,executionId string) ([]byte, error)
	CreateAdmiraltyTarget(context context.Context,executionId string)([]byte,error)
	GetOneNode(context context.Context,executionID string) (*v1.Node, error)
}

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

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