// 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

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

func NewService(fullName string) Service {
	return &service{wire.ServiceClient(fullName), fullName}
}

type service struct {
	c        wire.ServiceClientMethods
	fullName string
}

var _ Service = (*service)(nil)

// TODO(sadovsky): Validate names before sending RPCs.

// FullName implements Service.FullName.
func (s *service) FullName() string {
	return s.fullName
}

// App implements Service.App.
func (s *service) App(relativeName string) App {
	return newApp(s.fullName, relativeName)
}

// ListApps implements Service.ListApps.
func (s *service) ListApps(ctx *context.T) ([]string, error) {
	return util.List(ctx, s.fullName)
}

// SetPermissions implements Service.SetPermissions.
func (s *service) SetPermissions(ctx *context.T, perms access.Permissions, version string) error {
	return s.c.SetPermissions(ctx, perms, version)
}

// GetPermissions implements Service.GetPermissions.
func (s *service) GetPermissions(ctx *context.T) (perms access.Permissions, version string, err error) {
	return s.c.GetPermissions(ctx)
}
