num_days       <- 28
num_zones      <- 5
num_categories <- 6
total_rows     <- num_days * num_zones * num_categories

# Pre-allocate the dataframe columns
warehouse_data <- data.frame(
  Day            = integer(total_rows),
  Zone           = integer(total_rows),
  Category       = integer(total_rows),
  UnitsProcessed = integer(total_rows),
  ProcessingTime = numeric(total_rows)
)


# Nested loops to generate every Day x Zone x Category combination
row_index <- 1

for (day in 1:num_days) {
  for (zone in 1:num_zones) {
    for (category in 1:num_categories) {
      
      # Random integer between -12 and +12
      random_noise <- sample(-12:12, 1)
      
      units_processed <- 100 + (zone * 8) + (category * 5) + random_noise
      processing_time <- units_processed * 0.85
      
      warehouse_data$Day[row_index]            <- day
      warehouse_data$Zone[row_index]           <- zone
      warehouse_data$Category[row_index]       <- category
      warehouse_data$UnitsProcessed[row_index] <- units_processed
      warehouse_data$ProcessingTime[row_index] <- processing_time
      
      row_index <- row_index + 1
    }
  }
}







# Display first 10 rows and dimensions
cat("Warehouse Dataset\n")
print(head(warehouse_data, 10))
cat("\nDimensions (rows, columns):\n")
print(dim(warehouse_data))

# STEP 2: Total units processed per zone



zone_totals <- data.frame(
  Zone       = 1:num_zones,
  TotalUnits = numeric(num_zones)
)

for (zone in 1:num_zones) {
  running_total <- 0
  
  for (row in 1:nrow(warehouse_data)) {
    if (warehouse_data$Zone[row] == zone) {
      running_total <- running_total + warehouse_data$UnitsProcessed[row]
    }
  }
  
  zone_totals$TotalUnits[zone] <- running_total
}




cat("\nTotal Units per Zone \n")
print(zone_totals)

# STEP 3: Average processing time per category


category_average_time <- data.frame(
  Category              = 1:num_categories,
  AverageProcessingTime = numeric(num_categories)
)

for (category in 1:num_categories) {
  total_time   <- 0
  record_count <- 0
  
  for (row in 1:nrow(warehouse_data)) {
    if (warehouse_data$Category[row] == category) {
      total_time   <- total_time + warehouse_data$ProcessingTime[row]
      record_count <- record_count + 1
    }
  }
  
  category_average_time$AverageProcessingTime[category] <- total_time / record_count
}
cat("\n Average Processing Time per Category \n")
print(category_average_time)


# STEP 4: Identify processing anomalies


processing_anomalies <- data.frame(
  Day              = warehouse_data$Day,
  Zone             = warehouse_data$Zone,
  Category         = warehouse_data$Category,
  UnitsProcessed   = warehouse_data$UnitsProcessed,
  DailyZoneAverage = numeric(total_rows),
  Anomaly          = logical(total_rows)
)

# Calculate the daily average for each day and zone (across 6 categories)
for (day in 1:num_days) {
  for (zone in 1:num_zones) {
    
    units_sum   <- 0
    units_count <- 0
    
    for (row in 1:nrow(warehouse_data)) {
      if (warehouse_data$Day[row] == day && warehouse_data$Zone[row] == zone) {
        units_sum   <- units_sum + warehouse_data$UnitsProcessed[row]
        units_count <- units_count + 1
      }
    }
    
    daily_zone_average <- units_sum / units_count
    
    # Assign the average and flag anomalies for matching records
    for (row in 1:nrow(warehouse_data)) {
      if (warehouse_data$Day[row] == day && warehouse_data$Zone[row] == zone) {
        
        units_value <- warehouse_data$UnitsProcessed[row]
        
        processing_anomalies$DailyZoneAverage[row] <- daily_zone_average
        
        if (units_value > daily_zone_average * 1.15 ||
            units_value < daily_zone_average * 0.85) {
          processing_anomalies$Anomaly[row] <- TRUE
        } else {
          processing_anomalies$Anomaly[row] <- FALSE
        }
      }
    }
  }
}

# Display the first 10 anomalous records
anomaly_records <- processing_anomalies[processing_anomalies$Anomaly == TRUE, ]

cat("\n STEP 4: First 10 Anomalies \n")
print(head(anomaly_records, 10))
cat("\nTotal anomalies found:", nrow(anomaly_records), "\n")

# STEP 5: Most productive day for each zone


peak_zone_days <- data.frame(
  Zone       = 1:num_zones,
  Day        = integer(num_zones),
  TotalUnits = numeric(num_zones)
)

for (zone in 1:num_zones) {
  best_day   <- 0
  best_total <- -1
  
  for (day in 1:num_days) {
    day_total <- 0
    
    for (row in 1:nrow(warehouse_data)) {
      if (warehouse_data$Zone[row] == zone && warehouse_data$Day[row] == day) {
        day_total <- day_total + warehouse_data$UnitsProcessed[row]
      }
    }
    
    # Keep the day with the highest total
    if (day_total > best_total) {
      best_total <- day_total
      best_day   <- day
    }
  }
  
  peak_zone_days$Day[zone]        <- best_day
  peak_zone_days$TotalUnits[zone] <- best_total
}

cat("\n Peak Day for Each Zone \n")
print(peak_zone_days)