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

package app

import (
	"net/http"

	"dev.tandem.ws/tandem/camper/pkg/auth"
	"dev.tandem.ws/tandem/camper/pkg/campsite"
	"dev.tandem.ws/tandem/camper/pkg/company"
	"dev.tandem.ws/tandem/camper/pkg/database"
	httplib "dev.tandem.ws/tandem/camper/pkg/http"
	"dev.tandem.ws/tandem/camper/pkg/season"
	"dev.tandem.ws/tandem/camper/pkg/template"
)

type adminHandler struct {
	campsite *campsite.AdminHandler
	company  *company.AdminHandler
	season   *season.AdminHandler
}

func newAdminHandler() *adminHandler {
	return &adminHandler{
		campsite: campsite.NewAdminHandler(),
		company:  company.NewAdminHandler(),
		season:   season.NewAdminHandler(),
	}
}

func (h *adminHandler) Handle(user *auth.User, company *auth.Company, conn *database.Conn) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if !user.LoggedIn {
			w.WriteHeader(http.StatusUnauthorized)
			serveLoginForm(w, r, user, company, r.RequestURI)
			return
		}

		if !user.IsEmployee() {
			http.Error(w, user.Locale.Gettext("Access forbidden"), http.StatusForbidden)
			return
		}

		var head string
		head, r.URL.Path = httplib.ShiftPath(r.URL.Path)
		switch head {
		case "campsites":
			h.campsite.Handler(user, company, conn).ServeHTTP(w, r)
		case "company":
			h.company.Handler(user, company, conn).ServeHTTP(w, r)
		case "seasons":
			h.season.Handler(user, company, conn).ServeHTTP(w, r)
		case "":
			switch r.Method {
			case http.MethodGet:
				serveDashboard(w, r, user, company)
			default:
				httplib.MethodNotAllowed(w, r, http.MethodGet)
			}
		default:
			http.NotFound(w, r)
		}
	})
}

func serveDashboard(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company) {
	template.MustRenderAdmin(w, r, user, company, "dashboard.gohtml", nil)
}
