#
# Copyright 2017 the original author or authors.
#
# 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.
#
from scapy.fields import ByteField, PacketField, IntField
from scapy.fields import ShortField, ConditionalField
from scapy.packet import Packet

from voltha.extensions.omci.omci_fields import FixedLenField
from voltha.extensions.omci.omci_messages import OmciCreate, OmciDelete, \
    OmciDeleteResponse, OmciSet, OmciSetResponse, OmciGet, OmciGetResponse, \
    OmciGetAllAlarms, OmciGetAllAlarmsResponse, OmciGetAllAlarmsNext, \
    OmciMibResetResponse, OmciMibReset, OmciMibUploadNextResponse, \
    OmciMibUploadNext, OmciMibUploadResponse, OmciMibUpload, \
    OmciGetAllAlarmsNextResponse, OmciAttributeValueChange, \
    OmciTestResult, OmciAlarmNotification, \
    OmciReboot, OmciRebootResponse, OmciGetNext, OmciGetNextResponse, \
    OmciSynchronizeTime, OmciSynchronizeTimeResponse, OmciGetCurrentData, \
    OmciGetCurrentDataResponse, OmciStartSoftwareDownload, OmciStartSoftwareDownloadResponse, \
    OmciDownloadSection, OmciDownloadSectionLast, OmciDownloadSectionResponse, \
    OmciEndSoftwareDownload, OmciEndSoftwareDownloadResponse, \
    OmciActivateImage, OmciActivateImageResponse, \
    OmciCommitImage, OmciCommitImageResponse

from voltha.extensions.omci.omci_messages import OmciCreateResponse


class OmciFrame(Packet):
    name = "OmciFrame"
    fields_desc = [
        ShortField("transaction_id", 0),
        ByteField("message_type", None),
        ByteField("omci", 0x0a),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciCreate), align=36),
            lambda pkt: pkt.message_type == OmciCreate.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciCreateResponse), align=36),
            lambda pkt: pkt.message_type == OmciCreateResponse.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciDelete), align=36),
            lambda pkt: pkt.message_type == OmciDelete.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciDeleteResponse), align=36),
            lambda pkt: pkt.message_type == OmciDeleteResponse.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciSet), align=36),
            lambda pkt: pkt.message_type == OmciSet.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciSetResponse), align=36),
            lambda pkt: pkt.message_type == OmciSetResponse.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciGet), align=36),
            lambda pkt: pkt.message_type == OmciGet.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciGetResponse), align=36),
            lambda pkt: pkt.message_type == OmciGetResponse.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciGetAllAlarms), align=36),
            lambda pkt: pkt.message_type == OmciGetAllAlarms.message_id),
        ConditionalField(FixedLenField(
            PacketField(
                "omci_message", None, OmciGetAllAlarmsResponse), align=36),
                lambda pkt:
                pkt.message_type == OmciGetAllAlarmsResponse.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciGetAllAlarmsNext), align=36),
            lambda pkt: pkt.message_type == OmciGetAllAlarmsNext.message_id),
        ConditionalField(FixedLenField(
            PacketField(
                "omci_message", None, OmciGetAllAlarmsNextResponse), align=36),
                lambda pkt:
                pkt.message_type == OmciGetAllAlarmsNextResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciMibUpload), align=36),
            lambda pkt: pkt.message_type == OmciMibUpload.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciMibUploadResponse), align=36),
            lambda pkt: pkt.message_type == OmciMibUploadResponse.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciMibUploadNext), align=36),
            lambda pkt:
                pkt.message_type == OmciMibUploadNext.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciMibUploadNextResponse), align=36),
            lambda pkt: pkt.message_type == OmciMibUploadNextResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciMibReset), align=36),
            lambda pkt: pkt.message_type == OmciMibReset.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciMibResetResponse), align=36),
            lambda pkt: pkt.message_type == OmciMibResetResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciAlarmNotification), align=36),
            lambda pkt: pkt.message_type == OmciAlarmNotification.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciAttributeValueChange), align=36),
            lambda pkt: pkt.message_type == OmciAttributeValueChange.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciTestResult), align=36),
            lambda pkt: pkt.message_type == OmciTestResult.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciReboot), align=36),
            lambda pkt: pkt.message_type == OmciReboot.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciRebootResponse), align=36),
            lambda pkt: pkt.message_type == OmciRebootResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciGetNext), align=36),
            lambda pkt: pkt.message_type == OmciGetNext.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciGetNextResponse), align=36),
            lambda pkt: pkt.message_type == OmciGetNextResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciSynchronizeTime), align=36),
            lambda pkt: pkt.message_type == OmciSynchronizeTime.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciSynchronizeTimeResponse), align=36),
            lambda pkt: pkt.message_type == OmciSynchronizeTimeResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciGetCurrentData), align=36),
            lambda pkt: pkt.message_type == OmciGetCurrentData.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciGetCurrentDataResponse), align=36),
            lambda pkt: pkt.message_type == OmciGetCurrentDataResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciStartSoftwareDownload), align=36),
            lambda pkt: pkt.message_type == OmciStartSoftwareDownload.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciStartSoftwareDownloadResponse), align=36),
            lambda pkt: pkt.message_type == OmciStartSoftwareDownloadResponse.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciDownloadSection), align=36),
            lambda pkt: pkt.message_type == OmciDownloadSection.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciDownloadSectionLast), align=36),
            lambda pkt: pkt.message_type == OmciDownloadSectionLast.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciDownloadSectionResponse), align=36),
            lambda pkt: pkt.message_type == OmciDownloadSectionResponse.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciEndSoftwareDownload), align=36),
            lambda pkt: pkt.message_type == OmciEndSoftwareDownload.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciEndSoftwareDownloadResponse), align=36),
            lambda pkt: pkt.message_type == OmciEndSoftwareDownloadResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciActivateImage), align=36),
            lambda pkt: pkt.message_type == OmciActivateImage.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciActivateImageResponse), align=36),
            lambda pkt: pkt.message_type == OmciActivateImageResponse.message_id),

        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciCommitImage), align=36),
            lambda pkt: pkt.message_type == OmciCommitImage.message_id),
        ConditionalField(FixedLenField(
            PacketField("omci_message", None, OmciCommitImageResponse), align=36),
            lambda pkt: pkt.message_type == OmciCommitImageResponse.message_id),

        # TODO add entries for remaining OMCI message types

        IntField("omci_trailer", 0x00000028)
    ]

    # We needed to patch the do_dissect(...) method of Packet, because
    # it wiped out already dissected conditional fields with None if they
    # referred to the same field name. We marked the only new line of code
    # with "Extra condition added".
    def do_dissect(self, s):
        raw = s
        self.raw_packet_cache_fields = {}
        for f in self.fields_desc:
            if not s:
                break
            s, fval = f.getfield(self, s)
            # We need to track fields with mutable values to discard
            # .raw_packet_cache when needed.
            if f.islist or f.holds_packets:
                self.raw_packet_cache_fields[f.name] = f.do_copy(fval)
            # Extra condition added
            if fval is not None or f.name not in self.fields:
                self.fields[f.name] = fval
        assert(raw.endswith(s))
        self.raw_packet_cache = raw[:-len(s)] if s else raw
        self.explicit = 1
        return s
