package view

import (
	"github.com/awesome-gocui/gocui"
	"github.com/wagoodman/dive/dive/filetree"
	"github.com/wagoodman/dive/dive/image"
)

type Views struct {
	Tree    *FileTree
	Layer   *Layer
	Status  *Status
	Filter  *Filter
	Details *Details
	Debug   *Debug
}

func NewViews(g *gocui.Gui, imageName string, analysis *image.AnalysisResult, cache filetree.Comparer) (*Views, error) {
	Layer, err := newLayerView(g, analysis.Layers)
	if err != nil {
		return nil, err
	}

	treeStack := analysis.RefTrees[0]
	Tree, err := newFileTreeView(g, treeStack, analysis.RefTrees, cache)
	if err != nil {
		return nil, err
	}

	Status := newStatusView(g)

	// set the layer view as the first selected view
	Status.SetCurrentView(Layer)

	Filter := newFilterView(g)

	Details := newDetailsView(g, imageName, analysis.Efficiency, analysis.Inefficiencies, analysis.SizeBytes)

	Debug := newDebugView(g)

	return &Views{
		Tree:    Tree,
		Layer:   Layer,
		Status:  Status,
		Filter:  Filter,
		Details: Details,
		Debug:   Debug,
	}, nil
}

func (views *Views) All() []Renderer {
	return []Renderer{
		views.Tree,
		views.Layer,
		views.Status,
		views.Filter,
		views.Details,
	}
}