package docker

import (
	"encoding/json"
	"errors"

	"github.com/shirou/gopsutil/v3/cpu"
	"github.com/shirou/gopsutil/v3/internal/common"
)

var (
	ErrDockerNotAvailable = errors.New("docker not available")
	ErrCgroupNotAvailable = errors.New("cgroup not available")
)

var invoke common.Invoker = common.Invoke{}

const nanoseconds = 1e9

type CgroupCPUStat struct {
	cpu.TimesStat
	Usage float64
}

type CgroupMemStat struct {
	ContainerID             string `json:"containerID"`
	Cache                   uint64 `json:"cache"`
	RSS                     uint64 `json:"rss"`
	RSSHuge                 uint64 `json:"rssHuge"`
	MappedFile              uint64 `json:"mappedFile"`
	Pgpgin                  uint64 `json:"pgpgin"`
	Pgpgout                 uint64 `json:"pgpgout"`
	Pgfault                 uint64 `json:"pgfault"`
	Pgmajfault              uint64 `json:"pgmajfault"`
	InactiveAnon            uint64 `json:"inactiveAnon"`
	ActiveAnon              uint64 `json:"activeAnon"`
	InactiveFile            uint64 `json:"inactiveFile"`
	ActiveFile              uint64 `json:"activeFile"`
	Unevictable             uint64 `json:"unevictable"`
	HierarchicalMemoryLimit uint64 `json:"hierarchicalMemoryLimit"`
	TotalCache              uint64 `json:"totalCache"`
	TotalRSS                uint64 `json:"totalRss"`
	TotalRSSHuge            uint64 `json:"totalRssHuge"`
	TotalMappedFile         uint64 `json:"totalMappedFile"`
	TotalPgpgIn             uint64 `json:"totalPgpgin"`
	TotalPgpgOut            uint64 `json:"totalPgpgout"`
	TotalPgFault            uint64 `json:"totalPgfault"`
	TotalPgMajFault         uint64 `json:"totalPgmajfault"`
	TotalInactiveAnon       uint64 `json:"totalInactiveAnon"`
	TotalActiveAnon         uint64 `json:"totalActiveAnon"`
	TotalInactiveFile       uint64 `json:"totalInactiveFile"`
	TotalActiveFile         uint64 `json:"totalActiveFile"`
	TotalUnevictable        uint64 `json:"totalUnevictable"`
	MemUsageInBytes         uint64 `json:"memUsageInBytes"`
	MemMaxUsageInBytes      uint64 `json:"memMaxUsageInBytes"`
	MemLimitInBytes         uint64 `json:"memoryLimitInBytes"`
	MemFailCnt              uint64 `json:"memoryFailcnt"`
}

func (m CgroupMemStat) String() string {
	s, _ := json.Marshal(m)
	return string(s)
}

type CgroupDockerStat struct {
	ContainerID string `json:"containerID"`
	Name        string `json:"name"`
	Image       string `json:"image"`
	Status      string `json:"status"`
	Running     bool   `json:"running"`
}

func (c CgroupDockerStat) String() string {
	s, _ := json.Marshal(c)
	return string(s)
}
