package legal

import (
	"context"
	"dev.tandem.ws/tandem/camper/pkg/locale"
	gotemplate "html/template"
	"net/http"

	"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"
)

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 slug string
		slug, r.URL.Path = httplib.ShiftPath(r.URL.Path)

		var head string
		head, r.URL.Path = httplib.ShiftPath(r.URL.Path)

		switch head {
		case "":
			switch r.Method {
			case http.MethodGet:
				page, err := newLegalPage(r.Context(), company, conn, user.Locale, slug)
				if database.ErrorIsNotFound(err) {
					http.NotFound(w, r)
					return
				} else if err != nil {
					panic(err)
				}
				page.MustRender(w, r, user, company, conn)
			default:
				httplib.MethodNotAllowed(w, r, http.MethodGet)
			}
		default:
			http.NotFound(w, r)
		}
	})
}

type legalPage struct {
	*template.PublicPage
	Name    string
	Content gotemplate.HTML
}

func newLegalPage(ctx context.Context, company *auth.Company, conn *database.Conn, loc *locale.Locale, slug string) (*legalPage, error) {
	page := &legalPage{
		PublicPage: template.NewPublicPage(),
	}
	row := conn.QueryRow(ctx, `
		select coalesce(i18n.name, text.name) as l10n_name
		     , coalesce(i18n.content, text.content)::text as l10n_description
		from legal_text as text
		    left join legal_text_i18n as i18n on text.company_id = i18n.company_id and text.slug = i18n.slug and i18n.lang_tag = $1
		where text.company_id = $2
		  and text.slug = $3
	`, loc.Language, company.ID, slug)
	if err := row.Scan(&page.Name, &page.Content); err != nil {
		return nil, err
	}
	return page, nil
}

func (p *legalPage) MustRender(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) {
	p.Setup(r, user, company, conn)
	template.MustRenderPublic(w, r, user, company, "legal.gohtml", p)
}