/*
 * Copyright 2019-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.opencord.bng;

import com.google.common.base.MoreObjects;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.behaviour.BngProgrammable;

/**
 * Abstract implementation of an attachment.
 */
public abstract class BngAttachment implements BngProgrammable.Attachment {
    private final ApplicationId appId;
    private final VlanId sTag;
    private final VlanId cTag;
    private final MacAddress macAddress;
    private final IpAddress ipAddress;
    private final boolean lineActivated;
    private final ConnectPoint oltConnectPoint;
    private final String onuSerial;
    private final short qinqTpid;

    /**
     * Creates a new attachment.
     *
     * @param appId           The application that created this attachment
     * @param sTag            The VLAN S-TAG
     * @param cTag            The VLAN C-TAG
     * @param macAddress      The MAC address of the attachment
     * @param ipAddress       The IP address of the attachment
     * @param lineActivated   Define if the attachment is active or not
     * @param oltConnectPoint The connect point of the OLT (UNI port)
     * @param onuSerial       The serial string of the ONU
     * @param qinqTpid        The QinQ Tpid for the packets
     */
    BngAttachment(ApplicationId appId, VlanId sTag, VlanId cTag,
                  MacAddress macAddress, IpAddress ipAddress,
                  boolean lineActivated, ConnectPoint oltConnectPoint,
                  String onuSerial, short qinqTpid) {
        this.appId = appId;
        this.sTag = sTag;
        this.cTag = cTag;
        this.macAddress = macAddress;
        this.ipAddress = ipAddress;
        this.lineActivated = lineActivated;
        this.oltConnectPoint = oltConnectPoint;
        this.onuSerial = onuSerial;
        this.qinqTpid = qinqTpid;
    }

    /**
     * Returns the OLT connect point (UNI port).
     *
     * @return The OLT connect point
     */
    public ConnectPoint oltConnectPoint() {
        return this.oltConnectPoint;
    }

    /**
     * Returns the ONU serial number.
     *
     * @return The ONU serial number
     */
    public String onuSerial() {
        return this.onuSerial;
    }

    /**
     * Returns the QinQ TPID.
     *
     * @return The QinQ TPID
     */
    public short qinqTpid() {
        return this.qinqTpid;
    }

    @Override
    public ApplicationId appId() {
        return appId;
    }

    @Override
    public VlanId sTag() {
        return sTag;
    }

    @Override
    public VlanId cTag() {
        return cTag;
    }

    @Override
    public MacAddress macAddress() {
        return macAddress;
    }

    @Override
    public IpAddress ipAddress() {
        return ipAddress;
    }

    @Override
    public boolean lineActive() {
        return lineActivated;
    }

    MoreObjects.ToStringHelper toStringHelper() {
        return MoreObjects.toStringHelper(this)
                .add("appId", appId)
                .add("sTag", sTag)
                .add("cTag", cTag)
                .add("macAddress", macAddress)
                .add("ipAddress", ipAddress)
                .add("lineActivated", lineActivated)
                .add("oltConnectPoint", oltConnectPoint)
                .add("onuSerial", onuSerial)
                .add("qinqTpid", qinqTpid);
    }

    /**
     * Abstract builder of attachments.
     * <p>
     * TODO: javadoc
     */
    public abstract static class BngBuilder {
        ApplicationId appId;
        VlanId sTag;
        VlanId cTag;
        MacAddress macAddress;
        IpAddress ipAddress = IpAddress.valueOf(0);
        boolean lineActivated;
        ConnectPoint oltconnectPoint;
        String onuSerial;
        short qinqTpid;

        BngBuilder() {
            // Hide constructor
            this.lineActivated = false;
        }

        /**
         * Sets the ONU serial number.
         *
         * @param onuSerial The ONU serial number
         * @return self
         */
        public BngBuilder withOnuSerial(String onuSerial) {
            this.onuSerial = onuSerial;
            return this;
        }

        /**
         * Sets the OLT connect point (UNI port).
         *
         * @param oltconnectPoint The OLT connect point
         * @return self
         */
        public BngBuilder withOltConnectPoint(ConnectPoint oltconnectPoint) {
            this.oltconnectPoint = oltconnectPoint;
            return this;
        }

        /**
         * Sets the VLAN S-Tag.
         *
         * @param sTag The VLAN S-Tag
         * @return self
         */
        public BngBuilder withSTag(VlanId sTag) {
            this.sTag = sTag;
            return this;
        }

        /**
         * Sets the VLAN C-Tag.
         *
         * @param cTag the VLAN C-Tag
         * @return self
         */
        public BngBuilder withCTag(VlanId cTag) {
            this.cTag = cTag;
            return this;
        }

        /**
         * Sets the attachment activation state.
         *
         * @param lineActivated The attachment activation state
         * @return self
         */
        public BngBuilder lineActivated(boolean lineActivated) {
            this.lineActivated = lineActivated;
            return this;
        }

        /**
         * Sets the application ID.
         *
         * @param appId The application ID.
         * @return self
         */
        public BngBuilder withApplicationId(ApplicationId appId) {
            this.appId = appId;
            return this;
        }

        /**
         * Sets the attachment MAC address.
         *
         * @param macAddress The MAC address
         * @return self
         */
        public BngBuilder withMacAddress(MacAddress macAddress) {
            this.macAddress = macAddress;
            return this;
        }

        /**
         * Sets the attachment IP address.
         *
         * @param ipAddress The IP address
         * @return self
         */
        public BngBuilder withIpAddress(IpAddress ipAddress) {
            this.ipAddress = ipAddress;
            return this;
        }

        /**
         * Sets the QinQ tpid.
         *
         * @param qinqTpid The QinQ tpid
         * @return self
         */
        public BngBuilder withQinqTpid(short qinqTpid) {
            this.qinqTpid = qinqTpid;
            return this;
        }

        /**
         * Returns a new BNG attachment.
         *
         * @return BNG attachment
         */
        public abstract BngAttachment build();
    }
}
