package main

import (
	"errors"
	"fmt"
	"os"

	"skraak/cmd"
)

// commandDispatch maps command names to their handler functions.
var commandDispatch = map[string]func([]string) error{
	"import":   cmd.RunImport,
	"sql":      cmd.RunSQL,
	"create":   cmd.RunCreate,
	"update":   cmd.RunUpdate,
	"export":   cmd.RunExport,
	"replay":   cmd.RunReplay,
	"calls":    cmd.RunCalls,
	"xxhash":   cmd.RunXXHash,
	"metadata": cmd.RunMetadata,
	"time":     cmd.RunTime,
	"isnight":  cmd.RunIsNight,
	"prepend":  cmd.RunPrepend,
}

func main() {
	if len(os.Args) < 2 {
		printUsage()
		os.Exit(1)
	}

	handler, ok := commandDispatch[os.Args[1]]
	if !ok {
		fmt.Fprintf(os.Stderr, "Unknown command: %s\n\n", os.Args[1])
		printUsage()
		os.Exit(1)
	}

	if err := handler(os.Args[2:]); err != nil {
		if errors.Is(err, cmd.ErrHelpRequested) {
			os.Exit(0)
		}
		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
		os.Exit(1)
	}
}

// printUsage displays command-line usage information for all available commands
func printUsage() {
	fmt.Fprintf(os.Stderr, "Usage: %s <command> [options]\n\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "Commands:\n")
	fmt.Fprintf(os.Stderr, "  sql        Execute SQL query\n")
	fmt.Fprintf(os.Stderr, "  calls      Extract/analyze bird calls (from-preds, from-brida, from-raven, show-images, classify, summarise)\n")
	fmt.Fprintf(os.Stderr, "  create     Create a new resource (dataset, location, cluster, pattern)\n")
	fmt.Fprintf(os.Stderr, "  update     Update an existing resource (dataset, location, cluster, pattern)\n")
	fmt.Fprintf(os.Stderr, "  import     Import data (folder, bulk, unstructured, segments)\n")
	fmt.Fprintf(os.Stderr, "  export     Export dataset to new database\n")
	fmt.Fprintf(os.Stderr, "  replay     Replay event log into database\n")
	fmt.Fprintf(os.Stderr, "  xxhash     Compute XXH64 hash of a file\n")
	fmt.Fprintf(os.Stderr, "  metadata   Extract WAV file metadata\n")
	fmt.Fprintf(os.Stderr, "  time       Get current time\n")
	fmt.Fprintf(os.Stderr, "  isnight    Check if WAV file was recorded at night\n")
	fmt.Fprintf(os.Stderr, "  prepend    Prepend prefix to WAV files and log.txt\n")
	fmt.Fprintf(os.Stderr, "\nExamples:\n")
	fmt.Fprintf(os.Stderr, "  %s sql --db ./db/skraak.duckdb \"SELECT COUNT(*) FROM file WHERE active = true\"\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s create dataset --db ./db/skraak.duckdb --name \"Test Dataset\"\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s update location --db ./db/skraak.duckdb --id loc123 --name \"New Name\"\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s export dataset --db ./db/skraak.duckdb --id abc123 --output export.duckdb\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s replay events --db ./backup.duckdb --log ./skraak.duckdb.events.jsonl\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s calls from-preds --csv predictions.csv > calls.json\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s xxhash --file recording.wav\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s metadata --file recording.wav\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s time\n", os.Args[0])
	fmt.Fprintf(os.Stderr, "  %s isnight --file recording.wav --lat -36.85 --lng 174.76\n", os.Args[0])
}