/*
 * SPDX-FileCopyrightText: 2023 jordi fita mas <jfita@peritasoft.com>
 * SPDX-License-Identifier: AGPL-3.0-only
 */

package template

import (
	"fmt"
	"html/template"
	"io"
	"net/http"

	"dev.tandem.ws/tandem/camper/pkg/auth"
	httplib "dev.tandem.ws/tandem/camper/pkg/http"
)

func adminTemplateFile(name string) string {
	return "web/templates/admin/" + name
}

func publicTemplateFile(name string) string {
	return "web/templates/public/" + name
}

func MustRenderAdmin(w io.Writer, r *http.Request, user *auth.User, company *auth.Company, filename string, data interface{}) {
	layout := "layout.gohtml"
	if httplib.IsHTMxRequest(r) {
		layout = "htmx.gohtml"
	}
	mustRenderLayout(w, user, company, adminTemplateFile, layout, filename, data)
}

func MustRenderPublic(w io.Writer, r *http.Request, user *auth.User, company *auth.Company, filename string, data interface{}) {
	layout := "layout.gohtml"
	mustRenderLayout(w, user, company, publicTemplateFile, layout, filename, data)
}

func mustRenderLayout(w io.Writer, user *auth.User, company *auth.Company, templateFile func(string) string, layout string, filename string, data interface{}) {
	t := template.New(filename)
	t.Funcs(template.FuncMap{
		"gettext":  user.Locale.Get,
		"pgettext": user.Locale.GetC,
		"currentLocale": func() string {
			return user.Locale.Language.String()
		},
		"isLoggedIn": func() bool {
			return user.LoggedIn
		},
		"isAdmin": user.IsAdmin,
		"CSRFHeader": func() string {
			return fmt.Sprintf(`"%s": "%s"`, auth.CSRFTokenHeader, user.CSRFToken)
		},
		"CSRFInput": func() template.HTML {
			return template.HTML(fmt.Sprintf(`<input type="hidden" name="%s" value="%s">`, auth.CSRFTokenField, user.CSRFToken))
		},
		"raw": func(s string) template.HTML {
			return template.HTML(s)
		},
	})
	if _, err := t.ParseFiles(templateFile(layout), templateFile("form.gohtml"), templateFile(filename)); err != nil {
		panic(err)
	}
	if rw, ok := w.(http.ResponseWriter); ok {
		rw.Header().Set("Content-Type", "text/html; charset=utf-8")
	}
	if err := t.ExecuteTemplate(w, layout, data); err != nil {
		panic(err)
	}
}
