// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of K9s

package view

import (
	"context"
	"fmt"

	"github.com/derailed/k9s/internal/model"
	"github.com/derailed/k9s/internal/ui"
	"github.com/derailed/k9s/internal/view/cmd"
	"github.com/derailed/tcell/v2"
	"github.com/derailed/tview"
	"k8s.io/apimachinery/pkg/labels"
)

// Picker represents a container picker.
type Picker struct {
	*tview.List

	actions ui.KeyActions
}

// NewPicker returns a new picker.
func NewPicker() *Picker {
	return &Picker{
		List:    tview.NewList(),
		actions: *ui.NewKeyActions(),
	}
}

func (*Picker) SetCommand(*cmd.Interpreter)            {}
func (*Picker) SetFilter(string, bool)                 {}
func (*Picker) SetLabelSelector(labels.Selector, bool) {}

// Init initializes the view.
func (p *Picker) Init(ctx context.Context) error {
	app, err := extractApp(ctx)
	if err != nil {
		return err
	}

	pickerView := app.Styles.Views().Picker
	p.actions.Add(tcell.KeyEscape, ui.NewKeyAction("Back", app.PrevCmd, true))

	p.SetBorder(true)
	p.SetMainTextColor(pickerView.MainColor.Color())
	p.ShowSecondaryText(false)
	p.SetShortcutColor(pickerView.ShortcutColor.Color())
	p.SetSelectedBackgroundColor(pickerView.FocusColor.Color())
	p.SetTitle(fmt.Sprintf(" [%s::b]Containers Picker ", app.Styles.Frame().Title.FgColor.String()))

	p.SetInputCapture(func(evt *tcell.EventKey) *tcell.EventKey {
		if a, ok := p.actions.Get(evt.Key()); ok {
			a.Action(evt)
			evt = nil
		}
		return evt
	})

	return nil
}

// InCmdMode checks if prompt is active.
func (*Picker) InCmdMode() bool {
	return false
}

// Start starts the view.
func (*Picker) Start() {}

// Stop stops the view.
func (*Picker) Stop() {}

// Name returns the component name.
func (*Picker) Name() string { return "picker" }

// Hints returns the view hints.
func (p *Picker) Hints() model.MenuHints {
	return p.actions.Hints()
}

// ExtraHints returns additional hints.
func (*Picker) ExtraHints() map[string]string {
	return nil
}

func (p *Picker) populate(ss []string) {
	p.Clear()
	for i, s := range ss {
		p.AddItem(s, "Select a container", rune('a'+i), nil)
	}
}
