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

package home

import (
	"net/http"

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

const carouselName = "home"

type AdminHandler struct {
	carousel *carousel.AdminHandler
}

func NewAdminHandler() *AdminHandler {
	return &AdminHandler{
		carousel: carousel.NewAdminHandler(carouselName, serveHomeIndex),
	}
}

func (h *AdminHandler) 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:
				serveHomeIndex(w, r, user, company, conn)
			default:
				httplib.MethodNotAllowed(w, r, http.MethodGet)
			}
		case "slides":
			h.carousel.Handler(user, company, conn).ServeHTTP(w, r)
		default:
			http.NotFound(w, r)
		}
	})
}

func serveHomeIndex(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) {
	slides, err := carousel.CollectSlideEntries(r.Context(), company, conn, carouselName)
	if err != nil {
		panic(err)
	}
	page := &homeIndex{
		Slides: slides,
	}
	page.MustRender(w, r, user, company)
}

type homeIndex struct {
	Slides []*carousel.SlideEntry
}

func (page *homeIndex) MustRender(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company) {
	template.MustRenderAdmin(w, r, user, company, "home/index.gohtml", page)
}
