/*
   Nging is a toolbox for webmasters
   Copyright (C) 2018-present Wenhui Shen <swh@admpub.com>

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU Affero General Public License as published
   by the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU Affero General Public License for more details.

   You should have received a copy of the GNU Affero General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/

package manager

import (
	"github.com/coscms/webcore/library/backend"
	"github.com/coscms/webcore/library/common"
	"github.com/coscms/webcore/library/config"
	"github.com/coscms/webcore/library/errorslice"
	"github.com/coscms/webcore/registry/settings"
	"github.com/webx-top/com"
	"github.com/webx-top/echo"
)

func Settings(ctx echo.Context) error {
	//panic(echo.Dump(settings.ConfigAsStore(), false))
	//return ctx.JSON(config.FromFile())
	errs := errorslice.New()
	group := ctx.Form(`group`, `base`)
	var groups []string
	if len(group) > 0 {
		groups = append(groups, group)
	}
	if ctx.IsPost() {
		if com.InSlice(`base`, groups) && len(ctx.FormValues(`base[pprof][value]`)) == 0 {
			ctx.Request().Form().Set(`base[pprof][value]`, ``)
		}

		err := configPost(ctx, groups...)
		if err != nil {
			errs.Add(err)
		}
		err = settings.RunHookPost(ctx, groups...)
		if err != nil {
			errs.Add(err)
		}
		if len(groups) > 0 {
			if com.InSlice(`base`, groups) {
				config.FromFile().SetDebug(ctx.Formx(`base[debug][value]`).Bool())
			}
			err = config.FromFile().Settings().SetConfigs(ctx, groups...)
		} else {
			err = config.FromFile().Settings().Init(ctx)
		}
		if err != nil {
			errs.Add(err)
		}
		err = errs.ToError()
		if err != nil {
			goto END
		}
		common.SendOk(ctx, ctx.T(`操作成功`))
		return ctx.Redirect(backend.URLFor(`/manager/settings?group=` + group))
	}

END:
	if _err := configGet(ctx, groups...); _err != nil {
		errs.Add(_err)
	}
	if _err := settings.RunHookGet(ctx, groups...); _err != nil {
		errs.Add(_err)
	}

	ctx.Set(`group`, group)
	ctx.SetFunc(`getSettings`, settings.Settings)
	ctx.SetFunc(`hasConfigGroup`, settings.ConfigHasGroup)
	ctx.SetFunc(`hasConfigKey`, settings.ConfigHasKey)
	return ctx.Render(`/manager/settings`, common.Err(ctx, errs.ToError()))
}
