// 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/v23/context"
	"v.io/v23/naming"
	"v.io/v23/security/access"
	"v.io/v23/verror"
)

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

type service struct {
	c    wire.ServiceClientMethods
	name string
}

var _ Service = (*service)(nil)

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

// App implements Service.App.
func (s *service) App(relativeName string) App {
	name := naming.Join(s.name, relativeName)
	return &app{wire.AppClient(name), name, relativeName}
}

// ListApps implements Service.ListApps.
func (s *service) ListApps(ctx *context.T) ([]string, error) {
	return nil, verror.NewErrNotImplemented(ctx)
}

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