package controllers

import (
	"context"
	tea "github.com/charmbracelet/bubbletea"
	"github.com/lmika/audax/internal/common/ui/events"
	"github.com/lmika/audax/internal/ssm-browse/models"
	"github.com/lmika/audax/internal/ssm-browse/services/ssmparameters"
	"sync"
)

type SSMController struct {
	service *ssmparameters.Service

	// state
	mutex  *sync.Mutex
	prefix string
}

func New(service *ssmparameters.Service) *SSMController {
	return &SSMController{
		service: service,
		prefix:  "/",
		mutex:   new(sync.Mutex),
	}
}

func (c *SSMController) Fetch() tea.Cmd {
	return func() tea.Msg {
		res, err := c.service.List(context.Background(), c.prefix)
		if err != nil {
			return events.Error(err)
		}

		return NewParameterListMsg{
			Prefix:     c.prefix,
			Parameters: res,
		}
	}
}

func (c *SSMController) ChangePrefix(newPrefix string) tea.Msg {
	res, err := c.service.List(context.Background(), newPrefix)
	if err != nil {
		return events.Error(err)
	}

	c.mutex.Lock()
	defer c.mutex.Unlock()
	c.prefix = newPrefix

	return NewParameterListMsg{
		Prefix:     c.prefix,
		Parameters: res,
	}
}

func (c *SSMController) Clone(param models.SSMParameter) tea.Msg {
	return events.PromptForInput("New key: ", nil, func(value string) tea.Msg {
		return func() tea.Msg {
			ctx := context.Background()
			if err := c.service.Clone(ctx, param, value); err != nil {
				return events.Error(err)
			}

			res, err := c.service.List(context.Background(), c.prefix)
			if err != nil {
				return events.Error(err)
			}

			return NewParameterListMsg{
				Prefix:     c.prefix,
				Parameters: res,
			}
		}
	})
}

func (c *SSMController) DeleteParameter(param models.SSMParameter) tea.Msg {
	return events.ConfirmYes("delete parameter? ", func() tea.Msg {
		ctx := context.Background()
		if err := c.service.Delete(ctx, param); err != nil {
			return events.Error(err)
		}

		res, err := c.service.List(context.Background(), c.prefix)
		if err != nil {
			return events.Error(err)
		}

		return NewParameterListMsg{
			Prefix:     c.prefix,
			Parameters: res,
		}
	})
}