package location

import (
	"dev.tandem.ws/tandem/camper/pkg/auth"
	"dev.tandem.ws/tandem/camper/pkg/database"
	httplib "dev.tandem.ws/tandem/camper/pkg/http"
	"dev.tandem.ws/tandem/camper/pkg/template"
	gotemplate "html/template"
	"net/http"
)

type PublicHandler struct {
}

func NewPublicHandler() *PublicHandler {
	return &PublicHandler{}
}

func (h *PublicHandler) Handler(user *auth.User, company *auth.Company, conn *database.Conn) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		var head string
		head, r.URL.Path = httplib.ShiftPath(r.URL.Path)

		switch head {
		case "":
			switch r.Method {
			case http.MethodGet:
				page := newLocationPage()
				page.MustRender(w, r, user, company, conn)
			default:
				httplib.MethodNotAllowed(w, r, http.MethodGet)
			}
		default:
			http.NotFound(w, r)
		}
	})
}

type locationPage struct {
	*template.PublicPage
	Directions gotemplate.HTML
	MapEmbed   gotemplate.HTML
}

func newLocationPage() *locationPage {
	page := &locationPage{
		PublicPage: template.NewPublicPage(),
	}
	return page
}

func (p *locationPage) MustRender(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) {
	p.Setup(r, user, company, conn)
	row := conn.QueryRow(r.Context(), `
		select coalesce(i18n.directions, location.directions)::text
		     , map_embed::text
		from location
		    left join location_i18n as i18n on location.company_id = i18n.company_id and i18n.lang_tag = $1
		where location.company_id = $2
		`, user.Locale.Language, company.ID)
	if err := row.Scan(&p.Directions, &p.MapEmbed); err != nil {
		if !database.ErrorIsNotFound(err) {
			panic(err)
		}
	}
	template.MustRenderPublic(w, r, user, company, "location.gohtml", p)
}