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

import (
	"v.io/v23/context"
	"v.io/v23/naming"
	"v.io/v23/rpc"
	"v.io/v23/security"
)

type rpcCall struct {
	rpc.ServerCall
	secCall security.Call
}

func (c rpcCall) Security() security.Call         { return c.secCall }
func (c rpcCall) LocalEndpoint() naming.Endpoint  { return naming.Endpoint{} }
func (c rpcCall) RemoteEndpoint() naming.Endpoint { return naming.Endpoint{} }

func fakeContextAndCall(provider, user security.Principal) (*context.T, rpc.ServerCall) {
	ctx, _ := context.RootContext()
	return ctx, fakeCall(provider, user)
}

func fakeCall(provider, user security.Principal) rpc.ServerCall {
	return rpcCall{secCall: security.NewCall(&security.CallParams{
		LocalPrincipal:  provider,
		LocalBlessings:  blessSelf(provider, "provider"),
		RemoteBlessings: blessSelf(user, "self-signed-user"),
	})}
}

func blessSelf(p security.Principal, name string) security.Blessings {
	b, err := p.BlessSelf(name)
	if err != nil {
		panic(err)
	}
	return b
}

func newCaveat(c security.Caveat, err error) security.Caveat {
	if err != nil {
		panic(err)
	}
	return c
}
