package cmd

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

	"skraak/utils"
)

// RunMetadata handles the "metadata" subcommand
func RunMetadata(args []string) {
	fs := flag.NewFlagSet("metadata", flag.ExitOnError)
	filePath := fs.String("file", "", "Path to WAV file (required)")

	fs.Usage = func() {
		fmt.Fprintf(os.Stderr, "Usage: skraak metadata --file <path>\n\n")
		fmt.Fprintf(os.Stderr, "Extract metadata from a WAV file header.\n\n")
		fmt.Fprintf(os.Stderr, "Options:\n")
		fs.PrintDefaults()
		fmt.Fprintf(os.Stderr, "\nExamples:\n")
		fmt.Fprintf(os.Stderr, "  skraak metadata --file recording.wav\n")
		fmt.Fprintf(os.Stderr, "  skraak metadata --file /path/to/audio.wav | jq '.duration_seconds'\n")
	}

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

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

	// Parse WAV header
	metadata, err := utils.ParseWAVHeader(*filePath)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
		os.Exit(1)
	}

	// Output as JSON
	output := map[string]any{
		"file":             *filePath,
		"duration_seconds": metadata.Duration,
		"sample_rate":      metadata.SampleRate,
		"channels":         metadata.Channels,
		"bits_per_sample":  metadata.BitsPerSample,
	}

	// Add optional fields if present
	if metadata.Comment != "" {
		output["comment"] = metadata.Comment
	}
	if metadata.Artist != "" {
		output["artist"] = metadata.Artist
	}
	if !metadata.FileModTime.IsZero() {
		output["file_mod_time"] = metadata.FileModTime.Format("2006-01-02T15:04:05Z07:00")
	}

	enc := json.NewEncoder(os.Stdout)
	enc.SetIndent("", "  ")
	enc.Encode(output)
}