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

package config

import (
	"errors"

	"github.com/charmbracelet/huh"

	"git.secluded.site/lunatask-mcp-server/internal/config"
)

// Tool identifiers for the multi-select.
const (
	toolGetTimestamp       = "get_timestamp"
	toolCreateTask         = "create_task"
	toolUpdateTask         = "update_task"
	toolDeleteTask         = "delete_task"
	toolTrackHabitActivity = "track_habit_activity"
)

// runToolsStep runs the tools configuration step.
func runToolsStep(cfg *config.Config) wizardNav {
	cfg.Tools.ApplyDefaults()

	selected := toolsToSlice(&cfg.Tools)

	err := huh.NewMultiSelect[string]().
		Title("Enable MCP tools").
		Description("Space to toggle, Enter to confirm.").
		Options(
			huh.NewOption("get_timestamp - Parse natural language dates", toolGetTimestamp).
				Selected(cfg.Tools.GetTimestamp),
			huh.NewOption("create_task - Create new tasks", toolCreateTask).
				Selected(cfg.Tools.CreateTask),
			huh.NewOption("update_task - Modify existing tasks", toolUpdateTask).
				Selected(cfg.Tools.UpdateTask),
			huh.NewOption("delete_task - Permanently delete tasks", toolDeleteTask).
				Selected(cfg.Tools.DeleteTask),
			huh.NewOption("track_habit_activity - Record habit completions", toolTrackHabitActivity).
				Selected(cfg.Tools.TrackHabitActivity),
		).
		Value(&selected).
		Run()
	if err != nil {
		if errors.Is(err, huh.ErrUserAborted) {
			return navQuit
		}

		return navQuit
	}

	sliceToTools(selected, &cfg.Tools)

	return navNext
}

// configureTools runs the tools configuration from the main menu.
func configureTools(cfg *config.Config) error {
	nav := runToolsStep(cfg)
	if nav == navQuit {
		return errQuit
	}

	return nil
}

// toolsToSlice converts ToolsConfig bools to a slice of enabled tool names.
func toolsToSlice(tools *config.ToolsConfig) []string {
	var enabled []string

	if tools.GetTimestamp {
		enabled = append(enabled, toolGetTimestamp)
	}

	if tools.CreateTask {
		enabled = append(enabled, toolCreateTask)
	}

	if tools.UpdateTask {
		enabled = append(enabled, toolUpdateTask)
	}

	if tools.DeleteTask {
		enabled = append(enabled, toolDeleteTask)
	}

	if tools.TrackHabitActivity {
		enabled = append(enabled, toolTrackHabitActivity)
	}

	return enabled
}

// sliceToTools converts a slice of tool names back to ToolsConfig bools.
func sliceToTools(selected []string, tools *config.ToolsConfig) {
	enabledSet := make(map[string]bool)
	for _, s := range selected {
		enabledSet[s] = true
	}

	tools.GetTimestamp = enabledSet[toolGetTimestamp]
	tools.CreateTask = enabledSet[toolCreateTask]
	tools.UpdateTask = enabledSet[toolUpdateTask]
	tools.DeleteTask = enabledSet[toolDeleteTask]
	tools.TrackHabitActivity = enabledSet[toolTrackHabitActivity]
}
