"""
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/>.
"""
"Functions for using the SimpleHTTPServer python module"
import re


class Server():

    def __init__( self ):
        self.default = ''
        self.PID = -1
        self.component = None
        self.rootDir = None

    def __del__( self ):
        self.stop()

    def start( self, component, rootDir, port=8000, logDir=None ):
        """
        Start SimpleHTTPServer as a background process from rootDir on the
        given component. The webserver will listen on port and if specified,
        output will be redirected to logDir.

        Arguments:
        - component = The TestON component handle to start the webserver on
        - rootDir = The root directory for the web content
        - port = The port number for the webserver to listen on. Defaults to 8000
        - logDir = If specified, the output of the webserver will be redirected
                   to this file. Note that this should be either an absolute path
                   or relative to rootDir.
        Returns:
            main.TRUE if the command succedes or main.FALSE if there is an error.
        """
        retValue = main.TRUE
        self.rootDir = rootDir
        try:
            # Save component for this instance so other functions can use it
            self.component = component
            main.log.info( "Starting SimpleHTTPServer on " + component.name )
            if component.handle:
                handle = component.handle
                # cd to rootDir
                handle.sendline( "cd " + str( rootDir ) )
                handle.expect( "\$" )
                # Start server
                cmd = "python -m SimpleHTTPServer {}".format( port )
                if logDir:
                    cmd += " &> {}".format( logDir )  # pipe all output to a file
                else:
                    cmd += "&> {dev/null}"  # Throw away all output
                cmd += " &"
                handle.sendline( cmd )
                handle.expect( "\$" )
                response = handle.before
                # Return to home dir
                handle.sendline( "cd " + component.home )
                handle.expect( "\$" )
                response += handle.before
                if "Exit" in response:
                    main.log.error( "Error starting server. Check server log for details" )
                    main.log.debug( handle.before )
                    retValue = main.FALSE
                # capture PID for later use
                # EX: [ 1 ] 67987
                match = re.search( "\[\d\] (?P<PID>\d+)", response )
                if match:
                    self.PID = match.group( "PID" )
                else:
                    main.log.warn( "Could not find PID" )
            else:
                main.log.error( "Component handle is not set" )
                retValue = main.FALSE
        except Exception:
            main.log.exception( "Error starting web server" )
            retValue = main.FALSE
        return retValue

    def stop( self ):
        """
        Kills the process of the server. Note that this function must be run
        from the same instance of the server class that the server was started
        on.
        """
        retValue = main.TRUE
        try:
            main.log.info( "Stopping Server." )
            assert self.component, "Component not specified"
            assert self.PID, "PID not found"
            if self.component.handle:
                handle = self.component.handle
                cmd = "sudo kill {}".format( self.PID )
                handle.sendline( cmd )
                handle.expect( "\$" )
                # TODO: What is bad output? cannot sudo?
            else:
                main.log.error( "Component handle is not set" )
                retValue = main.FALSE
        except Exception:
            main.log.exception( "Error stopping web server" )
            retValue = main.FALSE
        return retValue

    def generateFile( self, nodes, equal=False, filename="cluster.json" ):
        """
        Generate custom metadata file in the root directory using the custom
        onos-gen-partitions file which should also be located in the root
        directory.

        Note that this function needs to be run after the start function has
        been called for this instance.

        Arguments:
        - nodes = The number of ONOS nodes to include in the cluster. Will
                  include nodes in ascending order, I.E. OC1, OC2, etc

        Optional Arguments:
        - equal = Specifies whether all nodes should participate in every
                  partition. Defaults to False.
        - filename = The name of the file to save the cluster metadata to.
                     Defaults to "cluster.json".
        Returns:
            main.TRUE if the command succedes or main.FALSE if there is an error.
        """
        retValue = main.TRUE
        try:
            if self.component.handle:
                assert self.component, "Component not specified. Please start the server first"
                assert self.rootDir, "Root directory not found"
                handle = self.component.handle
                # cd to rootDir
                handle.sendline( "cd " + str( self.rootDir ) )
                handle.expect( "\$" )
                cmd = "./onos-gen-partitions {} {} ".format( filename, nodes )
                if equal:
                    cmd += "-e"
                handle.sendline( cmd )
                handle.expect( "\$" )
                response = handle.before
                # Return to home dir
                handle.sendline( "cd " + self.component.home )
                handle.expect( "\$" )
                response += handle.before
                if "Traceback" in response:
                    main.log.error( handle.before )
                    retValue = main.FALSE
            else:
                main.log.error( "Component handle is not set" )
                retValue = main.FALSE
        except Exception:
            main.log.exception( "Error generating metadata file" )
        return retValue
