package api

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/photoprism/photoprism/internal/acl"
	"github.com/photoprism/photoprism/internal/event"
	"github.com/photoprism/photoprism/internal/i18n"
	"github.com/photoprism/photoprism/internal/service"
)

// GET /api/v1/settings
func GetSettings(router *gin.RouterGroup) {
	router.GET("/settings", func(c *gin.Context) {
		s := Auth(SessionID(c), acl.ResourceSettings, acl.ActionRead)

		if s.Invalid() {
			AbortUnauthorized(c)
			return
		}

		if settings := service.Config().Settings(); settings != nil {
			c.JSON(http.StatusOK, settings)
		} else {
			Abort(c, http.StatusNotFound, i18n.ErrNotFound)
		}
	})
}

// POST /api/v1/settings
func SaveSettings(router *gin.RouterGroup) {
	router.POST("/settings", func(c *gin.Context) {
		s := Auth(SessionID(c), acl.ResourceSettings, acl.ActionUpdate)

		if s.Invalid() {
			AbortUnauthorized(c)
			return
		}

		conf := service.Config()

		if conf.DisableSettings() {
			AbortUnauthorized(c)
			return
		}

		settings := conf.Settings()

		if err := c.BindJSON(settings); err != nil {
			AbortBadRequest(c)
			return
		}

		if err := settings.Save(conf.SettingsFile()); err != nil {
			c.AbortWithStatusJSON(http.StatusInternalServerError, err)
			return
		}

		UpdateClientConfig()

		event.InfoMsg(i18n.MsgSettingsSaved)

		c.JSON(http.StatusOK, settings)
	})
}
