// 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.MasterCollections)
	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.MasterCollections)
	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
}
