package cmd
import (
"fmt"
"os"
"strconv"
"strings"
tea "charm.land/bubbletea/v2"
"skraak/tools"
"skraak/tui"
)
func RunCallsClassify(args []string) {
var folder, file, filter, reviewer string
var color, sixel, iterm bool
var imgDims int
var bindings []tools.KeyBinding
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)
}
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)
}
}
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)
}
config := tools.ClassifyConfig{
Folder: folder,
File: file,
Filter: filter,
Reviewer: reviewer,
Color: color,
ImageSize: imgDims,
Sixel: sixel,
ITerm: iterm,
Bindings: bindings,
}
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())
p := tea.NewProgram(tui.New(state))
if _, err := p.Run(); err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
}
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]
if strings.Contains(value, "+") {
valueParts := strings.SplitN(value, "+", 2)
return tools.KeyBinding{
Key: key,
Species: valueParts[0],
CallType: valueParts[1],
}
}
return tools.KeyBinding{
Key: key,
Species: value,
}
}