package cmd

import (
	"fmt"
	"os"
	"strconv"
	"strings"

	tea "charm.land/bubbletea/v2"

	"skraak/tools"
	"skraak/tui"
)

// RunCallsClassify handles the "calls classify" subcommand
func RunCallsClassify(args []string) {
	var folder, file, filter, reviewer string
	var color, sixel, iterm bool
	var imgDims int
	var bindings []tools.KeyBinding

	// Parse arguments
	i := 0
	for i < len(args) {
		arg := args[i]

		switch arg {
		case "--folder":
			if i+1 >= len(args) {
				fmt.Fprintf(os.Stderr, "Error: --folder requires a value\n")
				os.Exit(1)
			}
			folder = args[i+1]
			i += 2

		case "--file":
			if i+1 >= len(args) {
				fmt.Fprintf(os.Stderr, "Error: --file requires a value\n")
				os.Exit(1)
			}
			file = args[i+1]
			i += 2

		case "--filter":
			if i+1 >= len(args) {
				fmt.Fprintf(os.Stderr, "Error: --filter requires a value\n")
				os.Exit(1)
			}
			filter = args[i+1]
			i += 2

		case "--reviewer":
			if i+1 >= len(args) {
				fmt.Fprintf(os.Stderr, "Error: --reviewer requires a value\n")
				os.Exit(1)
			}
			reviewer = args[i+1]
			i += 2

		case "--color":
			color = true
			i++

		case "--sixel":
			sixel = true
			i++

		case "--iterm":
			iterm = true
			i++

		case "--img-dims":
			if i+1 >= len(args) {
				fmt.Fprintf(os.Stderr, "Error: --img-dims requires a value\n")
				os.Exit(1)
			}
			v, err := strconv.Atoi(args[i+1])
			if err != nil {
				fmt.Fprintf(os.Stderr, "Error: --img-dims must be an integer\n")
				os.Exit(1)
			}
			imgDims = v
			i += 2

		case "--bind":
			if i+1 >= len(args) {
				fmt.Fprintf(os.Stderr, "Error: --bind requires a value\n")
				os.Exit(1)
			}
			// Parse key="Species" or key="Species"+"CallType" format
			binding := parseBind(args[i+1])
			bindings = append(bindings, binding)
			i += 2

		default:
			fmt.Fprintf(os.Stderr, "Error: unknown flag: %s\n", arg)
			os.Exit(1)
		}
	}

	// Validate required flags
	if folder == "" && file == "" {
		fmt.Fprintf(os.Stderr, "Error: --folder or --file is required\n")
		os.Exit(1)
	}

	if reviewer == "" {
		fmt.Fprintf(os.Stderr, "Error: --reviewer is required\n")
		os.Exit(1)
	}

	if len(bindings) == 0 {
		fmt.Fprintf(os.Stderr, "Error: at least one --bind is required\n")
		os.Exit(1)
	}

	// Build config
	config := tools.ClassifyConfig{
		Folder:    folder,
		File:      file,
		Filter:    filter,
		Reviewer:  reviewer,
		Color:     color,
		ImageSize: imgDims,
		Sixel:     sixel,
		ITerm:     iterm,
		Bindings:  bindings,
	}

	// Load data files
	state, err := tools.LoadDataFiles(config)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
		os.Exit(1)
	}

	fmt.Fprintf(os.Stderr, "Loaded %d .data files, %d segments\n",
		len(state.DataFiles), state.TotalSegments())

	// Launch TUI (alt screen for clean kitty image rendering)
	p := tea.NewProgram(tui.New(state))
	if _, err := p.Run(); err != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
		os.Exit(1)
	}
}

// parseBind parses "k=Kiwi" or "d=Kiwi+Duet" format
func parseBind(s string) tools.KeyBinding {
	parts := strings.SplitN(s, "=", 2)
	if len(parts) != 2 {
		fmt.Fprintf(os.Stderr, "Error: invalid bind format: %s (expected key=value)\n", s)
		os.Exit(1)
	}

	key := parts[0]
	value := parts[1]

	// Check for Species+CallType format
	if strings.Contains(value, "+") {
		valueParts := strings.SplitN(value, "+", 2)
		return tools.KeyBinding{
			Key:      key,
			Species:  valueParts[0],
			CallType: valueParts[1],
		}
	}

	// Species only
	return tools.KeyBinding{
		Key:     key,
		Species: value,
	}
}