package mfilesclient

import (
	"github.com/M-Files/mfiles-grpc-api/go/mfiles"
)

// Search conditions. A SearchObjectsRequest ANDs the conditions inside one
// SearchConditionArray and ORs the arrays.

// [START conditions]

// StatusCondition compares a status value of the object, such as its object type or whether
// it is deleted.
func StatusCondition(status mfiles.StatusType, condition mfiles.ConditionType,
	value *mfiles.TypedValue) *mfiles.SearchCondition {
	return &mfiles.SearchCondition{
		Expression: &mfiles.Expression{
			Type: mfiles.ExpressionType_EXPRESSION_TYPE_STATUS_VALUE,
			Data: &mfiles.ExpressionUnion{Data: &mfiles.ExpressionUnion_StatusValue{
				StatusValue: &mfiles.ExpressionUnion_StatusValueData{Type: status},
			}},
		},
		Type:  condition,
		Value: value,
	}
}

// PropertyCondition compares a property value of the object, such as its class (property 100)
// or "Last modified" (property 21).
func PropertyCondition(propertyDef int32, condition mfiles.ConditionType,
	value *mfiles.TypedValue) *mfiles.SearchCondition {
	return &mfiles.SearchCondition{
		Expression: &mfiles.Expression{
			Type: mfiles.ExpressionType_EXPRESSION_TYPE_PROPERTY_VALUE,
			Data: &mfiles.ExpressionUnion{Data: &mfiles.ExpressionUnion_PropertyValue{
				PropertyValue: &mfiles.ExpressionUnion_PropertyValueData{PropertyDef: propertyDef},
			}},
		},
		Type:  condition,
		Value: value,
	}
}

// IsObjectType matches objects of one object type (0 = document). Value list -11 lists the
// object types.
func IsObjectType(objectType int32) *mfiles.SearchCondition {
	return StatusCondition(mfiles.StatusType_STATUS_TYPE_OBJECT_TYPE,
		mfiles.ConditionType_CONDITION_TYPE_EQUAL, Lookup(-11, objectType))
}

// IsNotDeleted matches objects that are not deleted.
func IsNotDeleted() *mfiles.SearchCondition {
	return StatusCondition(mfiles.StatusType_STATUS_TYPE_IS_DELETED,
		mfiles.ConditionType_CONDITION_TYPE_EQUAL, Boolean(false))
}

// [END conditions]

// SortBy sorts search results by one key, such as a property definition ID.
func SortBy(key int32, descending bool) *mfiles.SearchResultsSorting {
	return &mfiles.SearchResultsSorting{Rules: &mfiles.SortRuleValueArray{
		Values: []*mfiles.SortRule{
			{Key: key, Options: &mfiles.SortRuleFlags{SortDescending: descending}},
		},
	}}
}

// AllOf combines conditions with AND into the form SearchObjectsRequest.Conditions takes.
func AllOf(conditions ...*mfiles.SearchCondition) []*mfiles.SearchConditionArray {
	return []*mfiles.SearchConditionArray{{Value: conditions}}
}
