//nolint
package headscale

import (
	"context"

	apiV1 "github.com/juanfont/headscale/gen/go/headscale/v1"
)

type headscaleV1APIServer struct { // apiV1.HeadscaleServiceServer
	apiV1.UnimplementedHeadscaleServiceServer
	h *Headscale
}

func newHeadscaleV1APIServer(h *Headscale) apiV1.HeadscaleServiceServer {
	return headscaleV1APIServer{
		h: h,
	}
}

func (api headscaleV1APIServer) GetMachine(
	ctx context.Context,
	request *apiV1.GetMachineRequest,
) (*apiV1.GetMachineResponse, error) {
	// m, err := api.h.GetMachineByID(request.MachineId)
	// if err != nil {
	// 	return nil, err
	// }

	// TODO(kradalby): Make this function actually do something
	return &apiV1.GetMachineResponse{Name: "test"}, nil
}

func (api headscaleV1APIServer) CreateNamespace(
	ctx context.Context,
	request *apiV1.CreateNamespaceRequest,
) (*apiV1.CreateNamespaceResponse, error) {
	namespace, err := api.h.CreateNamespace(request.Name)
	if err != nil {
		return nil, err
	}

	return &apiV1.CreateNamespaceResponse{Name: namespace.Name}, nil
}

func (api headscaleV1APIServer) DeleteNamespace(
	ctx context.Context,
	request *apiV1.DeleteNamespaceRequest,
) (*apiV1.DeleteNamespaceResponse, error) {
	err := api.h.DestroyNamespace(request.Name)
	if err != nil {
		return nil, err
	}

	return &apiV1.DeleteNamespaceResponse{}, nil
}

func (api headscaleV1APIServer) ListNamespaces(
	ctx context.Context,
	request *apiV1.ListNamespacesRequest,
) (*apiV1.ListNamespacesResponse, error) {
	namespaces, err := api.h.ListNamespaces()
	if err != nil {
		return nil, err
	}

	response := make([]string, len(*namespaces))
	for index, namespace := range *namespaces {
		response[index] = namespace.Name
	}

	return &apiV1.ListNamespacesResponse{Namespaces: response}, nil
}

func (api headscaleV1APIServer) mustEmbedUnimplementedHeadscaleServiceServer() {}