/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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.tetunnel.api.lsp;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import org.onosproject.tetopology.management.api.node.TeNodeKey;
import org.onosproject.tetopology.management.api.node.TtpKey;
import org.onosproject.tetunnel.api.tunnel.TeTunnel;
import org.onosproject.tetunnel.api.tunnel.TeTunnelKey;
import org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject;

import java.util.List;

/**
 * Default implementation of TE LSP.
 */
public class DefaultTeLsp implements TeLsp {

    private final TeLspKey teLspKey;
    private final TeNodeKey srcNode;
    private final TeNodeKey dstNode;
    private final TtpKey srcTp;
    private final TtpKey dstTp;
    private final TeTunnelKey teTunnelKey;
    private final TeTunnel.Type tunnelType;
    private final TeTunnel.State operStatus;
    private final LspProtectionRole lspProtectionRole;
    private final OriginType originType;
    private final List<TeRouteSubobject> lspRecordRoutes;

    /**
     * Creates an instance of default TE LSP with supplied information.
     *
     * @param teLspKey TE LSP key
     * @param srcNode source TE node key
     * @param dstNode destination TE node key
     * @param srcTp source TE termination point key
     * @param dstTp destination TE termination point key
     * @param teTunnelKey TE tunnel key
     * @param tunnelType TE tunnel type
     * @param operStatus operational status
     * @param lspProtectionRole protection type
     * @param originType origin type
     * @param lspRecordRoutes route of the LSP
     */
    protected DefaultTeLsp(TeLspKey teLspKey, TeNodeKey srcNode, TeNodeKey dstNode,
                        TtpKey srcTp, TtpKey dstTp, TeTunnelKey teTunnelKey,
                        TeTunnel.Type tunnelType, TeTunnel.State operStatus,
                        LspProtectionRole lspProtectionRole,
                        OriginType originType,
                        List<TeRouteSubobject> lspRecordRoutes) {
        this.srcNode = srcNode;
        this.dstNode = dstNode;
        this.srcTp = srcTp;
        this.dstTp = dstTp;
        this.teTunnelKey = teTunnelKey;
        this.tunnelType = tunnelType;
        this.operStatus = operStatus;
        this.lspProtectionRole = lspProtectionRole;
        this.originType = originType;
        this.lspRecordRoutes = Lists.newArrayList(lspRecordRoutes);
        this.teLspKey = teLspKey;
    }

    @Override
    public TeLspKey teLspKey() {
        return teLspKey;
    }

    @Override
    public TeNodeKey srcNode() {
        return srcNode;
    }

    @Override
    public TeNodeKey dstNode() {
        return dstNode;
    }

    @Override
    public TtpKey srcTp() {
        return srcTp;
    }

    @Override
    public TtpKey dstTp() {
        return dstTp;
    }

    @Override
    public TeTunnelKey teTunnelKey() {
        return teTunnelKey;
    }

    @Override
    public TeTunnel.Type tunnelType() {
        return tunnelType;
    }

    @Override
    public TeTunnel.State operStatus() {
        return operStatus;
    }

    @Override
    public LspProtectionRole lspProtectionRole() {
        return lspProtectionRole;
    }

    @Override
    public OriginType originType() {
        return originType;
    }

    @Override
    public List<TeRouteSubobject> lspRecordRoutes() {
        return ImmutableList.copyOf(lspRecordRoutes);
    }


    /**
     * Creates a new default TE LSP builder.
     *
     * @return default builder
     */
    public static Builder builder() {
        return new Builder();
    }

    /**
     * Builder for default TE LSP objects.
     */
    public static class Builder {

        private TeLspKey teLspKey = null;
        private TeNodeKey srcNode = null;
        private TeNodeKey dstNode = null;
        private TtpKey srcTp = null;
        private TtpKey dstTp = null;
        private TeTunnelKey teTunnelKey = null;
        private TeTunnel.Type tunnelType = null;
        private TeTunnel.State operStatus = null;
        private LspProtectionRole lspProtectionRole = null;
        private OriginType originType = null;
        private List<TeRouteSubobject> lspRecordRoutes = Lists.newArrayList();

        /**
         * Builds a default TE LSP object from the accumulated parameters.
         *
         * @return default TE LSP object
         */
        public DefaultTeLsp build() {
            return new DefaultTeLsp(teLspKey, srcNode, dstNode, srcTp, dstTp,
                                    teTunnelKey, tunnelType, operStatus,
                                    lspProtectionRole, originType,
                                    lspRecordRoutes);
        }

        /**
         * Sets TE LSP key to be used by this builder.
         *
         * @param teLspKey TE LSP key
         * @return self
         */
        public Builder teLspKey(TeLspKey teLspKey) {
            this.teLspKey = teLspKey;
            return this;
        }

        /**
         * Sets source node key to be used by this builder.
         *
         * @param srcNode source node key
         * @return self
         */
        public Builder srcNode(TeNodeKey srcNode) {
            this.srcNode = srcNode;
            return this;
        }

        /**
         * Sets destination node key to be used by this builder.
         *
         * @param dstNode destination node key
         * @return self
         */
        public Builder dstNode(TeNodeKey dstNode) {
            this.dstNode = dstNode;
            return this;
        }

        /**
         * Sets source termination point key to be used by this builder.
         *
         * @param srcTp source termination point key
         * @return self
         */
        public Builder srcTp(TtpKey srcTp) {
            this.srcTp = srcTp;
            return this;
        }

        /**
         * Sets destination termination point key to be used by this builder.
         *
         * @param dstTp destination termination point key
         * @return self
         */
        public Builder dstTp(TtpKey dstTp) {
            this.dstTp = dstTp;
            return this;
        }

        /**
         * Sets TE tunnel key to be used by this builder.
         *
         * @param teTunnelKey TE tunnel key
         * @return self
         */
        public Builder teTunnelKey(TeTunnelKey teTunnelKey) {
            this.teTunnelKey = teTunnelKey;
            return this;
        }

        /**
         * Sets TE tunnel type to be used by this builder.
         *
         * @param tunnelType TE tunnel type
         * @return self
         */
        public Builder tunnelType(TeTunnel.Type tunnelType) {
            this.tunnelType = tunnelType;
            return this;
        }

        /**
         * Sets LSP operational status to be used by this builder.
         *
         * @param operStatus LSP operational status
         * @return self
         */
        public Builder operStatus(TeTunnel.State operStatus) {
            this.operStatus = operStatus;
            return this;
        }

        /**
         * Sets LSP protection role to be used by this builder.
         *
         * @param lspProtectionRole LSP protection role
         * @return self
         */
        public Builder lspProtectionRole(LspProtectionRole lspProtectionRole) {
            this.lspProtectionRole = lspProtectionRole;
            return this;
        }

        /**
         * Sets LSP origin type to be used by this builder.
         *
         * @param originType LSP origin type
         * @return self
         */
        public Builder originType(OriginType originType) {
            this.originType = originType;
            return this;
        }

        /**
         * Sets LSP record routes to be used by this builder.
         *
         * @param lspRecordRoutes LSP record routes
         * @return self
         */
        public Builder lspRecordRoutes(List<TeRouteSubobject> lspRecordRoutes) {
            if (lspRecordRoutes != null) {
                this.lspRecordRoutes = lspRecordRoutes;
            }
            return this;
        }
    }
}
