// 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/context"
	"v.io/v23/verror"
	"v.io/x/sensorlog/internal/client"
	"v.io/x/sensorlog/internal/sbmodel"
	"v.io/x/sensorlog/internal/sbutil"
)

func AddTestDevice(ctx *context.T, sbService, devId, publishSb string) error {
	db, err := sbutil.CreateOrOpenDB(ctx, sbService, sbmodel.MasterTables)
	if err != nil {
		return fmt.Errorf("failed opening 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
}

func CreateTestStream(ctx *context.T, sbService, devId, streamId, script string, interval time.Duration) error {
	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
}
