/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.vxquery.rest.response;

import javax.xml.bind.annotation.XmlRootElement;

/**
 * Represents the
 * 
 * <pre>
 * error
 * </pre>
 * 
 * part of an {@link ErrorResponse}.
 * 
 * <pre>
 *     {@code
 *     <error>
 *         <code>405</code>
 *         <message>Invalid Input</message>
 *     </error>}
 * </pre>
 *
 * @author Erandi Ganepola
 */
@XmlRootElement
public class Error {

    private int code;
    private String message;

    public Error() {
    }

    public Error(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private int code = -1;
        private String message = null;

        public Builder withCode(int code) {
            this.code = code;
            return this;
        }

        public Builder withMessage(String message) {
            this.message = message;
            return this;
        }

        public Error build() {
            if (code == -1) {
                code = 500;
            }

            if (message == null) {
                message = "unexpected Error";
            }

            return new Error(code, message);
        }
    }
}
