package frontend

import (
	"fmt"
	"log"
	"net/http"
	"path/filepath"
	"strings"

	"github.com/google/uuid"
	b "streifling.com/jason/cpolis/cmd/backend"
)

func UploadPDF(c *b.Config, s map[string]*Session) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		if _, err := ManageSession(w, r, c, s); err != nil {
			http.Error(w, "Die Session ist abgelaufen. Bitte erneut anmelden.", http.StatusUnauthorized)
			return
		}

		file, header, err := r.FormFile("pdf-upload")
		if err != nil {
			log.Println(err)
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		defer file.Close()

		buffer := make([]byte, 512) // Should be enough for mime type
		if _, err := file.Read(buffer); err != nil {
			log.Println(err)
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}

		if _, err := file.Seek(0, 0); err != nil {
			log.Println(err)
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}

		if http.DetectContentType(buffer) != "application/pdf" {
			http.Error(w, "Die Datei ist kein PDF.", http.StatusBadRequest)
			return
		}

		oldFilename := strings.Join(strings.Split(header.Filename, ".")[:len(header.Filename)-1], ".")
		filename := fmt.Sprint(oldFilename, ".", uuid.New(), ".pdf")
		filepath := filepath.Join(c.PDFDir, filename)

		if err = b.WriteFile(filepath, file); err != nil {
			log.Println(err)
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}

		w.WriteHeader(http.StatusOK)
	}
}