package api_rest

import (
	"errors"
	"fmt"
	"time"

	"github.com/bettercap/recording"

	"github.com/evilsocket/islazy/fs"
)

var (
	errNotReplaying = errors.New("not replaying")
)

func (mod *RestAPI) errAlreadyReplaying() error {
	return fmt.Errorf("the module is already replaying a session from %s", mod.recordFileName)
}

func (mod *RestAPI) startReplay(filename string) (err error) {
	if mod.replaying {
		return mod.errAlreadyReplaying()
	} else if mod.recording {
		return mod.errAlreadyRecording()
	} else if mod.recordFileName, err = fs.Expand(filename); err != nil {
		return err
	}

	mod.State.Store("load_progress", 0)
	defer func() {
		mod.State.Store("load_progress", 100.0)
	}()

	mod.loading = true
	defer func() {
		mod.loading = false
	}()

	mod.Info("loading %s ...", mod.recordFileName)

	start := time.Now()
	mod.record, err = recording.Load(mod.recordFileName, func(progress float64, done int, total int) {
		mod.State.Store("load_progress", progress)
	})
	if err != nil {
		return err
	}
	loadedIn := time.Since(start)

	// we need the api itself up and running
	if !mod.Running() {
		if err := mod.Start(); err != nil {
			return err
		}
	}

	mod.recStarted = mod.record.Session.StartedAt()
	mod.recStopped = mod.record.Session.StoppedAt()
	duration := mod.recStopped.Sub(mod.recStarted)
	mod.recTime = int(duration.Seconds())
	mod.replaying = true
	mod.recording = false

	mod.Info("loaded %s of recording (%d frames) started at %s in %s, started replaying ...",
		duration,
		mod.record.Session.Frames(),
		mod.recStarted,
		loadedIn)

	return nil
}

func (mod *RestAPI) stopReplay() error {
	if !mod.replaying {
		return errNotReplaying
	}

	mod.replaying = false

	mod.Info("stopped replaying from %s ...", mod.recordFileName)

	mod.recordFileName = ""

	return nil
}