package compiler

import (
	"encoding/json"
	"esperframework/compiler/appshell"
	"esperframework/compiler/parser"
	"esperframework/options"
	"io/ioutil"
	"log"
	"path/filepath"
	"sync"
)

var templatesMap = map[string]parser.TemplateData{}

func Compile(opts *options.Options, actionMeta *options.ActionMeta) {
	templatesMap = parser.Parse(opts, actionMeta)

	as := appshell.GetAppShellJSON(opts)
	dg := getDepGraph(opts)

	parser.AssignLayoutsToDepGraphItems(opts, &dg)

	var wg sync.WaitGroup

	for _, td := range templatesMap {
		if td.MetaData.TemplateKind != parser.TemplateKind[parser.Page] {
			continue
		}

		wg.Add(1)
		go func(templateData parser.TemplateData) {
			// compileStylesWithPostCSS(opts, &templateData)

			compileTemplate(opts, as, &templateData, &dg)

			wg.Done()
		}(td)
	}

	wg.Wait()

	generateHTML(opts)
}

func getDepGraph(opts *options.Options) parser.DepGraph {
	file, err := ioutil.ReadFile(filepath.Join((*opts).CachePath, "dep_graph.json"))
	if err != nil {
		log.Fatalf("\nFailed to read dependency graph file at path %s\n%s\n", filepath.Join(opts.CachePath, "dep_graph.json"), err)
	}

	var dg parser.DepGraph
	err = json.Unmarshal(file, &dg)
	if err != nil {
		log.Fatalf("\nFailed to unmarshal dep graph JSON\n%s\n", err)
	}

	return dg
}

func getTemplateData(opts *options.Options, path string) parser.TemplateData {
	return templatesMap[path]
}
