library(stringr)

preprocess_products <- function(product_data) {
  
  product_names <- as.character(product_data$NombreProducto)
  weight <- unlist(lapply(product_names, extract_weight))
  volume <- unlist(lapply(product_names, extract_volume))
  pieces <- unlist(lapply(product_names, extract_pieces))
  pct <- unlist(lapply(product_names, extract_pct))
  pieces_pq <- unlist(lapply(product_names, extract_pieces_pq))
  len <- unlist(lapply(product_names, extract_len))

  product_names <- clean_last_word(product_names)
  product_names <- clean_weight(product_names)
  product_names <- clean_pieces_pq(product_names)
  product_names <- clean_pieces(product_names)
  product_names <- clean_volume(product_names)
  product_names <- clean_pct(product_names)
  product_names <- clean_upper(product_names)
  product_names <- clean_len(product_names)

  data.frame(
    ID=product_data$Producto_ID,
    product_name=product_names,
    weight=weight,
    volume=volume,
    pct=pct,
    pieces=pieces,
    pieces_pq=pieces_pq,
    weight_per_piece=weight/pieces,
    len=len
  )
}
clean_upper <- function(product_name) {
  gsub("\\s[A-Z]{2,3}", "", product_name)
}

clean_last_word <- function(product_name) {
  gsub("\\s*\\w*$", "", product_name)
}
clean_weight <- function(product_name) {
  gsub("\\d+(Kg|g)", "", product_name)
}
clean_volume <- function(product_name) {
  gsub("\\d+(L|ml)", "", product_name)
}

clean_pieces_pq <- function(product_name) {
  gsub("\\d+(pq|Pq)", "", product_name)
}
clean_pieces <- function(product_name) {
  gsub("\\d+p\\b", "", product_name)
}

clean_brand<- function(product_name) {
  gsub("\\s*\\w*$", "", product_name)
}

clean_pct<- function(product_name) {
  gsub("(\\d+)(pct)", "", product_name)
}

clean_len<- function(product_name) {
  gsub("(\\d+)(in)", "", product_name)
}

extract_token <- function(value, expr) {
  tokens <- strsplit(value, " ")
  index <- grep(expr, tokens)
  ifelse(length(index) == 0, NA, tokens[index[1]])
}

extract_weight <- function(product_name) {
  weight_str <- extract_token(product_name, "\\d+[Kg|g]")
  if (is.na(weight_str)) return(NA)
  groups <- str_match_all(weight_str, "(\\d+)(Kg|g)")
  weight <- strtoi(groups[[1]][2])
  unit <- groups[[1]][3]
  ifelse(unit == "Kg", 1000 * weight, weight)
}
extract_volume <- function(product_name) {
  volume_str <- extract_token(product_name, "\\d+[L|ml]")
  if (is.na(volume_str)) return(NA)
  groups <- str_match_all(volume_str, "(\\d+)(L|ml)")
  volume <- strtoi(groups[[1]][2])
  unit <- groups[[1]][3]
  ifelse(unit == "L", 1000 * volume, volume)
}

extract_pct <- function(product_name) {
  pct_str <- extract_token(product_name, "\\d+pct")
  if (is.na(pct_str)) return(NA)
  groups <- str_match_all(pct_str, "(\\d+)(pct)")
  return(strtoi(groups[[1]][2]))
}
extract_len<- function(product_name) {
  in_str <- extract_token(product_name, "\\d+in")
  if (is.na(in_str)) return(NA)
  groups <- str_match_all(in_str, "(\\d+)(in)")
  return(strtoi(groups[[1]][2]))
}
extract_pieces <- function(product_name) {
  pieces_str <- extract_token(product_name, "\\d+p\\b")
  if (is.na(pieces_str)) return(NA)
  groups <- str_match_all(pieces_str, "(\\d+)(p\\b)")
  return(strtoi(groups[[1]][2]))
}

extract_pieces_pq <- function(product_name) {
  pieces_pq_str <- extract_token(product_name, "\\d+[pq|Pq]")
  if (is.na(pieces_pq_str)) return(NA)
  groups <- str_match_all(pieces_pq_str, "(\\d+)(pq|Pq)")
  return(strtoi(groups[[1]][2]))
}

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)
preprocessed <- replace(preprocessed, is.na(preprocessed), 0)
write.csv(preprocessed, 'preprocessed_products.csv', row.names = FALSE)