library(sqldf)


createExpByProject <- function(ChangeFile, projects)
{
  browser()
  changeTable = read.csv(ChangeFile, header=FALSE, quote="'")
  colnames(changeTable) = c("project", "sha", "author", "author_email", "date", "is_bug_fix")
  changeTable$date <- as.POSIXct(as.Date(changeTable$date))
  stopifnot(any(is.na(changeTable$date)) == FALSE)
  start = TRUE
  for(project in projects)
  {
    subTable = sqldf(paste("SELECT * FROM changeTable WHERE project = \'", project,"\'",sep=""))
    if(start)
    {
      start = FALSE
      expTemp <- createExpFile(subTable)
    }
    else
    {
      expTemp <- rbind(expTemp, createExpFile(subTable))
    }
  }
  return(expTemp)
}


createExpFile <- function(ChangeFile)
{
  #browser()
  changeTable = read.csv(ChangeFile, header=FALSE, quote="'")
  colnames(changeTable) = c("project", "sha", "author", "author_email", "date", "is_bug_fix")
  changeTable$date <- as.POSIXct(as.Date(changeTable$date))
  stopifnot(any(is.na(changeTable$date)) == FALSE)
  expCalcTable = sqldf("SELECT ct1.*, ct2.sha as prior_sha, ct2.date as prior_date, 
                   ct2.is_bug_fix as prior_bug_fixes, ct2.author_email as prior_email FROM changeTable as ct1 
                   INNER JOIN changeTable as ct2 
                   ON ct1.project == ct2.project AND ct1.author_email == ct2.author_email AND ct1.date > ct2.date")
  stopifnot(any(expCalcTable$author_email == expCalcTable$prior_email) == TRUE)

  expTable = sqldf("SELECT project, sha, author, author_email, date, is_bug_fix, 
                   count(distinct(prior_sha)) as dev_commits FROM expCalcTable 
                   GROUP BY project, sha, author, author_email, date, is_bug_fix
                   ORDER by author_email, date")
  expFinal = sqldf("SELECT changeTable.*, expTable.dev_commits as dev_commits FROM changeTable
                   LEFT JOIN expTable ON changeTable.sha = expTable.sha 
                   AND changeTable.project = expTable.project
                   AND changeTable.author_email = expTable.author_email")
  expFinal[is.na(expFinal$dev_commits),]$dev_commits = 0
  return(expFinal)
}

getBlameTable <- function(BlameFile)
{
  blameTable = read.csv(BlameFile, header=FALSE)
  colnames(blameTable) <- c("filepath", "LineNumber", "sha", "author_email", "last_modified")
  blameTable$last_modified = as.Date(blameTable$last_modified)
  blameTable$filepath = as.character(blameTable$filepath)
  #Thanks to thelatemail at for the string split in R
  #https://stackoverflow.com/questions/33683862/first-entry-from-string-split?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
  blameTable$project = vapply(strsplit(blameTable$filepath,"/"), `[`, 1, FUN.VALUE=character(1))
  stopifnot(any(is.na(blameTable$last_modified)) == FALSE)
  stopifnot(any(is.na(blameTable$filepath)) == FALSE)
  stopifnot(any(is.na(blameTable$project)) == FALSE)
  return(blameTable)
}

addExpRows <- function(transTable, blameTable, expTable)
{
  #browser()
  transBlame = sqldf("SELECT blameTable.project, transTable.*, blameTable.author_email as author_email, 
                     blameTable.sha as sha, blameTable.last_modified as last_modified FROM transTable 
                     INNER JOIN blameTable ON transTable.filepath = blameTable.filepath 
                     AND transTable.LineNumber = blameTable.LineNumber")
  
  transFinal = sqldf("SELECT transBlame.*, expTable.is_bug_fix, expTable.dev_commits FROM
                     transBlame LEFT JOIN expTable ON transBlame.sha = expTable.sha
                     AND transBlame.author_email = expTable.author_email")
  transFinal[is.na(transFinal$dev_commits),]$dev_commits = 0 #These ones don't have any prior days with commits.
  return(transFinal)
}
  