// Package flag defines a method for parsing ACL flags and constructing
// a security.Authorizer based on them.
package flag

import (
	"bytes"
	"errors"
	"flag"
	"os"

	"v.io/core/veyron2/security"
	"v.io/core/veyron2/services/security/access"

	"v.io/core/veyron/lib/flags"
)

var authFlags *flags.Flags

func init() {
	authFlags = flags.CreateAndRegister(flag.CommandLine, flags.ACL)
}

// NewAuthorizerOrDie constructs an Authorizer based on the provided "--veyron.acl.literal" or
// "--veyron.acl.file" flags. Otherwise it creates a default Authorizer.
func NewAuthorizerOrDie() security.Authorizer {
	flags := authFlags.ACLFlags()
	fname := flags.ACLFile("runtime")
	literal := flags.ACLLiteral()

	if fname == "" && literal == "" {
		return nil
	}
	var a security.Authorizer
	var err error
	if literal == "" {
		a, err = access.TaggedACLAuthorizerFromFile(fname, access.TypicalTagType())
	} else {
		var tam access.TaggedACLMap
		if tam, err = access.ReadTaggedACLMap(bytes.NewBufferString(literal)); err == nil {
			a, err = access.TaggedACLAuthorizer(tam, access.TypicalTagType())
		}
	}
	if err != nil {
		panic(err)
	}
	return a
}

// TODO(rjkroege): Refactor these two functions into one by making an Authorizer
// use a TaggedACLMap accessor interface.
// TaggedACLMapFromFlag reads the same flags as NewAuthorizerOrDie but
// produces a TaggedACLMap for callers that need more control of how ACLs
// are managed.
func TaggedACLMapFromFlag() (access.TaggedACLMap, error) {
	flags := authFlags.ACLFlags()
	fname := flags.ACLFile("runtime")
	literal := flags.ACLLiteral()

	if fname == "" && literal == "" {
		return nil, nil
	}

	if literal == "" {
		file, err := os.Open(fname)
		if err != nil {
			return nil, errors.New("cannot open argument to --veyron.acl.file " + fname)
		}
		defer file.Close()
		return access.ReadTaggedACLMap(file)
	} else {
		return access.ReadTaggedACLMap(bytes.NewBufferString(literal))
	}
}
