package export

import (
	"encoding/json"
	diveImage "github.com/wagoodman/dive/dive/image"
)

type export struct {
	Layer []layer `json:"layer"`
	Image image   `json:"image"`
}

func NewExport(analysis *diveImage.AnalysisResult) *export {
	data := export{
		Layer: make([]layer, len(analysis.Layers)),
		Image: image{
			InefficientFiles: make([]fileReference, len(analysis.Inefficiencies)),
			SizeBytes:        analysis.SizeBytes,
			EfficiencyScore:  analysis.Efficiency,
			InefficientBytes: analysis.WastedBytes,
		},
	}

	// export layers in order
	for idx, curLayer := range analysis.Layers {
		data.Layer[idx] = layer{
			Index:     curLayer.Index,
			ID:        curLayer.Id,
			DigestID:  curLayer.Digest,
			SizeBytes: curLayer.Size,
			Command:   curLayer.Command,
		}
	}

	// add file references
	for idx := 0; idx < len(analysis.Inefficiencies); idx++ {
		fileData := analysis.Inefficiencies[len(analysis.Inefficiencies)-1-idx]

		data.Image.InefficientFiles[idx] = fileReference{
			References: len(fileData.Nodes),
			SizeBytes:  uint64(fileData.CumulativeSize),
			Path:       fileData.Path,
		}
	}

	return &data
}

func (exp *export) Marshal() ([]byte, error) {
	return json.MarshalIndent(&exp, "", "  ")
}