package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"strings"

	"github.com/Jeffail/gabs"
	"github.com/fatih/color"
)

//dataEntry is the map used to create the array of maps, where the templatejson data is stored
type dataEntry map[string]string

func copyDirRaw(fromDir string, currentDir string, newDir string) {
	filesList, _ := ioutil.ReadDir("./" + fromDir + "/" + currentDir)
	fmt.Println(fromDir + "/" + currentDir)
	c.Green(newDir + "/" + currentDir)
	os.MkdirAll(newDir+"/"+currentDir, os.ModePerm)
	for _, f := range filesList {
		fileNameSplitted := strings.Split(f.Name(), ".")
		if len(fileNameSplitted) > 1 {
			//is a file
			copyFileRaw(fromDir+"/"+currentDir, f.Name(), newDir+"/"+currentDir)
		} else {
			//is a directory
			copyDirRaw(fromDir+"/"+currentDir, f.Name(), newDir+"/"+currentDir)
		}
	}
}

func copyFileRaw(fromDir string, fName string, newDir string) {
	c.Yellow("copying raw " + fromDir + "/" + fName)
	fileContent := readFile(fromDir + "/" + fName)
	writeFile(newDir+"/"+fName, fileContent)
}

func readFile(path string) string {
	dat, err := ioutil.ReadFile(path)
	check(err)
	return string(dat)
}

func getDataFromJson(path string) ([]dataEntry, *gabs.Container) {
	var entries []dataEntry
	file, err := ioutil.ReadFile(path)
	check(err)
	content := string(file)
	var rawEntries []*json.RawMessage
	json.Unmarshal([]byte(content), &rawEntries)
	for i := 0; i < len(rawEntries); i++ {
		rawEntryMarshaled, err := json.Marshal(rawEntries[i])
		check(err)
		var newDataEntry map[string]string
		json.Unmarshal(rawEntryMarshaled, &newDataEntry)
		entries = append(entries, newDataEntry)
	}

	jsonData := jsonGabs(path)
	return entries, jsonData
}

func jsonGabs(path string) *gabs.Container {
	file, err := ioutil.ReadFile(path)
	check(err)
	jsonParsed, err := gabs.ParseJSON(file)
	//img := "img"
	//fmt.Println(jsonParsed.S(img))
	return jsonParsed
}

func writeFile(path string, newContent string) {
	err := ioutil.WriteFile(path, []byte(newContent), 0644)
	check(err)

	color.Green(path + ":")
	//color.Blue(newContent)
}

/*func generatePageFromTemplateAndData(templateContent string, entry dataEntry) string {
	var entryContent string
	entryContent = templateContent
	//first, get the map keys
	var keys []string
	for key, _ := range entry {
		keys = append(keys, key)
	}
	//now, replace the keys with the values
	for j := 0; j < len(keys); j++ {
		entryContent = strings.Replace(entryContent, "{{"+keys[j]+"}}", entry[keys[j]], -1)
	}
	return entryContent
}*/
func getHtmlAndDataFromRepeatPages(page RepeatPages) (string, []dataEntry, *gabs.Container) {
	templateContent := readFile(rawFolderPath + "/" + page.HtmlPage)
	data, jsonData := getDataFromJson(rawFolderPath + "/" + page.Data)
	return templateContent, data, jsonData
}
