package models

import (
	"blog/config"
	"fmt"
	"html/template"
	"io"
)

type TemplatePointer struct {
	*template.Template
}

type HtmlTemplate struct {
	Talk       TemplatePointer
	Album      TemplatePointer
	Article    TemplatePointer
	Categories TemplatePointer
	Dashboard  TemplatePointer
	ExtraNav   TemplatePointer
	Index      TemplatePointer
}

func (t TemplatePointer) WriteData(w io.Writer, data interface{}) {

	err := t.Execute(w, data)
	if err != nil {
		if _, e := w.Write([]byte(err.Error())); e != nil {
			fmt.Println(e)
		}
	}
}

func (t TemplatePointer) WriteError(w io.Writer, err error) {
	if _, e := w.Write([]byte(err.Error())); e != nil {
		fmt.Println(e)
	}
}

func BuildViewData(title string, data interface{}) map[string]interface{} {
	return map[string]interface{}{
		"Title":  title,
		"Data":   data,
		"Config": config.Cfg,
		"Navs":   Navigation,
	}
}

func initHtmlTemplate(viewDir string) (HtmlTemplate, error) {
	var htmlTemplate HtmlTemplate

	tp, err := readHtmlTemplate(
		[]string{"index", "extraNav", "dashboard", "categories", "article", "album", "talk"},
		viewDir)
	if err != nil {
		return htmlTemplate, err
	}

	htmlTemplate.Index = tp[0]
	htmlTemplate.ExtraNav = tp[1]
	htmlTemplate.Dashboard = tp[2]
	htmlTemplate.Categories = tp[3]
	htmlTemplate.Article = tp[4]
	htmlTemplate.Album = tp[5]
	htmlTemplate.Talk = tp[6]

	return htmlTemplate, nil
}

func SpreadDigit(n int) []int {
	var r []int
	for i := 1; i <= n; i++ {
		r = append(r, i)
	}
	return r
}

func readHtmlTemplate(htmlFileName []string, viewDir string) ([]TemplatePointer, error) {
	var htmlTemplate []TemplatePointer

	head := viewDir + "/layouts/head.html"
	footer := viewDir + "/layouts/footer.html"
	reviews := viewDir + "/layouts/reviews.html"
	for _, name := range htmlFileName {

		tp, err := template.New(name+".html").
			Funcs(template.FuncMap{"SpreadDigit": SpreadDigit}).
			ParseFiles(viewDir+"/"+name+".html", head, footer, reviews)
		if err != nil {
			return htmlTemplate, err
		}
		htmlTemplate = append(htmlTemplate, TemplatePointer{tp})
	}
	return htmlTemplate, nil
}