/*
 * Copyright 2017-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.net.pi.impl;

import org.onlab.util.ImmutableByteSequence;
import org.onosproject.net.flow.criteria.Criterion;
import org.onosproject.net.flow.criteria.EthCriterion;
import org.onosproject.net.flow.criteria.EthTypeCriterion;
import org.onosproject.net.flow.criteria.IPCriterion;
import org.onosproject.net.flow.criteria.PortCriterion;
import org.onosproject.net.flow.criteria.VlanIdCriterion;
import org.onosproject.net.flow.criteria.UdpPortCriterion;
import org.onosproject.net.flow.criteria.ExtensionCriterion;
import org.onosproject.net.flow.criteria.IPDscpCriterion;
import org.onosproject.net.flow.criteria.IPProtocolCriterion;
import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
import org.onosproject.net.flow.criteria.LambdaCriterion;
import org.onosproject.net.flow.criteria.MetadataCriterion;
import org.onosproject.net.flow.criteria.MplsBosCriterion;
import org.onosproject.net.flow.criteria.MplsCriterion;
import org.onosproject.net.flow.criteria.MplsTcCriterion;
import org.onosproject.net.flow.criteria.OchSignalCriterion;
import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
import org.onosproject.net.flow.criteria.OduSignalIdCriterion;
import org.onosproject.net.flow.criteria.OduSignalTypeCriterion;
import org.onosproject.net.flow.criteria.PbbIsidCriterion;
import org.onosproject.net.flow.criteria.PiCriterion;
import org.onosproject.net.flow.criteria.SctpPortCriterion;
import org.onosproject.net.flow.criteria.TcpFlagsCriterion;
import org.onosproject.net.flow.criteria.TcpPortCriterion;
import org.onosproject.net.flow.criteria.TunnelIdCriterion;
import org.onosproject.net.flow.criteria.VlanPcpCriterion;
import org.onosproject.net.flow.criteria.ArpHaCriterion;
import org.onosproject.net.flow.criteria.ArpOpCriterion;
import org.onosproject.net.flow.criteria.ArpPaCriterion;
import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
import org.onosproject.net.flow.criteria.IPEcnCriterion;

import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
import static org.onlab.util.ImmutableByteSequence.copyFrom;

/**
 * Factory class of criterion translator implementations.
 */
final class CriterionTranslators {

    /**
     * Translator of PortCriterion.
     */
    static final class PortCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            PortCriterion c = (PortCriterion) criterion;
            initAsExactMatch(copyFrom(c.port().toLong()), bitWidth);
        }
    }

    /**
     * Translator of EthTypeCriterion.
     */
    static final class EthTypeCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            EthTypeCriterion c = (EthTypeCriterion) criterion;
            initAsExactMatch(copyFrom(c.ethType().toShort()), bitWidth);
        }
    }

    /**
     * Translator of EthCriterion.
     */
    static final class EthCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            EthCriterion c = (EthCriterion) criterion;
            ImmutableByteSequence value = copyFrom(c.mac().toBytes());
            if (c.mask() == null) {
                initAsExactMatch(value, bitWidth);
            } else {
                ImmutableByteSequence mask = copyFrom(c.mask().toBytes());
                initAsTernaryMatch(value, mask, bitWidth);
            }
        }
    }

    /**
     * Translator of IpCriterion.
     */
    static final class IpCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IPCriterion c = (IPCriterion) criterion;
            initAsLpm(copyFrom(c.ip().address().toOctets()), c.ip().prefixLength(), bitWidth);
        }
    }

    /**
     * Translator of VlanIdCriterion.
     */
    static final class VlanIdCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            VlanIdCriterion c = (VlanIdCriterion) criterion;
            initAsExactMatch(copyFrom(c.vlanId().toShort()), bitWidth);
        }
    }

    /**
     * Translator of UdpPortCriterion.
     */
    static final class UdpPortCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            UdpPortCriterion c = (UdpPortCriterion) criterion;
            ImmutableByteSequence value = copyFrom(c.udpPort().toInt());
            if (c.mask() == null) {
                initAsExactMatch(value, bitWidth);
            } else {
                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
                initAsTernaryMatch(value, mask, bitWidth);
            }
        }
    }

    /**
     * Translator of ExtensionCriterion.
     */
    static final class ExtensionCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            ExtensionCriterion c = (ExtensionCriterion) criterion;
            initAsExactMatch(copyFrom(c.extensionSelector().type().toInt()), bitWidth);
        }
    }

    /**
     * Translator of IPDscpCriterion.
     */
    static final class IPDscpCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IPDscpCriterion c = (IPDscpCriterion) criterion;
            ImmutableByteSequence value = copyFrom(c.ipDscp());
            initAsExactMatch(value, bitWidth);
        }
    }

    /**
     * Translator of IPProtocolCriterion.
     */
    static final class IPProtocolCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IPProtocolCriterion c = (IPProtocolCriterion) criterion;
            initAsExactMatch(copyFrom(c.protocol()), bitWidth);
        }
    }

    /**
     * Translator of IPv6ExthdrFlagsCriterion.
     */
    static final class IPv6ExthdrFlagsCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IPv6ExthdrFlagsCriterion c = (IPv6ExthdrFlagsCriterion) criterion;
            initAsExactMatch(copyFrom(c.exthdrFlags()), bitWidth);
        }
    }

    /**
     * Translator of IPv6FlowLabelCriterion.
     */
    static final class IPv6FlowLabelCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IPv6FlowLabelCriterion c = (IPv6FlowLabelCriterion) criterion;
            initAsExactMatch(copyFrom(c.flowLabel()), bitWidth);
        }
    }

    /**
     * Translator of IPv6NDLinkLayerAddressCriterion.
     */
    static final class IPv6NDLinkLayerAddressCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IPv6NDLinkLayerAddressCriterion c = (IPv6NDLinkLayerAddressCriterion) criterion;
            initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
        }
    }

    /**
     * Translator of IPv6NDTargetAddressCriterion.
     */
    static final class IPv6NDTargetAddressCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IPv6NDTargetAddressCriterion c = (IPv6NDTargetAddressCriterion) criterion;
            initAsExactMatch(copyFrom(c.targetAddress().getIp6Address().toOctets()), bitWidth);
        }
    }

    /**
     * Translator of IcmpCodeCriterion.
     */
    static final class IcmpCodeCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IcmpCodeCriterion c = (IcmpCodeCriterion) criterion;
            initAsExactMatch(copyFrom(c.icmpCode()), bitWidth);
        }
    }

    /**
     * Translator of IcmpTypeCriterion.
     */
    static final class IcmpTypeCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IcmpTypeCriterion c = (IcmpTypeCriterion) criterion;
            initAsExactMatch(copyFrom(c.icmpType()), bitWidth);
        }
    }

    /**
     * Translator of Icmpv6CodeCriterion.
     */
    static final class Icmpv6CodeCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            Icmpv6CodeCriterion c = (Icmpv6CodeCriterion) criterion;
            initAsExactMatch(copyFrom(c.icmpv6Code()), bitWidth);
        }
    }

    /**
     * Translator of Icmpv6TypeCriterion.
     */
    static final class Icmpv6TypeCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            Icmpv6TypeCriterion c = (Icmpv6TypeCriterion) criterion;
            initAsExactMatch(copyFrom(c.icmpv6Type()), bitWidth);
        }
    }

    /**
     * Translator of LambdaCriterion.
     */
    static final class LambdaCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            LambdaCriterion c = (LambdaCriterion) criterion;
            initAsExactMatch(copyFrom(c.lambda()), bitWidth);
        }
    }

    /**
     * Translator of MetadataCriterion.
     */
    static final class MetadataCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            MetadataCriterion c = (MetadataCriterion) criterion;
            initAsExactMatch(copyFrom(c.metadata()), bitWidth);
        }
    }

    /**
     * Translator of MplsBosCriterion.
     */
    static final class MplsBosCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            MplsBosCriterion c = (MplsBosCriterion) criterion;
            int iMplsBos = c.mplsBos() ? 0 : 1;
            initAsExactMatch(copyFrom(iMplsBos), bitWidth);
        }
    }

    /**
     * Translator of MplsCriterion.
     */
    static final class MplsCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            MplsCriterion c = (MplsCriterion) criterion;
            initAsExactMatch(copyFrom(c.label().toInt()), bitWidth);
        }
    }

    /**
     * Translator of MplsTcCriterion.
     */
    static final class MplsTcCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            MplsTcCriterion c = (MplsTcCriterion) criterion;
            initAsExactMatch(copyFrom(c.tc()), bitWidth);
        }
    }

    /**
     * Translator of OchSignalCriterion.
     */
    static final class OchSignalCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            OchSignalCriterion c = (OchSignalCriterion) criterion;
            initAsExactMatch(copyFrom(c.lambda().slotGranularity()), bitWidth);
        }
    }

    /**
     * Translator of OchSignalTypeCriterion.
     */
    static final class OchSignalTypeCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            OchSignalTypeCriterion c = (OchSignalTypeCriterion) criterion;
            initAsExactMatch(copyFrom(c.signalType().ordinal()), bitWidth);
        }
    }

    /**
     * Translator of OduSignalIdCriterion.
     */
    static final class OduSignalIdCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            OduSignalIdCriterion c = (OduSignalIdCriterion) criterion;
            initAsExactMatch(copyFrom(c.oduSignalId().tributaryPortNumber()), bitWidth);
        }
    }


    /**
     * Translator of OduSignalTypeCriterion.
     */
    static final class OduSignalTypeCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            OduSignalTypeCriterion c = (OduSignalTypeCriterion) criterion;
            initAsExactMatch(copyFrom(c.signalType().bitRate()), bitWidth);
        }
    }

    /**
     * Translator of PbbIsidCriterion.
     */
    static final class PbbIsidCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            PbbIsidCriterion c = (PbbIsidCriterion) criterion;
            initAsExactMatch(copyFrom(c.pbbIsid()), bitWidth);
        }
    }

    /**
     * Translator of PiCriterion.
     */
    static final class PiCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            PiCriterion c = (PiCriterion) criterion;
            initAsExactMatch(copyFrom(c.fieldMatches().size()), bitWidth);
        }
    }

    /**
     * Translator of SctpPortCriterion.
     */
    static final class SctpPortCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            SctpPortCriterion c = (SctpPortCriterion) criterion;
            ImmutableByteSequence value = copyFrom(c.sctpPort().toInt());
            if (c.mask() == null) {
                initAsExactMatch(value, bitWidth);
            } else {
                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
                initAsTernaryMatch(value, mask, bitWidth);
            }
        }
    }

    /**
     * Translator of TcpFlagsCriterion.
     */
    static final class TcpFlagsCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            TcpFlagsCriterion c = (TcpFlagsCriterion) criterion;
            initAsExactMatch(copyFrom(c.flags()), bitWidth);
        }
    }

    /**
     * Translator of TcpPortCriterion.
     */
    static final class TcpPortCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            TcpPortCriterion c = (TcpPortCriterion) criterion;
            ImmutableByteSequence value = copyFrom(c.tcpPort().toInt());
            if (c.mask() == null) {
                initAsExactMatch(value, bitWidth);
            } else {
                ImmutableByteSequence mask = copyFrom(c.mask().toInt());
                initAsTernaryMatch(value, mask, bitWidth);
            }

        }
    }

    /**
     * Translator of TunnelIdCriterion.
     */
    static final class TunnelIdCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            TunnelIdCriterion c = (TunnelIdCriterion) criterion;
            initAsExactMatch(copyFrom(c.tunnelId()), bitWidth);
        }
    }

    /**
     * Translator of  VlanPcpCriterion.
     */
    static final class VlanPcpCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            VlanPcpCriterion c = (VlanPcpCriterion) criterion;
            initAsExactMatch(copyFrom(c.priority()), bitWidth);
        }
    }

    /**
     * Translator of  ArpHaCriterion.
     */
    static final class ArpHaCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            ArpHaCriterion c = (ArpHaCriterion) criterion;
            initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
        }
    }

    /**
     * Translator of  ArpOpCriterion.
     */
    static final class ArpOpCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            ArpOpCriterion c = (ArpOpCriterion) criterion;
            initAsExactMatch(copyFrom(c.arpOp()), bitWidth);
        }
    }

    /**
     * Translator of  ArpPaCriterion.
     */
    static final class ArpPaCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            ArpPaCriterion c = (ArpPaCriterion) criterion;
            initAsExactMatch(copyFrom(c.ip().toInt()), bitWidth);
        }
    }

    /**
     * Translator of IPEcnCriterion.
     */
    static final class IPEcnCriterionTranslator extends AbstractCriterionTranslator {
        @Override
        public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
            IPEcnCriterion c = (IPEcnCriterion) criterion;
            initAsExactMatch(copyFrom(c.ipEcn()), bitWidth);
        }
    }
}
