package agent

import (
	"context"
	"errors"
	"github.com/openziti/zrok/agent/agentGrpc"
	"github.com/openziti/zrok/agent/proctree"
	"github.com/openziti/zrok/environment"
	"github.com/sirupsen/logrus"
	"os"
)

func (i *agentGrpcImpl) AccessPrivate(_ context.Context, req *agentGrpc.AccessPrivateRequest) (*agentGrpc.AccessPrivateResponse, error) {
	root, err := environment.LoadRoot()
	if err != nil {
		return nil, err
	}

	if !root.IsEnabled() {
		return nil, errors.New("unable to load environment; did you 'zrok enable'?")
	}

	accCmd := []string{os.Args[0], "access", "private", "--subordinate", "-b", req.BindAddress, req.Token}
	acc := &access{
		token:           req.Token,
		bindAddress:     req.BindAddress,
		responseHeaders: req.ResponseHeaders,
		bootComplete:    make(chan struct{}),
		agent:           i.agent,
	}

	logrus.Infof("executing '%v'", accCmd)

	acc.process, err = proctree.StartChild(acc.tail, accCmd...)
	if err != nil {
		return nil, err
	}

	go acc.monitor()
	<-acc.bootComplete

	if acc.bootErr == nil {
		i.agent.addAccess <- acc
		return &agentGrpc.AccessPrivateResponse{FrontendToken: acc.frontendToken}, nil
	}

	return nil, acc.bootErr
}
