package html

import (
	"encoding/json"
	"gitlab.schukai.com/oss/bob/types"
	"gitlab.schukai.com/oss/libraries/go/markup/html/engine"
	"gopkg.in/yaml.v3"
	"os"
	"path"
	"strings"
)

func GenerateFiles(dataPath, out string) error {

	dir := path.Dir(dataPath)

	yamlFile, err := os.ReadFile(dataPath)
	if err != nil {
		return err
	}

	storage := types.NewPageDataStorage()
	if err := yaml.Unmarshal(yamlFile, storage); err != nil {
		return err
	}

	for name, page := range storage {
		p := path.Join(dir, name)
		html, err := Generate(page, p)
		if err != nil {
			return err
		}

		outFile := path.Join(out, page.Export)

		dir := path.Dir(outFile)
		if err := os.MkdirAll(dir, 0755); err != nil {
			return err
		}

		err = os.WriteFile(outFile, []byte(html), 0644)
		if err != nil {
			return err
		}

	}

	return nil
}

func Generate(data *types.PageData, name string) (string, error) {

	dataset := make(map[any]any)
	dataset["lang"] = data.Lang
	dataset["title"] = data.Title
	dataset["meta"] = make(map[any]any)
	for k, v := range data.Meta {
		dataset["meta"].(map[any]any)[k] = v
	}
	dataset["images"] = make(map[any]any, 0)
	for _, v := range data.Images {
		dataset["images"].(map[any]any)[v.Id] = map[any]any{
			"source": v.Source,
			"alt":    v.Alt,
			"title":  v.Title,
			"id":     v.Id,
		}
	}

	dataset["anchors"] = make(map[any]any, 0)
	for _, v := range data.Anchors {
		dataset["anchors"].(map[any]any)[v.Id] = map[any]any{
			"href":     v.Href,
			"hreflang": v.HrefLang,
			"title":    v.Title,
			"id":       v.Id,
		}
	}

	dataset["text"] = make(map[any]any, 0)
	for _, v := range data.Text {
		dataset["text"].(map[any]any)[v.Id] = map[any]any{"text": v.Text}
	}

	dataset["translations"] = make(map[string]any, 0)
	for _, v := range data.Translations {
		j, err := json.Marshal(v.KeyValues)
		if err != nil {
			return "", err
		}
		dataset["translations"].(map[string]any)[v.Id] = map[string]string{
			"content": string(j),
		}

	}

	e := engine.New(dataset)

	template, err := os.ReadFile(name)
	if err != nil {
		return "", err
	}

	stringWriter := &strings.Builder{}
	e.ProcessHtml(stringWriter, strings.NewReader(string(template)))

	return stringWriter.String(), nil
}