package daemon

import (
	"encoding/json"
	"fmt"

	"github.com/docker/docker/engine"
	"github.com/docker/docker/runconfig"
)

func (daemon *Daemon) ContainerInspect(job *engine.Job) engine.Status {
	if len(job.Args) != 1 {
		return job.Errorf("usage: %s NAME", job.Name)
	}
	name := job.Args[0]
	container, err := daemon.Get(name)
	if err != nil {
		return job.Error(err)
	}

	container.Lock()
	defer container.Unlock()
	if job.GetenvBool("raw") {
		b, err := json.Marshal(&struct {
			*Container
			HostConfig *runconfig.HostConfig
		}{container, container.hostConfig})
		if err != nil {
			return job.Error(err)
		}
		job.Stdout.Write(b)
		return engine.StatusOK
	}

	out := &engine.Env{}
	out.SetJson("Id", container.ID)
	out.SetAuto("Created", container.Created)
	out.SetJson("Path", container.Path)
	out.SetList("Args", container.Args)
	out.SetJson("Config", container.Config)
	out.SetJson("State", container.State)
	out.Set("Image", container.ImageID)
	out.SetJson("NetworkSettings", container.NetworkSettings)
	out.Set("ResolvConfPath", container.ResolvConfPath)
	out.Set("HostnamePath", container.HostnamePath)
	out.Set("HostsPath", container.HostsPath)
	out.Set("LogPath", container.LogPath)
	out.SetJson("Name", container.Name)
	out.SetInt("RestartCount", container.RestartCount)
	out.Set("Driver", container.Driver)
	out.Set("ExecDriver", container.ExecDriver)
	out.Set("MountLabel", container.MountLabel)
	out.Set("ProcessLabel", container.ProcessLabel)
	out.SetJson("Volumes", container.Volumes)
	out.SetJson("VolumesRW", container.VolumesRW)
	out.SetJson("VolumesRelabel", container.VolumesRelabel)
	out.SetJson("AppArmorProfile", container.AppArmorProfile)

	out.SetList("ExecIDs", container.GetExecIDs())

	if children, err := daemon.Children(container.Name); err == nil {
		for linkAlias, child := range children {
			container.hostConfig.Links = append(container.hostConfig.Links, fmt.Sprintf("%s:%s", child.Name, linkAlias))
		}
	}
	// we need this trick to preserve empty log driver, so
	// container will use daemon defaults even if daemon change them
	if container.hostConfig.LogConfig.Type == "" {
		container.hostConfig.LogConfig = daemon.defaultLogConfig
		defer func() {
			container.hostConfig.LogConfig = runconfig.LogConfig{}
		}()
	}

	out.SetJson("HostConfig", container.hostConfig)

	container.hostConfig.Links = nil
	if _, err := out.WriteTo(job.Stdout); err != nil {
		return job.Error(err)
	}
	return engine.StatusOK
}

func (daemon *Daemon) ContainerExecInspect(job *engine.Job) engine.Status {
	if len(job.Args) != 1 {
		return job.Errorf("usage: %s ID", job.Name)
	}
	id := job.Args[0]
	eConfig, err := daemon.getExecConfig(id)
	if err != nil {
		return job.Error(err)
	}

	b, err := json.Marshal(*eConfig)
	if err != nil {
		return job.Error(err)
	}
	job.Stdout.Write(b)
	return engine.StatusOK
}
