// sandbox.go   v1.6
package sandbox

import (
	"os"
	"os/exec"
	"sync"
)

var pluginConfig = struct {
	Root    string                    // 沙盒临时根目录物理路径
	Runtime map[string]*RuntimeConfig // 运行时配置
}{}

var sandboxList = map[string]*Sandbox{}
var sandboxLock = sync.RWMutex{}

// Volume 挂载配置
type Volume struct {
	Source   string // 宿主机路径或类型(如 tmpfs)
	Target   string // 沙盒内路径
	ReadOnly bool   // 是否只读
}

// Limits 资源限制
type Limits struct {
	Cpu  float64 // CPU 核心限制 (如 0.5)
	Mem  float64 // 内存限制 (单位: GB)
	Swap float64 // SWAP 限制 (单位: GB)
	Shm  uint    // /dev/shm 大小 (单位: MB)
	Tmp  uint    // /tmp 大小 (单位: MB)
}

// Config 沙盒启动配置
type Config struct {
	Name       string            // 沙盒名称
	ProjectDir string            // 宿主机的工作目录（自动映射到SandboxWorkDir）
	WorkDir    string            // 沙盒内的工作目录
	Envs       map[string]string // 环境变量
	Volumes    []Volume          // 挂载列表
	Limits     Limits            // 资源限制
	Network    struct {
		AllowInternet     bool     // 是否允许出站网络连接，默认关闭，配置后只开放非本地网络访问
		AllowLocalNetwork bool     // 是否允许访问本地网络，默认关闭，配置后只开放10.0.0.0/8、172.16.0.0/12、192.168.0.0/16
		AllowListen       []int    // 允许监听端口列表，默认关闭所有监听端口和进站连接
		AllowList         []string // 允许出站访问的 IP/端口 列表，同时放开TCP&UDP，在拒绝的基础上允许访问白名单
		BlockList         []string // 拒绝访问的 IP/端口 列表，同时拒绝TCP&UDP，在允许的基础上拒绝黑名单
	}
	Gpu struct {
		Driver  string   // 驱动或厂商，如 "nvidia", "amd", "apple"
		Devices []string // 设备 ID，如 ["0", "1"] 或 ["all"]
	}
	ExtraOptions []string // 额外参数
	AutoStart    bool     // 是否自动启动沙盒进程
	StartCmd     string
	StartArgs    []string
	Runtime      struct {
		Language string
		Version  string
		Venv     string
	}
	NoLog bool // 是否不显示沙盒运行日志
}

// Status 沙盒实时状态信息
type Status struct {
	Id          string  // 沙盒唯一标识 (用于目录名、Cgroup 名)
	Pid         int     // 宿主机上的进程 PID
	Alive       bool    // 物理进程是否正在运行
	Status      string  // 状态
	StartTime   int64   // 启动时间 (Unix 时间戳)
	Uptime      int64   // 运行耗时 (单位: 秒)
	MemoryUsage uint    // 当前内存使用 (单位: MB)
	CpuUsage    float64 // 当前 CPU 使用率 (百分比)
}

type State struct {
	Id          string
	Pid         int
	StartTime   int64
	WorkDir     string
	MountedList []string
}

type Sandbox struct {
	id          string
	pid         int
	uid         int
	gid         int
	root        string
	workDir     string
	config      *Config
	cmd         *exec.Cmd
	mountedList []string
	startTime   int64
	lastLogFd   *os.File
	errorLogFd  *os.File
	status      string
	lock        sync.Mutex
	extra       map[string]any
}
