// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package testutil implements testing modules for common client operations.
package testutil

import (
	"fmt"
	"time"

	"v.io/v23"
	"v.io/v23/verror"
	"v.io/x/ref/test/modules"
	"v.io/x/sensorlog/internal/client"
	"v.io/x/sensorlog/internal/sbmodel"
	"v.io/x/sensorlog/internal/sbutil"
)

// Required parameters: sbService, devId, publishSb
var RunAddDevice = modules.Register(func(env *modules.Env, args ...string) error {
	sbService, devId, publishSb := args[0], args[1], args[2]

	ctx, cleanup := v23.Init()
	defer cleanup()
	db, err := sbutil.CreateOrOpenDB(ctx, sbService, sbmodel.MasterTables)
	if err != nil {
		return fmt.Errorf("failed initializing master database: %v", err)
	}

	if _, err := client.AddDevice(ctx, db, devId, publishSb, ""); err != nil {
		return fmt.Errorf("AddDevice %s failed: %v", devId, err)
	}
	if _, err := client.AddDevice(ctx, db, devId, publishSb, ""); verror.ErrorID(err) != verror.ErrExist.ID {
		return fmt.Errorf("repeat AddDevice %s should have failed with ErrExist, got: %v", devId, err)
	}

	return nil
}, "runAddDevice")

// Required parameters: sbService, devId, streamId, script, interval
var RunCreateStream = modules.Register(func(env *modules.Env, args ...string) error {
	sbService, devId, streamId, script, intervalStr := args[0], args[1], args[2], args[3], args[4]

	interval, err := time.ParseDuration(intervalStr)
	if err != nil {
		return err
	}

	ctx, cleanup := v23.Init()
	defer cleanup()
	db, err := sbutil.CreateOrOpenDB(ctx, sbService, sbmodel.MasterTables)
	if err != nil {
		return fmt.Errorf("failed opening master database: %v", err)
	}

	if _, err := client.CreateStream(ctx, db, &sbmodel.KDeviceCfg{DevId: devId}, streamId, "", interval, ""); err == nil {
		return fmt.Errorf("CreateStream %s with empty script should have failed", streamId)
	}
	if _, err := client.CreateStream(ctx, db, &sbmodel.KDeviceCfg{DevId: devId}, streamId, script, 42*time.Nanosecond, ""); err == nil {
		return fmt.Errorf("CreateStream %s with tiny duration should have failed", streamId)
	}
	if _, err := client.CreateStream(ctx, db, &sbmodel.KDeviceCfg{DevId: devId}, streamId, script, interval, ""); err != nil {
		return fmt.Errorf("CreateStream %s failed: %v", streamId, err)
	}
	if _, err := client.CreateStream(ctx, db, &sbmodel.KDeviceCfg{DevId: devId}, streamId, script, interval, ""); verror.ErrorID(err) != verror.ErrExist.ID {
		return fmt.Errorf("repeat CreateStream %s should have failed with ErrExist, got: %v", streamId, err)
	}

	return nil
}, "runCreateStream")
