# Adds flags for beverages and 'healthy' products.
# Assumes a density of 1g/ml for every beverage

library(stringr)

preprocess_products <- function(product_data) {
	
	product_names <- as.character(product_data$NombreProducto)
	weight <- unlist(lapply(product_names, extract_weight))
	pieces <- unlist(lapply(product_names, extract_pieces))
	brand <- unlist(lapply(product_names, extract_brand))
	is_beverage <- unlist(lapply(product_names, grepl, pattern='\\d+ml'))
	is_healthy <- unlist(lapply(product_names, grepl, pattern='(100|0)pct|Multigrano|Integral|Fibra'))

	df = data.frame(
		ID=product_data$Producto_ID,
		product_name=product_names,
		brand=brand,
		weight=weight,
		pieces=pieces,
		weight_per_piece=weight/pieces,
		is_beverage=is_beverage,
		is_healthy=is_healthy
	)
	df[df$is_beverage, 'weight_per_piece'] = df[df$is_beverage, 'weight']
	df[df$is_beverage, 'weight'] = df[df$is_beverage, 'weight'] * df[df$is_beverage, 'pieces']
	df
}

extract_weight <- function(product_name) {
	weight_str <- strsplit(tolower(product_name), ' ')
	groups <- str_match_all(weight_str, '(\\d+)(k?g|ml)')
	weight <- strtoi(groups[[1]][2])
	unit <- groups[[1]][3]
	ifelse(unit == 'kg', 1000 * weight, weight)
}

extract_pieces <- function(product_name) {
	pieces_str <- str_match_all(tolower(product_name), '(\\d+)(p)\\b')[[1]][2]
	num_pieces = strtoi(pieces_str)
	if (is.na(num_pieces)) return(1)
	num_pieces
}

extract_brand <- function(product_name) {
	tokens <- strsplit(product_name, ' ')[[1]]
	tokens[length(tokens) - 1]
}

product_data <- read.csv('../input/producto_tabla.csv')
preprocessed <- preprocess_products(product_data)
write.csv(preprocessed, 'preprocessed_products.csv')