package main

import (
	"strings"
	"sync"

	"github.com/openeuler/Conch/pkg/ulog"
)

type VsockHandler interface {
	HandleMessage(message string) string
	GetSandboxID() string
	SetSandboxID(id string)
}

type VsockHandlerImpl struct {
	mu         sync.Mutex
	sandboxID  string
	version    string
	healthFunc func() bool
}

func NewVsockHandler(version string, healthFunc func() bool) *VsockHandlerImpl {
	return &VsockHandlerImpl{
		version:    version,
		healthFunc: healthFunc,
	}
}

func (h *VsockHandlerImpl) HandleMessage(message string) string {
	logger := ulog.GetLogger()
	logger.Info("Handling vsock message", ulog.F("message", message))

	if strings.Contains(message, "SANDBOX_ID:") {
		parts := strings.Split(message, "SANDBOX_ID:")
		if len(parts) > 1 {
			newSandboxID := strings.TrimSpace(parts[1])
			if newSandboxID != "" {
				h.SetSandboxID(newSandboxID)

				newCtxLogger := rootLogger.ReplaceField("sandboxId", newSandboxID)
				ulog.SetLogger(newCtxLogger)

				logger = ulog.GetLogger()
				logger.Info("Updated sandbox_id from vsock", ulog.F("new_sandbox_id", newSandboxID))

				if h.healthFunc() {
					response := "OK\nREADY:" + h.version + "\n"
					logger.Info("gRPC and network healthy, sent READY back with version", ulog.F("version", h.version))
					return response
				} else {
					logger.Error("gRPC or network not responding")
					return "NOT_READY\n"
				}
			}
		}
	}
	return ""
}

func (h *VsockHandlerImpl) GetSandboxID() string {
	h.mu.Lock()
	defer h.mu.Unlock()
	return h.sandboxID
}

func (h *VsockHandlerImpl) SetSandboxID(id string) {
	h.mu.Lock()
	defer h.mu.Unlock()
	h.sandboxID = id
}

func checkGRPCHealth() bool {
	mu.Lock()
	defer mu.Unlock()
	return isSafe
}