// 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 syncbase defines the client API for a structured store that supports
// peer-to-peer synchronization.
//
// TODO(sadovsky): Write a detailed package description.
package syncbase

import (
	"v.io/syncbase/v23/syncbase/nosql"
	"v.io/syncbase/v23/syncbase/util"
	"v.io/v23/context"
	"v.io/v23/security/access"
)

// NOTE(sadovsky): Various methods below may end up needing additional options.
// One can add options to a Go method in a backwards-compatible way by making
// the method variadic.

// TODO(sadovsky): Document the access control policy for every method where
// it's not obvious.

// Service represents a Vanadium Syncbase service.
// Use syncbase.NewService to get a Service.
type Service interface {
	// FullName returns the full name (object name) of this Service.
	FullName() string

	// App returns the App with the given name.
	// relativeName must not contain slashes.
	App(relativeName string) App

	// ListApps returns a list of all App names.
	ListApps(ctx *context.T) ([]string, error)

	// SetPermissions and GetPermissions are included from the AccessController
	// interface.
	util.AccessController
}

// App represents the data for a specific app instance (possibly a combination
// of user, device, and app).
type App interface {
	// Name returns the relative name of this App.
	Name() string

	// FullName returns the full name (object name) of this App.
	FullName() string

	// Exists returns true only if this App exists. Insufficient permissions
	// cause Exists to return false instead of an error.
	Exists(ctx *context.T) (bool, error)

	// NoSQLDatabase returns the nosql.Database with the given name.
	// relativeName must not contain slashes.
	// schema can be nil only if schema was never set for the database in the
	// first place. See nosql.Schema for more details.
	NoSQLDatabase(relativeName string, schema *nosql.Schema) nosql.Database

	// ListDatabases returns a list of all Database names.
	// TODO(kash): Include the database type (NoSQL vs. SQL).
	ListDatabases(ctx *context.T) ([]string, error)

	// Create creates this App.
	// If perms is nil, we inherit (copy) the Service perms.
	Create(ctx *context.T, perms access.Permissions) error

	// Delete deletes this App.
	Delete(ctx *context.T) error

	// SetPermissions and GetPermissions are included from the AccessController
	// interface.
	util.AccessController
}
