package filemanager

import (
	"errors"
	"mime"
	"net/http"
	"path/filepath"
	"strings"
)

// assetsURL is the url where static assets are served.
const assetsURL = "/_internal"

// Serve provides the needed assets for the front-end
func serveAssets(w http.ResponseWriter, r *http.Request, m *FileManager) (int, error) {
	// gets the filename to be used with Assets function
	filename := strings.Replace(r.URL.Path, m.BaseURL+assetsURL, "", 1)

	var file []byte
	var err error

	switch {
	case strings.HasPrefix(filename, "/css"):
		filename = strings.Replace(filename, "/css/", "", 1)

		if m.Assets.CSS != nil {
			file, err = m.Assets.CSS.Bytes(filename)
			if err == nil {
				break
			}
		}

		file, err = m.Assets.baseCSS.Bytes(filename)
	case strings.HasPrefix(filename, "/js"):
		filename = strings.Replace(filename, "/js/", "", 1)
		file, err = m.Assets.requiredJS.Bytes(filename)
	case strings.HasPrefix(filename, "/vendor"):
		if m.Assets.JS != nil {
			filename = strings.Replace(filename, "/vendor/", "", 1)
			file, err = m.Assets.JS.Bytes(filename)
			break
		}

		fallthrough
	default:
		err = errors.New("not found")
	}

	if err != nil {
		return http.StatusNotFound, nil
	}

	// Get the file extension and its mimetype
	extension := filepath.Ext(filename)
	mediatype := mime.TypeByExtension(extension)

	// Write the header with the Content-Type and write the file
	// content to the buffer
	w.Header().Set("Content-Type", mediatype)
	w.Write(file)
	return 200, nil
}