/*
Copyright 2017 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package adapter

import (
	"strconv"

	"github.com/apid/istioApigeeAdapter/adapter/config"
	"istio.io/mixer/pkg/adapter"
)

const (
	rejectName = "rejecter"
	rejectDesc = "Reject unless the expression is 'true'"
)

var rejectConf = &config.RejectParams{}

type rejectBuilder struct {
	adapter.DefaultBuilder
}

type rejecter struct {
	message string
}

func newRejectBuilder() adapter.ListsBuilder {
	return rejectBuilder{
		adapter.NewDefaultBuilder(rejectName, rejectDesc, rejectConf),
	}
}

func (b rejectBuilder) NewListsAspect(env adapter.Env, c adapter.Config) (adapter.ListsAspect, error) {
	cfg := c.(*config.RejectParams)
	r := &rejecter{
		message: cfg.Message,
	}
	return r, nil
}

func (l *rejecter) Close() error {
	return nil
}

func (l *rejecter) CheckList(symbol string) (bool, error) {
	isTrue, err := strconv.ParseBool(symbol)
	if err != nil {
		// Error here means something like an empty string
		return false, nil
	}
	return isTrue, nil
}
