package cmd

import (
	"encoding/json"
	"flag"
	"fmt"
	"os"

	"skraak/tools"
)

// RunPrepend handles the "prepend" subcommand
//
// JSON output schema:
//
//	{
//	  "folder": string,          // Target folder path
//	  "prefix": string,          // Prefix that was prepended
//	  "recursive": bool,         // Whether subfolders were included
//	  "dry_run": bool,           // Whether this was a dry run
//	  "renamed": [               // Successfully renamed files
//	    {"old": string, "new": string}
//	  ],
//	  "skipped": [               // Skipped files
//	    {"file": string, "reason": string}
//	  ],
//	  "errors": [                // Failed renames
//	    {"file": string, "error": string}
//	  ]
//	}
func RunPrepend(args []string) {
	fs := flag.NewFlagSet("prepend", flag.ExitOnError)
	folder := fs.String("folder", "", "Target folder path (required)")
	prefix := fs.String("prefix", "", "String to prepend to filenames (required)")
	recursive := fs.Bool("recursive", false, "Include 1 level of subfolders")
	dryRun := fs.Bool("dry-run", false, "Show what would be renamed without doing it")

	fs.Usage = func() {
		fmt.Fprintf(os.Stderr, "Usage: skraak prepend --folder <path> --prefix <string> [--recursive] [--dry-run]\n\n")
		fmt.Fprintf(os.Stderr, "Rename files by prepending a prefix.\n\n")
		fmt.Fprintf(os.Stderr, "Target files:\n")
		fmt.Fprintf(os.Stderr, "  - *.wav, *.WAV (must start with datestring YYYYMMDD_HHMMSS)\n")
		fmt.Fprintf(os.Stderr, "  - *.wav.data, *.WAV.data (must start with datestring YYYYMMDD_HHMMSS)\n")
		fmt.Fprintf(os.Stderr, "  - log.txt (exact name, always renamed)\n\n")
		fmt.Fprintf(os.Stderr, "Options:\n")
		fs.PrintDefaults()
		fmt.Fprintf(os.Stderr, "\nExamples:\n")
		fmt.Fprintf(os.Stderr, "  skraak prepend --folder ./recordings --prefix LOC001\n")
		fmt.Fprintf(os.Stderr, "  skraak prepend --folder ./data --prefix SITE_A --recursive\n")
		fmt.Fprintf(os.Stderr, "  skraak prepend --folder ./test --prefix TEST --dry-run\n")
	}

	if err := fs.Parse(args); err != nil {
		os.Exit(1)
	}

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

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

	// Run the prepend operation
	output, err := tools.Prepend(tools.PrependInput{
		Folder:    *folder,
		Prefix:    *prefix,
		Recursive: *recursive,
		DryRun:    *dryRun,
	})
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
		os.Exit(1)
	}

	// Output as JSON
	enc := json.NewEncoder(os.Stdout)
	enc.SetIndent("", "  ")
	if err := enc.Encode(output); err != nil {
		fmt.Fprintf(os.Stderr, "Error encoding output: %v\n", err)
		os.Exit(1)
	}
}