package compiler

import (
	"bytes"
	"esperframework/options"
	"esperframework/utils"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
)

var hash = utils.ComputeHash(3, 3)
var fnHashed = "router" + hash + ".js"

func injectRouter(opts *options.Options, html *bytes.Buffer) {
	wd, err := os.Getwd()
	if err != nil {
		log.Fatal("Failed to get working directory")
	}

	path := filepath.Join(wd, "../", "src", "router", "router.tmpl.js")

	file, err := ioutil.ReadFile(path)
	if err != nil {
		log.Fatalf("\nFailed to read router template at %s\n%s\n", path, err)
	}

	var tmpl bytes.Buffer

	for i := 0; i < len(file); i++ {
		if file[i] == '%' && string(file[i:i+6]) == "%PORT%" {
			tmpl.WriteString(fmt.Sprint(opts.Port))
			i += 5
			continue
		}
		tmpl.WriteByte(file[i])
	}

	// Copy router file to build dir
	routerDir := filepath.Join(opts.CacheClientPath, "router")

	if _, err := os.Stat(routerDir); os.IsNotExist(err) {
		err = os.MkdirAll(routerDir, os.ModePerm)
		if err != nil {
			log.Fatalf("\nFailed to make directory for output path while cleaning build artifacts at %s\n%s\n", routerDir, err)
		}
	}

	err = os.WriteFile(filepath.Join(routerDir, fnHashed), tmpl.Bytes(), os.ModePerm)
	if err != nil {
		log.Fatalf("\nFailed to write router file to build dir\n%s\n", err)
	}

	// Inject script onto page
	(*html).Write([]byte(fmt.Sprintf("<script src=\"/router/%s\" defer></script>", fnHashed)))
}
