package cmd

import (
	"errors"
	"regexp"

	"github.com/filebrowser/filebrowser/v2/rules"
	"github.com/filebrowser/filebrowser/v2/settings"
	"github.com/filebrowser/filebrowser/v2/storage"
	"github.com/filebrowser/filebrowser/v2/users"
	"github.com/spf13/cobra"
)

func init() {
	rulesCmd.AddCommand(rulesAddCmd)
	rulesAddCmd.Flags().BoolP("allow", "a", false, "allow rule instead of disallow")
	rulesAddCmd.Flags().StringP("path", "p", "", "path to which the rule applies")
	rulesAddCmd.Flags().StringP("regex", "r", "", "regex to which the rule applies")
}

var rulesAddCmd = &cobra.Command{
	Use:   "add",
	Short: "Add a global rule or user rule",
	Long: `Add a global rule or user rule. You must
set either path or regex.`,
	Args: cobra.NoArgs,
	Run: func(cmd *cobra.Command, args []string) {
		allow := mustGetBool(cmd, "allow")
		path := mustGetString(cmd, "path")
		regex := mustGetString(cmd, "regex")

		if path == "" && regex == "" {
			panic(errors.New("you must set either --path or --regex flags"))
		}

		if path != "" && regex != "" {
			panic(errors.New("you can't set --path and --regex flags at the same time"))
		}

		if regex != "" {
			regexp.MustCompile(regex)
		}

		rule := rules.Rule{
			Allow: allow,
			Path:  path,
			Regex: regex != "",
			Regexp: &rules.Regexp{
				Raw: regex,
			},
		}

		user := func(u *users.User, st *storage.Storage) {
			u.Rules = append(u.Rules, rule)
			err := st.Users.Save(u)
			checkErr(err)
		}

		global := func(s *settings.Settings, st *storage.Storage) {
			s.Rules = append(s.Rules, rule)
			err := st.Settings.Save(s)
			checkErr(err)
		}

		runRules(cmd, user, global)
	},
}