package main

import (
	"context"
	"encoding/json"
	"fmt"
	"io/ioutil"

	"github.com/apex/log"
	"github.com/ooni/probe-cli/v3/internal/engine/mockable"
	"github.com/ooni/probe-cli/v3/internal/model"
	"golang.org/x/sys/execabs"
)

func main() {
	if _, err := execabs.LookPath("tor"); err != nil {
		log.Fatal("cannot find the tor executable in path")
	}
	tempdir, err := ioutil.TempDir("", "")
	if err != nil {
		log.WithError(err).Fatal("cannot create temporary directory")
	}
	// -=-=- StartHere -=-=-
	//
	// # Chapter II: creating an empty experiment
	//
	// In this chapter we will create an empty experiment and replace
	// the code calling the real `torsf` experiment in `main.go` to
	// call our empty experiment instead.
	//
	// (This file is auto-generated from the corresponding source file,
	// so make sure you don't edit it manually.)
	//
	// ## Changes in main.go
	//
	// In `main.go` we will simply replace the call to the
	// `torsf.NewExperimentMeasurer` function with a call to
	// a `NewExperimentMeasurer` function that we are going
	// to implement as part of this chapter.
	//
	// After you do this, you also need to remove the now-unneded
	// import of the `torsf` package.
	//
	// There are no additional changes to `main.go`.
	//
	// ```Go
	m := NewExperimentMeasurer(Config{})
	// ```
	// -=-=- StopHere -=-=-
	ctx := context.Background()
	measurement := &model.Measurement{}
	callbacks := model.NewPrinterCallbacks(log.Log)
	sess := &mockable.Session{
		MockableLogger:  log.Log,
		MockableTempDir: tempdir,
	}
	if err = m.Run(ctx, sess, measurement, callbacks); err != nil {
		log.WithError(err).Fatal("torsf experiment failed")
	}
	data, err := json.Marshal(measurement)
	if err != nil {
		log.WithError(err).Fatal("json.Marshal failed")
	}
	fmt.Printf("%s\n", data)
}