/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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 org.onosproject.pce.pcestore;

import com.google.common.base.MoreObjects;

import java.util.Objects;

import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;
import org.onosproject.incubator.net.resource.label.LabelResourceId;
import org.onosproject.pce.pcestore.api.LspLocalLabelInfo;

/**
 * Local node details including IN and OUT labels as well as IN and OUT port details.
 */
public final class DefaultLspLocalLabelInfo implements LspLocalLabelInfo {

    private final DeviceId deviceId;

    private final LabelResourceId inLabelId;

    private final LabelResourceId outLabelId;

    private final PortNumber inPort;

    private final PortNumber outPort;

    /**
     * Initialization of member variables.
     *
     * @param deviceId device id
     * @param inLabelId in label id of a node
     * @param outLabelId out label id of a node
     * @param inPort input port
     * @param outPort remote port
     */
    private DefaultLspLocalLabelInfo(DeviceId deviceId,
                                     LabelResourceId inLabelId,
                                     LabelResourceId outLabelId,
                                     PortNumber inPort,
                                     PortNumber outPort) {
       this.deviceId = deviceId;
       this.inLabelId = inLabelId;
       this.outLabelId = outLabelId;
       this.inPort = inPort;
       this.outPort = outPort;
    }

    /**
     * Initialization of member variables for serialization.
     */
    private DefaultLspLocalLabelInfo() {
       this.deviceId = null;
       this.inLabelId = null;
       this.outLabelId = null;
       this.inPort = null;
       this.outPort = null;
    }

    @Override
    public DeviceId deviceId() {
       return deviceId;
    }

    @Override
    public LabelResourceId inLabelId() {
       return inLabelId;
    }

    @Override
    public LabelResourceId outLabelId() {
       return outLabelId;
    }

    @Override
    public PortNumber inPort() {
       return inPort;
    }

    @Override
    public PortNumber outPort() {
       return outPort;
    }

    @Override
    public int hashCode() {
        return Objects.hash(deviceId, inLabelId, outLabelId, inPort, outPort);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof LspLocalLabelInfo) {
            final DefaultLspLocalLabelInfo other = (DefaultLspLocalLabelInfo) obj;
            return Objects.equals(this.deviceId, other.deviceId) &&
                    Objects.equals(this.inLabelId, other.inLabelId) &&
                    Objects.equals(this.outLabelId, other.outLabelId) &&
                    Objects.equals(this.inPort, other.inPort) &&
                    Objects.equals(this.outPort, other.outPort);
        }
        return false;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
                .omitNullValues()
                .add("DeviceId", deviceId)
                .add("InLabelId", inLabelId)
                .add("OutLabelId", outLabelId)
                .add("InPort", inPort)
                .add("OutPort", outPort)
                .toString();
    }

    /**
     * Creates and returns a new builder instance that clones an existing object.
     *
     * @param deviceLabelInfo device label information
     * @return new builder
     */
    public static Builder builder(LspLocalLabelInfo deviceLabelInfo) {
        return new Builder(deviceLabelInfo);
    }

    /**
     * Creates and returns a new builder instance.
     *
     * @return new builder
     */
    public static Builder builder() {
        return new Builder();
    }

    /**
     * Builder.
     */
    public static final class Builder implements LspLocalLabelInfo.Builder {

        private DeviceId deviceId;

        private LabelResourceId inLabelId;

        private LabelResourceId outLabelId;

        private PortNumber inPort;

        private PortNumber outPort;

        /**
         * Constructs default builder.
         */
        private Builder() {
        }

        /**
         * Initializes member variables with existing object.
         */
        private Builder(LspLocalLabelInfo deviceLabelInfo) {
            this.deviceId = deviceLabelInfo.deviceId();
            this.inLabelId = deviceLabelInfo.inLabelId();
            this.outLabelId = deviceLabelInfo.outLabelId();
            this.inPort = deviceLabelInfo.inPort();
            this.outPort = deviceLabelInfo.outPort();
        }

        @Override
        public Builder deviceId(DeviceId id) {
            this.deviceId = id;
            return this;
        }

        @Override
        public Builder inLabelId(LabelResourceId id) {
            this.inLabelId = id;
            return this;
        }

        @Override
        public Builder outLabelId(LabelResourceId id) {
            this.outLabelId = id;
            return this;
        }

        @Override
        public Builder inPort(PortNumber port) {
            this.inPort = port;
            return this;
        }

        @Override
        public Builder outPort(PortNumber port) {
            this.outPort = port;
            return this;
        }

        @Override
        public LspLocalLabelInfo build() {
            return new DefaultLspLocalLabelInfo(deviceId, inLabelId, outLabelId, inPort, outPort);
        }
    }
}
