package agent

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/go-logr/logr"
)

type JumpPodAgent struct {
	inputDir  string
	outputDir string
	logger    logr.Logger
	k8s       *KubernetesCredStore
	tailscale *TailscaleManager
}

func NewJumpPodAgent(inputDir string, outputDir string, logger logr.Logger) *JumpPodAgent {
	ag := &JumpPodAgent{
		inputDir:  inputDir,
		outputDir: outputDir,
		logger:    logger.WithName("JumpPodAgent"),
	}

	k8sInputDir, k8sOutputDir := ag.KubernetesPath()
	ag.k8s = NewKubernetesCredStore(k8sInputDir, k8sOutputDir, ag.logger)
	ag.tailscale = NewTailscaleManager(ag.logger)
	return ag
}

func (a *JumpPodAgent) Init() error {
	err := os.Mkdir(a.inputDir, 0777)
	if err != nil && !os.IsExist(err) {
		return err
	}

	err = os.Mkdir(a.outputDir, 0777)
	if err != nil && !os.IsExist(err) {
		return err
	}

	err = a.k8s.Init()
	if err != nil {
		return fmt.Errorf("init kubernetes cred store failed: %w", err)
	}

	err = a.tailscale.Init()
	if err != nil {
		return fmt.Errorf("init tailscale manager failed: %w", err)
	}

	return nil
}

func (a *JumpPodAgent) KubernetesCred() *KubernetesCredStore {
	return a.k8s
}

func (a *JumpPodAgent) Tailscale() *TailscaleManager {
	return a.tailscale
}

func (a *JumpPodAgent) KubernetesPath() (string, string) {
	return filepath.Join(a.inputDir, "kube"), filepath.Join(a.outputDir, "kube")
}
