library(forecast)
#library(reshape2)
library(foreach)
library(doMC)
library(data.table)

gc()
# Input data files are available in the "../input/" directory.
#setwd("..//input//")


#forecast h days:
h = 16

train <- fread("..//input//train.csv", skip = 86672217, header = FALSE, colClasses = c("integer", "character", "integer", "integer", "double", "logical"))
setnames(train, c("id","date", "store_nbr", "item_nbr", "unit_sales","onpromotion"))
stores <- fread("..//input//stores.csv", colClasses = c("integer","character","character","factor","factor"))
items <- fread("..//input//items.csv", colClasses = c("integer","factor","factor","numeric"))
#holidays_events <- fread("..//input//holidays_events.csv", colClasses = c("character", "factor", "factor", "character", "character", "logical"))
#oil <- fread("..//input//oil.csv", colClasses = c("character","numeric"))
#sample_submission <- fread("..//input//sample_submission.csv", colClasses = c("integer", "double"))
#test data will be loaded when needed
#transactions <- fread("..//input//transactions.csv", colClasses = c("character","integer","integer"))

#stores actually present in train data
storeslist <- as.numeric(levels(as.factor(train$store_nbr)))
colnames(train)
#initialize matrix of forecasts
bigfc <- data.table()

#forecast one store at a time
#Register cores for parallel computing
registerDoMC(detectCores()-1)
mysub <- foreach(s = 1:length(storeslist), .combine=rbind, .inorder = TRUE ) %dopar% { 
  
  #select one store
  s_train <- as.data.table(train[train$store_nbr == storeslist[s],] )

  #cast (reshape) the data, to have one column per time series
  sales <- dcast(s_train, date ~ store_nbr + item_nbr, value.var = "unit_sales")
  #onpromotion <- cast(s_train, date ~ store_nbr + item_nbr, value = "unit_sales")

  #keep only last 365 days of wide data
  sales <- tail(sales,365)
  
  rm("s_train")
  gc()
  
  #create time series and record row and column names
  sales.ts <- ts(sales[,2:length(names(sales))], frequency = 7)
  dates <- as.Date(sales[[1]])              #row names
  ts.names <- colnames(sales.ts)  #column names
  rm(list = c("sales"))
  colnames(sales.ts)
  
  #Forecast
  fc <- foreach( i = 1:ncol(sales.ts), .combine=cbind, .inorder=TRUE, .packages=c("forecast")) %do% { 
    fit <- snaive(sales.ts[,i], h=h)
    fc <- forecast(fit)$mean
    }
  rm(sales.ts)
  gc()
  
  #prepare data to melt
  fc <- as.data.table(fc)
  colnames(fc)
  
  colnames(fc)<-ts.names
  fc$date <- as.character(max(dates)+1:nrow(fc))
  
  #melt
  s_sub <- melt(fc,id = "date",variable.name = "store_item", value.name = "unit_sales")
  #clean mem
  rm("fc")
  gc()
  sp <- strsplit(as.character(s_sub$store_item),'_')
  sp <- do.call(rbind,sp)
  
  #prepare data to submission format
  s_sub$store_nbr <- sp[,1]
  s_sub$item_nbr <- sp[,2]
  s_sub$store_item <- NULL
  
  mysub <- s_sub
  }


#load test data
test <- fread("..//input//test.csv", colClasses = c("integer", "character", "integer", "integer","logical"))

is.vector(mysub$unit_sales)
dim(mysub)
summary(mysub)
mysub$unit_sales[is.na(mysub$unit_sales)] <- 0
mysub$store_nbr <- as.integer(mysub$store_nbr)
mysub$item_nbr <- as.integer(mysub$item_nbr)
submission <- merge(test,mysub, all.x = TRUE)
submission <- submission[,c("id","unit_sales")]
submission$unit_sales[is.na(submission$unit_sales) | submission$unit_sales<0] <- 0

#export submission file
write.csv(submission, "snaive1.csv", row.names = FALSE)
rm(list=ls())
gc()