package page

import (
	"log"
	"net/http"
	"text/template"

	"github.com/hacdias/caddy-hugo/assets"
	"github.com/hacdias/caddy-hugo/utils"
)

const (
	templateExtension = ".tmpl"
)

var funcMap = template.FuncMap{
	"splitCapitalize": utils.SplitCapitalize,
	"isMarkdown":      utils.IsMarkdownFile,
}

// Page type
type Page struct {
	Name string
	Body interface{}
}

// Render the page
func (p *Page) Render(w http.ResponseWriter, r *http.Request, templates ...string) (int, error) {
	tpl, err := GetTemplate(r, templates...)

	if err != nil {
		log.Print(err)
		return 500, err
	}

	tpl.Execute(w, p)
	return 200, nil
}

func GetTemplate(r *http.Request, templates ...string) (*template.Template, error) {
	if r.Header.Get("X-PJAX") == "true" {
		templates = append(templates, "base_minimal")
	} else {
		templates = append(templates, "base_full")
	}

	var tpl *template.Template

	for i, t := range templates {
		page, err := assets.Asset("templates/" + t + templateExtension)

		if err != nil {
			log.Print(err)
			return new(template.Template), err
		}

		if i == 0 {
			tpl, err = template.New(t).Funcs(funcMap).Parse(string(page))
		} else {
			tpl, err = tpl.Parse(string(page))
		}

		if err != nil {
			log.Print(err)
			return new(template.Template), err
		}
	}

	return tpl, nil
}