# 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( "**********************************************************" )
has_flow_obj = 1
database_host = 2
database_port = 3
database_u_id = 4
database_pw = 5
test_name = 6
branch_name = 7
batch_size = 8
old_flow = 9
save_directory = 10

# 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 SCPFIntentInstallWithdrawRerouteLat.R",
                                  "<isFlowObj>" ,
                                  "<database-host>",
                                  "<database-port>",
                                  "<database-user-id>",
                                  "<database-password>",
                                  "<test-name>",
                                  "<branch-name>",
                                  "<batch-size>",
                                  "<using-old-flow>",
                                  "<directory-to-save-graphs>",
                                  sep=" " ) )
    q()  # basically exit(), but in R
}

# -----------------------------------
# Create File Name and Title of Graph
# -----------------------------------

print( "Creating filename and title of graph." )

chartTitle <- "Intent Install, Withdraw, & Reroute Latencies"
flowObjFileModifier <- ""
errBarOutputFile <- paste( args[ save_directory ],
                    "SCPFIntentInstallWithdrawRerouteLat_",
                    args[ branch_name ],
                    sep="" )

if ( args[ has_flow_obj ] == "y" ){
    errBarOutputFile <- paste( errBarOutputFile, "_fobj", sep="" )
    flowObjFileModifier <- "fobj_"
    chartTitle <- paste( chartTitle, "w/ FlowObj" )
}
if ( args[ old_flow ] == "y" ){
    errBarOutputFile <- paste( errBarOutputFile, "_OldFlow", sep="" )
    chartTitle <- paste( chartTitle,
                         "With Old Flow",
                         sep="\n" )
}
errBarOutputFile <- paste( errBarOutputFile,
                           "_",
                           args[ batch_size ],
                           "-batchSize_graph.jpg",
                           sep="" )

chartTitle <- paste( chartTitle,
                     "\nBatch Size =",
                     args[ batch_size ],
                     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 ] )

# ---------------------------------------
# Intent Install and Withdraw SQL Command
# ---------------------------------------
print( "Generating Intent Install and Withdraw SQL Command" )

installWithdrawSQLCommand <- paste( "SELECT * FROM intent_latency_",
                                    flowObjFileModifier,
                                    "tests WHERE batch_size=",
                                    args[ batch_size ],
                                    " AND branch = '",
                                    args[ branch_name ],
                                    "' AND date IN ( SELECT MAX( date ) FROM intent_latency_",
                                    flowObjFileModifier,
                                    "tests WHERE branch='",
                                    args[ branch_name ],
                                    "' AND ",
                                    ( if( args[ old_flow ] == 'y' ) "" else "NOT " ) ,
                                    "is_old_flow",
                                    ")",
                                    sep="" )

print( "Sending Intent Install and Withdraw SQL command:" )
print( installWithdrawSQLCommand )
installWithdrawData <- dbGetQuery( con, installWithdrawSQLCommand )

# --------------------------
# Intent Reroute SQL Command
# --------------------------

print( "Generating Intent Reroute SQL Command" )

rerouteSQLCommand <- paste( "SELECT * FROM intent_reroute_latency_",
                            flowObjFileModifier,
                            "tests WHERE batch_size=",
                            args[ batch_size ],
                            " AND branch = '",
                            args[ branch_name ],
                            "' AND date IN ( SELECT MAX( date ) FROM intent_reroute_latency_",
                            flowObjFileModifier,
                            "tests WHERE branch='",
                            args[ branch_name ],
                            "' AND ",
                            ( if( args[ old_flow ] == 'y' ) "" else "NOT " ) ,
                            "is_old_flow",
                            ")",
                            sep="" )

print( "Sending Intent Reroute SQL command:" )
print( rerouteSQLCommand )
rerouteData <- dbGetQuery( con, rerouteSQLCommand )

# **********************************************************
# STEP 2: Organize Data.
# **********************************************************

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

# -------------------------------------------------------
# Combining Install, Withdraw, and Reroute Latencies Data
# -------------------------------------------------------

print( "Combining Install, Withdraw, and Reroute Latencies Data" )

if ( ncol( rerouteData ) == 0 ){  # Checks if rerouteData exists, so we can exclude it if necessary
    avgs <- c( installWithdrawData[ 'install_avg' ],
               installWithdrawData[ 'withdraw_avg' ] )
} else{
    colnames( rerouteData ) <- c( "date",
                                  "name",
                                  "date",
                                  "branch",
                                  "is_old_flow",
                                  "commit",
                                  "scale",
                                  "batch_size",
                                  "reroute_avg",
                                  "reroute_std" )

    avgs <- c( installWithdrawData[ 'install_avg' ],
               installWithdrawData[ 'withdraw_avg' ],
               rerouteData[ 'reroute_avg' ] )
}

# Combine lists into data frames.
dataFrame <- melt( avgs )

# --------------------
# Construct Data Frame
# --------------------

print( "Constructing data frame." )

if ( ncol( rerouteData ) == 0 ){  # Checks if rerouteData exists (due to batch size) for the dataFrame this time
    dataFrame$scale <- c( installWithdrawData$scale,
                          installWithdrawData$scale )

    dataFrame$stds <- c( installWithdrawData$install_std,
                         installWithdrawData$withdraw_std )
} else{
    dataFrame$scale <- c( installWithdrawData$scale,
                          installWithdrawData$scale,
                          rerouteData$scale )

    dataFrame$stds <- c( installWithdrawData$install_std,
                         installWithdrawData$withdraw_std,
                         rerouteData$reroute_std )
}

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

# Format data frame so that the data is in the same order as it appeared in the file.
dataFrame$type <- as.character( dataFrame$type )
dataFrame$type <- factor( dataFrame$type, levels=unique( dataFrame$type ) )

dataFrame <- na.omit( dataFrame ) # Omit any data that doesn't exist

print( "Data Frame Results:" )
print( dataFrame )

# **********************************************************
# STEP 3: Generate graph.
# **********************************************************

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

# -------------------
# Main Plot Generated
# -------------------

print( "Creating the main plot." )

mainPlot <- ggplot( data = dataFrame, aes( x = scale,
                                           y = ms,
                                           ymin = ms,
                                           ymax = ms + stds,
                                           fill = type ) )

# ------------------------------
# Fundamental Variables Assigned
# ------------------------------

print( "Generating fundamental graph data." )

theme_set( theme_grey( base_size = 22 ) )
barWidth <- 1.3
xScaleConfig <- scale_x_continuous( breaks = c( 1, 3, 5, 7, 9) )
xLabel <- xlab( "Scale" )
yLabel <- ylab( "Latency (ms)" )
fillLabel <- labs( fill="Type" )
title <- ggtitle( chartTitle )
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' ) )

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

# Store plot configurations as 1 variable
fundamentalGraphData <- mainPlot +
                        xScaleConfig +
                        xLabel +
                        yLabel +
                        fillLabel +
                        theme +
                        title +
                        colors

# ---------------------------
# Generating Bar Graph Format
# ---------------------------

print( "Generating bar graph with error bars." )

barGraphFormat <- geom_bar( stat = "identity",
                            width = barWidth,
                            position = "dodge" )

errorBarFormat <- geom_errorbar( width = barWidth,
                                 position = position_dodge( barWidth ),
                                 color = errorBarColor )

values <- geom_text( aes( x = dataFrame$scale,
                          y = dataFrame$ms + 0.035 * max( dataFrame$ms ),
                          label = format( dataFrame$ms,
                                          digits = 3,
                                          big.mark = ",",
                                          scientific = FALSE ) ),
                          position = position_dodge( width = barWidth ),
                          size = 5.5,
                          fontface = "bold" )

wrapLegend <- guides( fill = guide_legend( nrow = 1, byrow = TRUE ) )

result <- fundamentalGraphData +
          barGraphFormat +
          errorBarFormat +
          values +
          wrapLegend

# -----------------------
# Exporting Graph to File
# -----------------------

print( paste( "Saving bar chart with error bars to", errBarOutputFile ) )

ggsave( errBarOutputFile,
        width = imageWidth,
        height = imageHeight,
        dpi = imageDPI )

print( paste( "[SUCCESS] Successfully wrote bar chart with error bars out to", errBarOutputFile ) )
