package com.infoclinika.pdx.specification;

import java.io.Serializable;
import java.util.Objects;

/**
 * Search criteria holder.
 */
public class SearchCriteria implements Serializable {
    private static final long serialVersionUID = 2483293579584039623L;
    private final String key;
    private final String operation;
    private final String value;

    /**
     * All fields initializer.
     *
     * @param key       represents field of searched entity. Can be nested.
     * @param operation can be the following: ":" - in, ">", "<"
     * @param value     value to be used in criteria
     */
    public SearchCriteria(String key, String operation, String value) {
        this.key = key;
        this.operation = operation;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public String getOperation() {
        return operation;
    }

    public String getValue() {
        return value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        final SearchCriteria that = (SearchCriteria) o;
        return Objects.equals(getKey(), that.getKey())
               && Objects.equals(getOperation(), that.getOperation())
               && Objects.equals(getValue(), that.getValue());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getKey(), getOperation(), getValue());
    }

    @Override
    public String toString() {
        return "SearchCriteria{"
               + "key='" + key + '\''
               + ", operation='" + operation + '\''
               + ", value='" + value + '\''
               + '}';
    }
}
