package cmd

import (
	"fmt"

	"github.com/cupcakearmy/autorestic/internal"
	"github.com/cupcakearmy/autorestic/internal/lock"
	"github.com/spf13/cobra"
)

var restoreCmd = &cobra.Command{
	Use:   "restore [snapshot id]",
	Short: "Restore backup for location",
	Args:  cobra.MaximumNArgs(1),
	Run: func(cmd *cobra.Command, args []string) {
		internal.GetConfig()
		err := lock.Lock()
		CheckErr(err)
		defer lock.Unlock()

		location, _ := cmd.Flags().GetString("location")
		l, ok := internal.GetLocation(location)
		if !ok {
			CheckErr(fmt.Errorf("invalid location \"%s\"", location))
		}
		target, _ := cmd.Flags().GetString("to")
		from, _ := cmd.Flags().GetString("from")
		force, _ := cmd.Flags().GetBool("force")
		snapshot := ""
		if len(args) > 0 {
			snapshot = args[0]
		}

		// Get optional flags
		optional := []string{}
		for _, flag := range []string{"include", "exclude", "iinclude", "iexclude"} {
			values, err := cmd.Flags().GetStringSlice(flag)
			if err == nil {
				for _, value := range values {
					optional = append(optional, "--"+flag, value)
				}
			}
		}

		err = l.Restore(target, from, force, snapshot, optional)
		CheckErr(err)
	},
}

func init() {
	rootCmd.AddCommand(restoreCmd)
	restoreCmd.Flags().BoolP("force", "f", false, "Force, target folder will be overwritten")
	restoreCmd.Flags().String("from", "", "Which backend to use")
	restoreCmd.Flags().String("to", "", "Where to restore the data")
	restoreCmd.Flags().StringP("location", "l", "", "Location to be restored")
	restoreCmd.MarkFlagRequired("location")

	// Passed on flags
	restoreCmd.Flags().StringSliceP("include", "i", []string{}, "Include a pattern")
	restoreCmd.Flags().StringSliceP("exclude", "e", []string{}, "Exclude a pattern")
	restoreCmd.Flags().StringSlice("iinclude", []string{}, "Include a pattern, case insensitive")
	restoreCmd.Flags().StringSlice("iexclude", []string{}, "Exclude a pattern, case insensitive")
}