package http

import (
	"bytes"
	"io/ioutil"
	"net/http"
	"os"
	"path/filepath"
	"regexp"

	fb "github.com/filebrowser/filebrowser/lib"
)

func subtitlesHandler(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, error) {
	files, err := readDir(filepath.Dir(c.File.Path))
	if err != nil {
		return http.StatusInternalServerError, err
	}
	subtitles := make([]map[string]string, 0)
	for _, file := range files {
		ext := filepath.Ext(file.Name())
		if ext == ".vtt" || ext == ".srt" {
			sub := make(map[string]string)
			sub["src"] = filepath.Dir(c.File.Path) + "/" + file.Name()
			sub["kind"] = "subtitles"
			sub["label"] = file.Name()
			subtitles = append(subtitles, sub)
		}
	}
	return renderJSON(w, subtitles)
}

func subtitleHandler(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, error) {
	str, err := cleanSubtitle(c.File.Path)
	if err != nil {
		return http.StatusInternalServerError, err
	}

	file, err := os.Open(c.File.Path)
	if err != nil {
		return http.StatusInternalServerError, err
	}
	defer file.Close()

	stat, err := file.Stat()
	if err != nil {
		return http.StatusInternalServerError, err
	}

	w.Header().Set("Content-Disposition", "inline")
	w.Header().Set("Content-Type", "text/vtt")
	http.ServeContent(w, r, stat.Name(), stat.ModTime(), bytes.NewReader([]byte(str)))

	return 0, nil

}

func cleanSubtitle(filename string) (string, error) {
	b, err := ioutil.ReadFile(filename)
	if err != nil {
		return "", err
	}
	str := string(b) // convert content to a 'string'
	ext := filepath.Ext(filename)
	if ext == ".srt" {
		re := regexp.MustCompile("([0-9]{2}:[0-9]{2}:[0-9]{2}),([0-9]{3})")
		str = "WEBVTT\n\n" + re.ReplaceAllString(str, "$1.$2")
	}
	return str, err
}

func readDir(dirname string) ([]os.FileInfo, error) {
	f, err := os.Open(dirname)
	if err != nil {
		return nil, err
	}
	list, err := f.Readdir(-1)
	f.Close()
	if err != nil {
		return nil, err
	}
	return list, nil
}