package security

import (
	"bytes"
	"errors"
	"fmt"

	"veyron/runtimes/google/security/keys"
	"veyron2/naming"
	"veyron2/security"
)

var errDeriveMismatch = errors.New("public key does not match that of deriving identity")

// TrustIdentityProviders registers the identity providers of "id" as trustworthy ones,
// i.e., any identities created by those providers will be considered trustworthy.
func TrustIdentityProviders(id security.PrivateID) {
	switch t := id.(type) {
	case *chainPrivateID:
		keys.Trust(t.publicID.rootKey, t.publicID.certificates[0].Name)
	case setPrivateID:
		for _, priv := range t {
			TrustIdentityProviders(priv)
		}
	default:
		// Silently ignore
	}
}

// ContextArgs holds the arguments for creating a new security.Context for an IPC.
type ContextArgs struct {
	// LocalID, RemoteID are the identities at the local and remote ends of a request
	// respectively.
	LocalID, RemoteID security.PublicID
	// Discharges is the set of third-party caveat discharges for the identity at the remote end
	// of the request.
	Discharges security.CaveatDischargeMap
	// Debug describes the context for debugging purposes.
	Debug string
	// The following fields must be set only for contexts created at the server receiving the IPC.
	//
	// Method is the name of the method being invoked.
	Method string
	// Name is the undispatched name for the request.
	Name string
	// Suffix is the object name suffix for the request.
	Suffix string
	// Label is the security label of the method being invoked.
	Label security.Label
	// LocalEndpoint, RemoteEndpoint are the veyron endpoints of the local and remote ends of a request
	LocalEndpoint, RemoteEndpoint naming.Endpoint
}

// context implements security.Context. This implementation simply stores the
// method, label, suffix, and the identities of the local and remote principals
// associated with an IPC call in the context object.
type context struct {
	ContextArgs
	Debug string
}

func (c *context) String() string {
	// fmt.Sprintf("%#v", c) doesn't work because it does not expand
	// localID, remoteID etc.
	if len(c.ContextArgs.Debug) > 0 {
		return c.Debug
	}
	var buf bytes.Buffer
	buf.WriteString("{")
	if c.ContextArgs.LocalID != nil {
		buf.WriteString(fmt.Sprintf(" LocalID:%q", c.LocalID()))
	}
	if c.ContextArgs.RemoteID != nil {
		buf.WriteString(fmt.Sprintf(" RemoteID:%q", c.RemoteID()))
	}
	if len(c.ContextArgs.Method) > 0 {
		buf.WriteString(fmt.Sprintf(" Method:%q", c.Method()))
	}
	if len(c.ContextArgs.Name) > 0 {
		buf.WriteString(fmt.Sprintf(" Name:%q", c.Name()))
	}
	if len(c.ContextArgs.Suffix) > 0 {
		buf.WriteString(fmt.Sprintf(" Suffix:%q", c.Suffix()))
	}
	if c.ContextArgs.Label != 0 {
		buf.WriteString(fmt.Sprintf(" Label:%v", c.Label()))
	}
	if len(c.ContextArgs.Discharges) > 0 {
		buf.WriteString(fmt.Sprintf(" #Discharges:%d", len(c.Discharges)))
	}
	buf.WriteString(" }")
	return buf.String()
}

func (c *context) Method() string                                { return c.ContextArgs.Method }
func (c *context) Name() string                                  { return c.ContextArgs.Name }
func (c *context) Suffix() string                                { return c.ContextArgs.Suffix }
func (c *context) Label() security.Label                         { return c.ContextArgs.Label }
func (c *context) CaveatDischarges() security.CaveatDischargeMap { return c.ContextArgs.Discharges }
func (c *context) LocalID() security.PublicID                    { return c.ContextArgs.LocalID }
func (c *context) RemoteID() security.PublicID                   { return c.ContextArgs.RemoteID }
func (c *context) LocalEndpoint() naming.Endpoint                { return c.ContextArgs.LocalEndpoint }
func (c *context) RemoteEndpoint() naming.Endpoint               { return c.ContextArgs.RemoteEndpoint }

// NewContext returns a new security.Context for the provided method, name,
// suffix, discharges, label and identities of the local and remote principals
// associated with an IPC invocation.
func NewContext(args ContextArgs) security.Context {
	return &context{ContextArgs: args}
}
