package docker

import "strings"

type (
	APIHistory struct {
		ID        string   `json:"Id"`
		Tags      []string `json:",omitempty"`
		Created   int64
		CreatedBy string `json:",omitempty"`
		Size      int64
	}

	APIImages struct {
		ID          string   `json:"Id"`
		RepoTags    []string `json:",omitempty"`
		Created     int64
		Size        int64
		VirtualSize int64
		ParentId    string `json:",omitempty"`
	}

	APIImagesOld struct {
		Repository  string `json:",omitempty"`
		Tag         string `json:",omitempty"`
		ID          string `json:"Id"`
		Created     int64
		Size        int64
		VirtualSize int64
	}

	APIInfo struct {
		Debug              bool
		Containers         int
		Images             int
		Driver             string      `json:",omitempty"`
		DriverStatus       [][2]string `json:",omitempty"`
		NFd                int         `json:",omitempty"`
		NGoroutines        int         `json:",omitempty"`
		MemoryLimit        bool        `json:",omitempty"`
		SwapLimit          bool        `json:",omitempty"`
		IPv4Forwarding     bool        `json:",omitempty"`
		LXCVersion         string      `json:",omitempty"`
		NEventsListener    int         `json:",omitempty"`
		KernelVersion      string      `json:",omitempty"`
		IndexServerAddress string      `json:",omitempty"`
	}

	APITop struct {
		Titles    []string
		Processes [][]string
	}

	APIRmi struct {
		Deleted  string `json:",omitempty"`
		Untagged string `json:",omitempty"`
	}

	APIContainers struct {
		ID         string `json:"Id"`
		Image      string
		Command    string
		Created    int64
		Status     string
		Ports      []APIPort
		SizeRw     int64
		SizeRootFs int64
		Names      []string
	}

	APIContainersOld struct {
		ID         string `json:"Id"`
		Image      string
		Command    string
		Created    int64
		Status     string
		Ports      string
		SizeRw     int64
		SizeRootFs int64
	}

	APIID struct {
		ID string `json:"Id"`
	}

	APIRun struct {
		ID       string   `json:"Id"`
		Warnings []string `json:",omitempty"`
	}

	APIPort struct {
		PrivatePort int64
		PublicPort  int64
		Type        string
		IP          string
	}

	APIVersion struct {
		Version   string
		GitCommit string `json:",omitempty"`
		GoVersion string `json:",omitempty"`
	}

	APIWait struct {
		StatusCode int
	}

	APIAuth struct {
		Status string
	}

	APIImageConfig struct {
		ID string `json:"Id"`
		*Config
	}

	APICopy struct {
		Resource string
		HostPath string
	}
)

func (api APIImages) ToLegacy() []APIImagesOld {
	outs := []APIImagesOld{}
	for _, repotag := range api.RepoTags {
		components := strings.SplitN(repotag, ":", 2)
		outs = append(outs, APIImagesOld{
			ID:          api.ID,
			Repository:  components[0],
			Tag:         components[1],
			Created:     api.Created,
			Size:        api.Size,
			VirtualSize: api.VirtualSize,
		})
	}
	return outs
}

func (api APIContainers) ToLegacy() *APIContainersOld {
	return &APIContainersOld{
		ID:         api.ID,
		Image:      api.Image,
		Command:    api.Command,
		Created:    api.Created,
		Status:     api.Status,
		Ports:      displayablePorts(api.Ports),
		SizeRw:     api.SizeRw,
		SizeRootFs: api.SizeRootFs,
	}
}
