package app

import (
	"encoding/json"
	"fmt"
	"os/exec"
	"path"
	"strings"

	"github.com/wailsapp/wails/v2/pkg/runtime"
)

type DumpInfo struct {
	OutDir   string   `json:"outdir"`
	Filename string   `json:"filename"`
	HostKey  string   `json:"hostKey"`
	DbKey    string   `json:"dbKey"`
	CollKeys []string `json:"collKeys"`
}

func (a *App) PerformDump(jsonData string) bool {
	var info DumpInfo
	err := json.Unmarshal([]byte(jsonData), &info)
	if err != nil {
		runtime.LogErrorf(a.ctx, "Could not unmarshal dump form: %s", err.Error())
		runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{
			Title:   "Malformed JSON",
			Message: err.Error(),
			Type:    runtime.ErrorDialog,
		})
		return false
	}

	hosts, err := a.Hosts()
	if err != nil {
		runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{
			Title:   "Error getting hosts",
			Message: err.Error(),
			Type:    runtime.ErrorDialog,
		})
		return false
	}
	host := hosts[info.HostKey]

	if !a.Env.HasMongoDump {
		runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{
			Title:   "Additional tooling required",
			Message: "You need to install mongodump to perform a dump.",
			Type:    runtime.ErrorDialog,
		})
		return false
	}

	args := make([]string, 0)
	args = append(args, fmt.Sprintf(`--uri="%v"`, host.URI))
	fname := path.Join(info.OutDir, info.Filename)

	if info.DbKey != "" {
		args = append(args, fmt.Sprintf(`--db="%v"`, info.DbKey))

		if info.CollKeys != nil {
			args = append(args, fmt.Sprintf(`--collection="%v"`, info.CollKeys[0]))
		}
	}

	args = append(args, fmt.Sprintf(`--out="%v"`, fname))
	cmd := exec.Command("mongodump", args...)
	var stdout strings.Builder
	var stderr strings.Builder
	cmd.Stdout = &stdout
	cmd.Stderr = &stderr
	err = cmd.Run()

	runtime.LogInfo(a.ctx, "Performing dump, executing command: mongodump "+strings.Join(args, " "))
	runtime.LogInfo(a.ctx, "mongodump stdout: "+stdout.String())
	runtime.LogInfo(a.ctx, "mongodump sterr: "+stderr.String())

	if err != nil {
		runtime.LogWarning(a.ctx, "Error while executing mongodump: "+err.Error())
		return false
	}

	println(fname)

	a.ui.Reveal(fname)
	return true
}