package query

import (
	"fmt"
	"strings"

	"github.com/safing/portbase/database/accessor"
)

// And combines multiple conditions with a logical _AND_ operator.
func And(conditions ...Condition) Condition {
	return &andCond{
		conditions: conditions,
	}
}

type andCond struct {
	conditions []Condition
}

func (c *andCond) complies(acc accessor.Accessor) bool {
	for _, cond := range c.conditions {
		if !cond.complies(acc) {
			return false
		}
	}
	return true
}

func (c *andCond) check() (err error) {
	for _, cond := range c.conditions {
		err = cond.check()
		if err != nil {
			return err
		}
	}
	return nil
}

func (c *andCond) string() string {
	all := make([]string, 0, len(c.conditions))
	for _, cond := range c.conditions {
		all = append(all, cond.string())
	}
	return fmt.Sprintf("(%s)", strings.Join(all, " and "))
}
