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

package area

import (
	"fmt"

	"git.secluded.site/go-lunatask"
	"git.secluded.site/lune/internal/client"
	"git.secluded.site/lune/internal/completion"
	"git.secluded.site/lune/internal/config"
	"git.secluded.site/lune/internal/stats"
	"git.secluded.site/lune/internal/ui"
	"github.com/spf13/cobra"
)

// ShowCmd displays details for a specific area.
var ShowCmd = &cobra.Command{
	Use:   "show KEY",
	Short: "Show area details",
	Long: `Show detailed information for a configured area.

Displays the area's name, ID, deeplink, goals, and uncompleted task count.`,
	Args:              cobra.ExactArgs(1),
	ValidArgsFunction: completion.Areas,
	RunE:              runShow,
}

func runShow(cmd *cobra.Command, args []string) error {
	areaKey := args[0]

	cfg, err := config.Load()
	if err != nil {
		return err
	}

	area := cfg.AreaByKey(areaKey)
	if area == nil {
		return fmt.Errorf("%w: %s", ErrUnknownArea, areaKey)
	}

	apiClient, err := client.New()
	if err != nil {
		return err
	}

	counter := stats.NewTaskCounter(apiClient)

	return printAreaDetails(cmd, area, counter)
}

func printAreaDetails(cmd *cobra.Command, area *config.Area, counter *stats.TaskCounter) error {
	link, _ := lunatask.BuildDeepLink(lunatask.ResourceArea, area.ID)

	fmt.Fprintf(cmd.OutOrStdout(), "%s (%s)\n", ui.H1.Render(area.Name), area.Key)
	fmt.Fprintf(cmd.OutOrStdout(), "  ID:   %s\n", area.ID)
	fmt.Fprintf(cmd.OutOrStdout(), "  Link: %s\n", link)

	taskCount, err := counter.UncompletedInArea(cmd.Context(), area.ID)
	if err != nil {
		fmt.Fprintf(cmd.OutOrStdout(), "  Tasks: %s\n", ui.Warning.Render("unable to fetch"))
	} else {
		fmt.Fprintf(cmd.OutOrStdout(), "  Tasks: %d uncompleted\n", taskCount)
	}

	if len(area.Goals) == 0 {
		fmt.Fprintln(cmd.OutOrStdout(), "\n  No goals configured")

		return nil
	}

	fmt.Fprintln(cmd.OutOrStdout())

	for _, goal := range area.Goals {
		if err := printGoalSummary(cmd, &goal, counter); err != nil {
			return err
		}
	}

	return nil
}

func printGoalSummary(cmd *cobra.Command, goal *config.Goal, counter *stats.TaskCounter) error {
	goalLink, _ := lunatask.BuildDeepLink(lunatask.ResourceGoal, goal.ID)

	fmt.Fprintf(cmd.OutOrStdout(), "  %s (%s)\n", ui.H2.Render(goal.Name), goal.Key)
	fmt.Fprintf(cmd.OutOrStdout(), "    ID:   %s\n", goal.ID)
	fmt.Fprintf(cmd.OutOrStdout(), "    Link: %s\n", goalLink)

	taskCount, err := counter.UncompletedInGoal(cmd.Context(), goal.ID)
	if err != nil {
		fmt.Fprintf(cmd.OutOrStdout(), "    Tasks: %s\n", ui.Warning.Render("unable to fetch"))
	} else {
		fmt.Fprintf(cmd.OutOrStdout(), "    Tasks: %d uncompleted\n", taskCount)
	}

	return nil
}
