"""
Copyright 2016 Open Networking Foundation ( ONF )

Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>

    TestON is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    ( at your option ) any later version.

    TestON is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
"""
"""
This file contains the Event class for CHOTestMonkey
Author: you@onlab.us
"""
from threading import Lock


class EventType:

    def __init__( self ):
        self.map = {}
        # Group events ( >100 ) should be divided into individual events by the generator before going to the scheduler
        self.NULL = 0
        for eventName in main.params[ 'EVENT' ].keys():
            typeString = main.params[ 'EVENT' ][ eventName ][ 'typeString' ]
            typeIndex = int( main.params[ 'EVENT' ][ eventName ][ 'typeIndex' ] )
            setattr( self, typeString, typeIndex )
            self.map[ typeIndex ] = typeString


class EventStates:

    def __init__( self ):
        self.map = {}
        self.FAIL = 0
        self.map[ 0 ] = 'FAIL'
        self.PASS = 1
        self.map[ 1 ] = 'PASS'
        self.ABORT = -1
        self.map[ -1 ] = 'ABORT'


class Event:

    """
    Event class for CHOTestMonkey
    It is the super class for CheckEvent and NetworkEvent
    """
    def __init__( self ):
        self.typeString = main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeString' ]
        self.typeIndex = int( main.params[ 'EVENT' ][ self.__class__.__name__ ][ 'typeIndex' ] )
        self.eventLock = Lock()
        self.variableLock = Lock()

    def startEvent( self, args=None ):
        """
        Start running the event
        """
        return EventStates().PASS
