package ffmpeg

import (
	"context"
	"fmt"
	"os"
	"os/exec"
)

const ffmpegExecutable = "ffmpeg"

type FfmpegConverter struct {
}

func NewFfmpegConverter() *FfmpegConverter {
	return &FfmpegConverter{}
}

func (c *FfmpegConverter) Convert(ctx context.Context, src, dest string) error {
	// Проверяем существование исходного файла
	if _, err := os.Stat(src); os.IsNotExist(err) {
		return fmt.Errorf("input file does not exist: %s", src)
	}

	// Проверяем, что ffmpeg доступен в системе
	if _, err := exec.LookPath(ffmpegExecutable); err != nil {
		return fmt.Errorf("ffmpeg not found in PATH: %w", err)
	}

	// Команда заводится с контекстом: отменённый контекст убивает процесс, а не
	// оставляет его дожёвывать чужую запись после остановки воркера.
	cmd := exec.CommandContext(ctx, ffmpegExecutable,
		"-i", src, // входной файл
		"-c:a", "libvorbis", // кодек Vorbis для OGG
		"-q:a", "4", // качество аудио (0-10, где 4 - хорошее качество)
		"-y", // перезаписать выходной файл если существует
		dest, // выходной файл
	)

	// Выполняем команду
	if err := cmd.Run(); err != nil {
		return fmt.Errorf("ffmpeg conversion failed: %w", err)
	}

	// Проверяем, что выходной файл был создан
	if _, err := os.Stat(dest); os.IsNotExist(err) {
		return fmt.Errorf("output file was not created: %s", dest)
	}

	return nil
}
