package media

import (
	"bytes"
	"fmt"
	"strconv"
	"strings"
	"time"

	ffmpeg "github.com/u2takey/ffmpeg-go"
)

func GetMP3Duration(filePath string) (time.Duration, error) {
	buf := &bytes.Buffer{}
	err := ffmpeg.Input(filePath).
		Output("pipe:", ffmpeg.KwArgs{"format": "null"}).
		WithErrorOutput(buf).
		Run()
	if err != nil {
		return 0, err
	}

	// Extract duration from ffmpeg output
	output := buf.String()
	durationStr := extractDuration(output)
	if durationStr == "" {
		return 0, fmt.Errorf("could not extract duration from ffmpeg output")
	}

	duration, err := parseDuration(durationStr)
	if err != nil {
		return 0, err
	}

	return duration, nil
}

func extractDuration(output string) string {
	lines := strings.Split(output, "\n")
	for _, line := range lines {
		if strings.Contains(line, "Duration:") {
			parts := strings.Split(line, ",")
			if len(parts) > 0 {
				return strings.TrimSpace(strings.Split(parts[0], "Duration:")[1])
			}
		}
	}
	return ""
}

func parseDuration(durationStr string) (time.Duration, error) {
	parts := strings.Split(durationStr, ":")
	if len(parts) != 3 {
		return 0, fmt.Errorf("invalid duration format")
	}

	hours, err := strconv.Atoi(parts[0])
	if err != nil {
		return 0, err
	}

	minutes, err := strconv.Atoi(parts[1])
	if err != nil {
		return 0, err
	}

	seconds, err := strconv.ParseFloat(parts[2], 64)
	if err != nil {
		return 0, err
	}

	totalSeconds := float64(hours*3600) + float64(minutes*60) + seconds
	return time.Duration(totalSeconds) * time.Second, nil
}
