#' Get market balances without intra trade from CAPMOD results
#'
#' @param datacube A dplyr table with the raw capmod results
#' @param region_list A character list of regions
#' @param product_list List of commodities
#'
#'
#' @return A tibble containing the market balance
#'
#' @export
#'
get_market_balance <- function(datacube, region_list, product_list){

  bal_item    <- c("PROD", "HCON", "PROC", "BIOF", "FEED", "ISCH", "Imports_noIntra", "Exports_noIntra")


  datacube <- datacube %>%
    filter(.i1 %in% region_list, .i2 == "", .i3 %in% bal_item, .i4 %in% product_list, .i5 != "BAS") %>%
    select(.i1, .i3, .i4, .i5, dataOut)

  return(datacube)

}

#' Get product balances from CAPMOD results
#'
#' @param datacube A dplyr table with the raw capmod results
#' @param region_list A character list of regions
#' @param product_list List of commodities
#'
#'
#' @return A tibble containing the product balance
#'
#' @export
#'
get_product_balance <- function(datacube, region_list, product_list){

  bal_item    <- c("GROF", "LOSF", "SEDF", "INTF", "MAPR", "IMPT", "INTP", "EXPT", "NTRD", "DOMM", "FEDM", "SEDM", "PRCM", "BIOF", "INDM", "LOSM", "STCM")

  datacube <- datacube %>%
    filter(.i1 %in% region_list, .i2 == "", .i3 %in% bal_item, .i4 %in% product_list, .i5 != "BAS") %>%
    select(.i1, .i3, .i4, .i5, dataOut)

  return(datacube)

}


#' Get the table Farm Supply details
#'
#'
#' @param datacube A dplyr table with the raw capmod results
#' @param region_list A character list of regions
#' @param product_list List of commodities
#'
#'
#' @return A tibble containing the supply details
#'
#' @export
#'
get_supply_detail <- function(datacube, region_list, product_list){

  bal_item    <- c("MGVA", "YILD", "LEVL")

  # note that supply must be calculated = YILD * LEVL


  datacube <- datacube %>%
    filter(.i1 %in% region_list, .i2 == "", .i3 %in% product_list, .i4 %in% bal_item, .i5 != "BAS") %>%
    select(.i1, .i3, .i4, .i5, dataOut)

  return(datacube)

}



#' Convert market balances into a pre-defined format (for reporting purposes)
#'
#' 1: calcualate nettrade
#' 2: append years (2010, 2013, 2020, 2025, 2030)
#'
#' @param region_list A character list of regions
#' @param product_list List of commodities
#' @param scenario_list List of scenarios
#' @param folder Path to folder with result files, default "mydata"
#'
#' @return A tibble with the reporting table
#'
#' @export
#'
convert_balance_ntrd <- function(region_list, product_list, scenario_list, folder = "mydata"){

  for(i in 1:length(scenario_list)) {load(file=paste(folder, "/", scenario_list[i], ".RData", sep=""))}


  balance <- get_market_balance(get(scenario_list[1]), region_list, product_list)

  if (length(scenario_list) > 1) {
    for(i in 2:length(scenario_list)){


      balance <- rbind(balance, get_market_balance(get(scenario_list[i]), region_list, product_list))


    }
  }

  # calculate net trade (exports - imports)
  balance <- spread(balance, .i3, dataOut)

  # replace NAs with zeros
  balance[is.na(balance)] <- 0

  # add columns if missing (missing data)
  if(!("PROD" %in% colnames(balance))) { balance <- mutate(balance, PROD = 0)}
  if(!("HCON" %in% colnames(balance))) { balance <- mutate(balance, HCON = 0)}
  if(!("PROC" %in% colnames(balance))) { balance <- mutate(balance, PROC = 0)}
  if(!("BIOF" %in% colnames(balance))) { balance <- mutate(balance, BIOF = 0)}
  if(!("FEED" %in% colnames(balance))) { balance <- mutate(balance, FEED = 0)}
  if(!("ISCH" %in% colnames(balance))) { balance <- mutate(balance, ISCH = 0)}
  if(!("Imports_noIntra" %in% colnames(balance))) { balance <- mutate(balance, Imports_noIntra = 0)}
  if(!("Exports_noIntra" %in% colnames(balance))) { balance <- mutate(balance, Exports_noIntra = 0)}


# calculate net trade
  balance <- balance %>% mutate(nettrade = Exports_noIntra - Imports_noIntra)

# calculate aggregate demand/supply (product specific demand positions)
  meat_item   <- c("PROD", "HCON", "ISCH", "Imports_noIntra", "Exports_noIntra")
  dairy_item  <- c("PROD", "HCON", "PROC", "BIOF", "FEED", "ISCH", "Imports_noIntra", "Exports_noIntra")

  meat_product       <- c("PORK", "POUM", "BEEF", "SGMT")
  dairy_product      <- c("MILK", "BUTT", "CREM", "FRMI", "CHES", "SMIP", "COCM", "WMIO", "CASE", "WHEP")
  cereal_product     <- c("CERE", "RYEM", "WHEA", "OATS", "BARL", "OCER", "MAIZ", "RICE")
  oilseeds_product   <- c("RAPE", "SOYA", "SUNF")
  cakes_product      <- c("RAPC", "SUNC", "SOYC", "CAKS")
  oils_product       <- c("RAPO", "SUNO", "SOYO", "OLIO", "PLMO")


  meats   <- balance %>% filter(.i4 %in% meat_product)
  dairy   <- balance %>% filter(.i4 %in% dairy_product)
  cereals <- balance %>% filter(.i4 %in% cereal_product)
  oilseeds<- balance %>% filter(.i4 %in% oilseeds_product)
  cakes   <- balance %>% filter(.i4 %in% cakes_product)
  oils    <- balance %>% filter(.i4 %in% oils_product)

  rm(balance)

  meats <- meats %>%
    mutate(supply = PROD + ISCH) %>%
    mutate(demand = HCON)

  meats <- meats %>% select(.i1, .i4, .i5, supply, demand, Exports_noIntra, Imports_noIntra, nettrade)

  cereals <- cereals %>%
     mutate(supply = PROD + ISCH) %>%
     mutate(demand = HCON + PROC + BIOF + FEED)

  cereals <- cereals %>% select(.i1, .i4, .i5, supply, demand, Exports_noIntra, Imports_noIntra, nettrade)

  dairy <- dairy %>%
    mutate(supply = PROD) %>%
    mutate(demand = HCON + PROC + FEED)

  dairy <- dairy %>% select(.i1, .i4, .i5, supply, demand, Exports_noIntra, Imports_noIntra, nettrade)

  oilseeds <- oilseeds %>%
    mutate(supply = PROD) %>%
    mutate(demand = HCON + PROC + FEED)

  oilseeds <- oilseeds %>% select(.i1, .i4, .i5, supply, demand, Exports_noIntra, Imports_noIntra, nettrade)

  cakes <- cakes %>%
    mutate(supply = PROD) %>%
    mutate(demand = HCON + FEED)

  cakes <- cakes %>% select(.i1, .i4, .i5, supply, demand, Exports_noIntra, Imports_noIntra, nettrade)

  oils <- oils %>%
    mutate(supply = PROD) %>%
    mutate(demand = HCON + PROC + FEED + BIOF)

  oils <- oils %>% select(.i1, .i4, .i5, supply, demand, Exports_noIntra, Imports_noIntra, nettrade)


  balance <- rbind(meats, dairy, cereals, oilseeds, cakes, oils)

# get rid of WHEA if not selected by the user
  balance <- balance %>% filter(.i4 %in% product_list)

  balance <- balance %>%
      arrange(.i4, .i1, .i5) %>%
      select(.i4, .i1, .i5, supply, demand, Exports_noIntra, Imports_noIntra, nettrade)


  return(balance)
}

#' Auxiliary function to load results (LEVL, YILD) related to dairying.