// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: AGPL-3.0-or-later

package init

import (
	"errors"
	"fmt"

	"github.com/charmbracelet/huh"

	"git.secluded.site/lune/internal/config"
)

func configureDefaults(cfg *config.Config) error {
	hasAreas := len(cfg.Areas) > 0
	hasNotebooks := len(cfg.Notebooks) > 0

	if !hasAreas && !hasNotebooks {
		return handleNoDefaultsAvailable(cfg)
	}

	if hasAreas {
		if err := selectDefaultArea(cfg); err != nil {
			return err
		}
	}

	if hasNotebooks {
		if err := selectDefaultNotebook(cfg); err != nil {
			return err
		}
	}

	return nil
}

func handleNoDefaultsAvailable(cfg *config.Config) error {
	var action string

	err := huh.NewSelect[string]().
		Title("No areas or notebooks configured").
		Description("You need at least one area or notebook to set defaults.").
		Options(
			huh.NewOption("Add an area now", "area"),
			huh.NewOption("Add a notebook now", "notebook"),
			huh.NewOption("Back", choiceBack),
		).
		Value(&action).
		Run()
	if err != nil {
		if errors.Is(err, huh.ErrUserAborted) {
			return errQuit
		}

		return err
	}

	switch action {
	case "area":
		return addArea(cfg)
	case "notebook":
		return addNotebook(cfg)
	}

	return nil
}

func selectDefaultArea(cfg *config.Config) error {
	areaOptions := []huh.Option[string]{
		huh.NewOption("None", ""),
	}
	for _, area := range cfg.Areas {
		areaOptions = append(areaOptions, huh.NewOption(
			fmt.Sprintf("%s (%s)", area.Name, area.Key),
			area.Key,
		))
	}

	defaultArea := cfg.Defaults.Area

	err := huh.NewSelect[string]().
		Title("Default area").
		Description("Used when no area is specified in commands.").
		Options(areaOptions...).
		Value(&defaultArea).
		Run()
	if err != nil {
		if errors.Is(err, huh.ErrUserAborted) {
			return errQuit
		}

		return err
	}

	cfg.Defaults.Area = defaultArea

	return nil
}

func selectDefaultNotebook(cfg *config.Config) error {
	notebookOptions := []huh.Option[string]{
		huh.NewOption("None", ""),
	}
	for _, notebook := range cfg.Notebooks {
		notebookOptions = append(notebookOptions, huh.NewOption(
			fmt.Sprintf("%s (%s)", notebook.Name, notebook.Key),
			notebook.Key,
		))
	}

	defaultNotebook := cfg.Defaults.Notebook

	err := huh.NewSelect[string]().
		Title("Default notebook").
		Description("Used when no notebook is specified in commands.").
		Options(notebookOptions...).
		Value(&defaultNotebook).
		Run()
	if err != nil {
		if errors.Is(err, huh.ErrUserAborted) {
			return errQuit
		}

		return err
	}

	cfg.Defaults.Notebook = defaultNotebook

	return nil
}
