# Copyright 2013, Big Switch Networks, Inc.
#
# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
# the following special exception:
#
# LOXI Exception
#
# As a special exception to the terms of the EPL, you may distribute libraries
# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
# that copyright and licensing notices generated by LoxiGen are not altered or removed
# from the LoxiGen Libraries and the notice provided below is (i) included in
# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
# documentation for the LoxiGen Libraries, if distributed in binary form.
#
# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
#
# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
# a copy of the EPL at:
#
# http://www.eclipse.org/legal/epl-v10.html
#
# 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
# EPL for the specific language governing permissions and limitations
# under the EPL.

import os
from collections import namedtuple
import loxi_utils.loxi_utils as utils
import loxi_front_end
import of_g

templates_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'templates')

DissectorField = namedtuple("DissectorField", ["name", "type", "base"])

# TODO move into IR
def create_superclass_map():
    superclasses = {}
    for supercls, subcls_set in loxi_front_end.type_maps.inheritance_map.items():
        for subcls in subcls_set:
            superclasses[supercls + '_' + subcls] = supercls

    for version, versioned in loxi_front_end.type_maps.message_types.items():
        for subcls in versioned:
            superclasses['of_' + subcls] = 'of_message'

    for version, versioned in loxi_front_end.type_maps.extension_message_subtype.items():
        for experimenter, classes in versioned.items():
            for cls in classes:
                superclasses[cls] = 'of_experimenter_' + experimenter

    for version, versioned in loxi_front_end.type_maps.extension_action_subtype.items():
        for experimenter, classes in versioned.items():
            for cls in classes:
                superclasses[cls] = 'of_action_' + experimenter

    for version, versioned in loxi_front_end.type_maps.stats_types.items():
        for subcls in versioned:
            superclasses['of_' + subcls + '_stats_request'] = 'of_stats_request'
            superclasses['of_' + subcls + '_stats_reply'] = 'of_stats_reply'

    for version, versioned in loxi_front_end.type_maps.flow_mod_types.items():
        for subcls in versioned:
            superclasses['of_flow_' + subcls] = 'of_flow_mod'

    return superclasses

def create_fields():
    return [
        DissectorField("version", "UINT8", "DEC"),
        DissectorField("type", "UINT8", "DEC"),
        DissectorField("length", "UINT16", "DEC"),
        DissectorField("xid", "UINT32", "HEX"),
    ]

def generate(out, name):
    superclasses = create_superclass_map()
    all_classes = sorted(of_g.unified.keys())

    for cls in all_classes:
        if cls not in superclasses:
            print cls + ": " + superclasses.get(cls, "NONE")

    context = {
        'superclasses': superclasses,
        'fields': create_fields(),
    }
    utils.render_template(out, "openflow.lua", [templates_dir], context)
