package ffmpeg

import (
	"net/http"
	"strings"

	"github.com/AlexxIT/go2rtc/internal/api"
	"github.com/AlexxIT/go2rtc/internal/streams"
)

func apiFFmpeg(w http.ResponseWriter, r *http.Request) {
	if r.Method != "POST" {
		http.Error(w, "", http.StatusMethodNotAllowed)
		return
	}
	if api.IsReadOnly() {
		api.ReadOnlyError(w)
		return
	}

	query := r.URL.Query()
	dst := query.Get("dst")
	stream := streams.Get(dst)
	if stream == nil {
		http.Error(w, "", http.StatusNotFound)
		return
	}

	var src string
	if s := query.Get("file"); s != "" {
		if streams.Validate(s) == nil {
			src = "ffmpeg:" + s + "#audio=auto#input=file"
		}
	} else if s = query.Get("live"); s != "" {
		if streams.Validate(s) == nil {
			src = "ffmpeg:" + s + "#audio=auto"
		}
	} else if s = query.Get("text"); s != "" {
		if strings.IndexAny(s, `'"&%$`) < 0 {
			src = "ffmpeg:tts?text=" + s
			if s = query.Get("voice"); s != "" {
				src += "&voice=" + s
			}
			src += "#audio=auto"
		}
	}

	if src == "" {
		http.Error(w, "", http.StatusBadRequest)
		return
	}

	if err := stream.Play(src); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
	}
}
