# Copyright 2017 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/>.
#
# If you have any questions, or if you don't understand R,
# please contact Jeremy Ronquillo: j_ronquillo@u.pacific.edu

# **********************************************************
# STEP 1: Data management.
# **********************************************************
print( "**********************************************************" )
print( "STEP 1: Data management." )
print( "**********************************************************" )
database_host = 1
database_port = 2
database_u_id = 3
database_pw = 4
test_name = 5
branch_name = 6
save_directory = 7

# Command line arguments are read.
print( "Reading commmand-line args." )
args <- commandArgs( trailingOnly=TRUE )

# ----------------
# Import Libraries
# ----------------

print( "Importing libraries." )
library( ggplot2 )
library( reshape2 )
library( RPostgreSQL )    # For databases

# -------------------
# Check CLI Arguments
# -------------------

print( "Verifying CLI args." )

if ( is.na( args[ save_directory ] ) ){

    print( paste( "Usage: Rscript SCPFportLat",
                                  "<database-host>",
                                  "<database-port>",
                                  "<database-user-id>",
                                  "<database-password>",
                                  "<test-name>",
                                  "<branch-name>",
                                  "<directory-to-save-graphs>",
                                  sep=" " ) )

    quit( status = 1 )  # basically exit(), but in R
}

# -----------------
# Create File Names
# -----------------

print( "Creating filenames and title of graph." )
errBarOutputFileUp <- paste( args[ save_directory ],
                             "SCPFportLat_",
                             args[ branch_name ],
                             "_UpErrBarWithStack.jpg",
                             sep = "" )

errBarOutputFileDown <- paste( args[ save_directory ],
                             "SCPFportLat_",
                             args[ branch_name ],
                             "_DownErrBarWithStack.jpg",
                             sep = "" )

# ------------------
# SQL Initialization
# ------------------
print( "Initializing SQL" )

con <- dbConnect( dbDriver( "PostgreSQL" ),
                  dbname = "onostest",
                  host = args[ database_host ],
                  port = strtoi( args[ database_port ] ),
                  user = args[ database_u_id ],
                  password = args[ database_pw ] )

# ------------------------
# Port Latency SQL Command
# ------------------------

print( "Generating Port Latency SQL Command" )

command <- paste( "SELECT * FROM port_latency_details WHERE branch = '",
                  args[ branch_name ],
                  "' AND date IN ( SELECT MAX( date ) FROM port_latency_details WHERE branch = '",
                  args[ branch_name ],
                  "' ) ",
                  sep = "" )

print( "Sending SQL command:" )
print( command )

fileData <- dbGetQuery( con, command )

# **********************************************************
# STEP 2: Organize data.
# **********************************************************

print( "**********************************************************" )
print( "STEP 2: Organize Data." )
print( "**********************************************************" )

# -----------------------------
# Port Up Averages Data Sorting
# -----------------------------

print( "Sorting data for Port Up Averages." )

requiredColumns <- c( "up_ofp_to_dev_avg", "up_dev_to_link_avg", "up_link_to_graph_avg" )

tryCatch( upAvgs <- c( fileData[ requiredColumns] ),
          error = function( e ) {
              print( "[ERROR] One or more expected columns are missing from the data. Please check that the data and SQL command are valid, then try again." )
              print( "Required columns: " )
              print( requiredColumns )
              print( "Actual columns: " )
              print( names( fileData ) )
              print( "Error dump:" )
              print( e )
              quit( status = 1 )
          }
         )


# ----------------------------
# Port Up Construct Data Frame
# ----------------------------

print( "Constructing Port Up data frame." )

upAvgsDataFrame <- melt( upAvgs )
upAvgsDataFrame$scale <- fileData$scale
upAvgsDataFrame$up_std <- fileData$up_std

colnames( upAvgsDataFrame ) <- c( "ms",
                             "type",
                             "scale",
                             "stds" )

upAvgsDataFrame <- na.omit( upAvgsDataFrame )

upAvgsDataFrame$type <- as.character( upAvgsDataFrame$type )
upAvgsDataFrame$type <- factor( upAvgsDataFrame$type, levels=unique( upAvgsDataFrame$type ) )

sumOfUpAvgs <- fileData[ 'up_ofp_to_dev_avg' ] +
               fileData[ 'up_dev_to_link_avg' ] +
               fileData[ 'up_link_to_graph_avg' ]

print( "Up Averages Results:" )
print( upAvgsDataFrame )

# -------------------------------
# Port Down Averages Data Sorting
# -------------------------------

print( "Sorting data for Port Down Averages." )

requiredColumns <- c( "down_ofp_to_dev_avg", "down_dev_to_link_avg", "down_link_to_graph_avg" )

tryCatch( downAvgs <- c( fileData[ requiredColumns] ),
          error = function( e ) {
              print( "[ERROR] One or more expected columns are missing from the data. Please check that the data and SQL command are valid, then try again." )
              print( "Required columns: " )
              print( requiredColumns )
              print( "Actual columns: " )
              print( names( fileData ) )
              print( "Error dump:" )
              print( e )
              quit( status = 1 )
          }
         )

# ------------------------------
# Port Down Construct Data Frame
# ------------------------------

print( "Constructing Port Down data frame." )

downAvgsDataFrame <- melt( downAvgs )
downAvgsDataFrame$scale <- fileData$scale
downAvgsDataFrame$down_std <- fileData$down_std

colnames( downAvgsDataFrame ) <- c( "ms",
                               "type",
                               "scale",
                               "stds" )

downAvgsDataFrame <- na.omit( downAvgsDataFrame )

downAvgsDataFrame$type <- as.character( downAvgsDataFrame$type )
downAvgsDataFrame$type <- factor( downAvgsDataFrame$type, levels=unique( downAvgsDataFrame$type ) )

sumOfDownAvgs <- fileData[ 'down_ofp_to_dev_avg' ] +
                 fileData[ 'down_dev_to_link_avg' ] +
                 fileData[ 'down_link_to_graph_avg' ]

print( "Down Averages Results:" )
print( downAvgsDataFrame )

# **********************************************************
# STEP 3: Generate graphs.
# **********************************************************

print( "**********************************************************" )
print( "STEP 3: Generate Graph." )
print( "**********************************************************" )

# ------------------------------------
# Initialize Variables For Both Graphs
# ------------------------------------

print( "Initializing variables used in both graphs." )

theme_set( theme_grey( base_size = 22 ) )   # set the default text size of the graph.
barWidth <- 1
xScaleConfig <- scale_x_continuous( breaks=c( 1, 3, 5, 7, 9 ) )
xLabel <- xlab( "Scale" )
yLabel <- ylab( "Latency (ms)" )
fillLabel <- labs( fill="Type" )
wrapLegend <- guides( fill=guide_legend( nrow=1, byrow=TRUE ) )
imageWidth <- 15
imageHeight <- 10
imageDPI <- 200
errorBarColor <- rgb( 140, 140, 140, maxColorValue=255 )

theme <- theme( plot.title=element_text( hjust = 0.5, size = 32, face='bold' ),
                legend.position="bottom",
                legend.text=element_text( size=22 ),
                legend.title = element_blank(),
                legend.key.size = unit( 1.5, 'lines' ),
                plot.subtitle = element_text( size=16, hjust=1.0 ) )

subtitle <- paste( "Last Updated: ", format( Sys.time(), format = "%b %d, %Y at %I:%M %p %Z" ), sep="" )

colors <- scale_fill_manual( values=c( "#F77670",
                                       "#619DFA",
                                       "#18BA48" ) )

# --------------------------
# Port Up Generate Main Plot
# --------------------------

print( "Generating main plot (Port Up Latency)." )

mainPlot <- ggplot( data = upAvgsDataFrame, aes( x = scale,
                                            y = ms,
                                            fill = type,
                                            ymin = fileData[ 'up_end_to_end_avg' ],
                                            ymax = fileData[ 'up_end_to_end_avg' ] + stds ) )

# --------------------------------------
# Port Up Fundamental Variables Assigned
# --------------------------------------

print( "Generating fundamental graph data (Port Up Latency)." )

title <- labs( title = "Port Up Latency", subtitle = subtitle )

fundamentalGraphData <- mainPlot +
                        xScaleConfig +
                        xLabel +
                        yLabel +
                        fillLabel +
                        theme +
                        wrapLegend +
                        title +
                        colors

# -----------------------------------
# Port Up Generating Bar Graph Format
# -----------------------------------

print( "Generating bar graph with error bars (Port Up Latency)." )

barGraphFormat <- geom_bar( stat = "identity",
                            width = barWidth )
errorBarFormat <- geom_errorbar( width = barWidth,
                                 color = errorBarColor )

values <- geom_text( aes( x = upAvgsDataFrame$scale,
                          y = sumOfUpAvgs + 0.03 * max( sumOfUpAvgs ),
                          label = format( sumOfUpAvgs,
                                          digits=3,
                                          big.mark = ",",
                                          scientific = FALSE ) ),
                          size = 7.0,
                          fontface = "bold" )

result <- fundamentalGraphData +
          barGraphFormat +
          errorBarFormat +
          values

# -------------------------------
# Port Up Exporting Graph to File
# -------------------------------

print( paste( "Saving bar chart with error bars (Port Up Latency) to", errBarOutputFileUp ) )

tryCatch( ggsave( errBarOutputFileUp,
                  width = imageWidth,
                  height = imageHeight,
                  dpi = imageDPI ),
          error = function( e ){
              print( "[ERROR] There was a problem saving the graph due to a graph formatting exception.  Error dump:" )
              print( e )
              quit( status = 1 )
          }
        )

print( paste( "[SUCCESS] Successfully wrote bar chart with error bars (Port Up Latency) out to", errBarOutputFileUp ) )

# ----------------------------
# Port Down Generate Main Plot
# ----------------------------

print( "Generating main plot (Port Down Latency)." )

mainPlot <- ggplot( data = downAvgsDataFrame, aes( x = scale,
                                              y = ms,
                                              fill = type,
                                              ymin = fileData[ 'down_end_to_end_avg' ],
                                              ymax = fileData[ 'down_end_to_end_avg' ] + stds ) )

# ----------------------------------------
# Port Down Fundamental Variables Assigned
# ----------------------------------------

print( "Generating fundamental graph data (Port Down Latency)." )

title <- labs( title = "Port Down Latency", subtitle = subtitle )

fundamentalGraphData <- mainPlot +
                        xScaleConfig +
                        xLabel +
                        yLabel +
                        fillLabel +
                        theme +
                        wrapLegend +
                        title +
                        colors

# -------------------------------------
# Port Down Generating Bar Graph Format
# -------------------------------------

print( "Generating bar graph with error bars (Port Down Latency)." )

barGraphFormat <- geom_bar( stat = "identity",
                            width = barWidth )
errorBarFormat <- geom_errorbar( width = barWidth,
                                 color = errorBarColor )

values <- geom_text( aes( x = downAvgsDataFrame$scale,
                          y = sumOfDownAvgs + 0.03 * max( sumOfDownAvgs ),
                          label = format( sumOfDownAvgs,
                                          digits=3,
                                          big.mark = ",",
                                          scientific = FALSE ) ),
                          size = 7.0,
                          fontface = "bold" )

result <- fundamentalGraphData +
          barGraphFormat +
          errorBarFormat +
          values

# ---------------------------------
# Port Down Exporting Graph to File
# ---------------------------------

print( paste( "Saving bar chart with error bars (Port Down Latency) to", errBarOutputFileDown ) )

tryCatch( ggsave( errBarOutputFileDown,
                  width = imageWidth,
                  height = imageHeight,
                  dpi = imageDPI ),
          error = function( e ){
              print( "[ERROR] There was a problem saving the graph due to a graph formatting exception.  Error dump:" )
              print( e )
              quit( status = 1 )
          }
        )

print( paste( "[SUCCESS] Successfully wrote bar chart with error bars (Port Down Latency) out to", errBarOutputFileDown ) )
quit( status = 0 )
