# SMART CITY UTILITIES OPERATIONS SIMULATION

# TASK A - GENERATE PRODUCTION DATA

# Set seed for reproducibility
set.seed(123)

# Create empty vectors
day_list <- c()
utility_list <- c()
team_list <- c()
output_list <- c()

# Base output
BaseOutput <- 40

# Use nested loops to generate data
for(day in 1:30)
{
  for(utility in 1:6)
  {
    for(team in 1:5)
    {
      
      # Generate random noise between -5 and +5
      RandomNoise <- sample(-5:5, 1)
      
      # Calculate output
      Output <- BaseOutput + (utility * 3) + (team * 2) + RandomNoise
      
      # Store values
      day_list <- c(day_list, day)
      utility_list <- c(utility_list, utility)
      team_list <- c(team_list, team)
      output_list <- c(output_list, Output)
    }
  }
}

# Create dataframe
production_data <- data.frame(
  Day = day_list,
  Utility = utility_list,
  Team = team_list,
  Output = output_list
)

# Display first 10 rows
cat("FIRST 10 ROWS OF production_data\n")
print(head(production_data, 10))



# TASK B - TOTAL PRODUCTION PER UTILITY
# Create empty vectors
utility_id <- c()
total_output <- c()

# Calculate total output for each utility using loops
for(u in 1:6)
{
  
  total <- 0
  
  for(i in 1:nrow(production_data))
  {
    if(production_data$Utility[i] == u)
    {
      total <- total + production_data$Output[i]
    }
  }
  
  utility_id <- c(utility_id, u)
  total_output <- c(total_output, total)
}

# Create utility_totals dataframe
utility_totals <- data.frame(
  Utility = utility_id,
  TotalOutput = total_output
)

# Display utility totals
cat("\nTOTAL PRODUCTION PER UTILITY\n")
print(utility_totals)


# TASK C - DETECT PRODUCTION ANOMALIES
# Create vectors for anomalies dataframe
anom_day <- c()
anom_utility <- c()
anom_team <- c()
anom_output <- c()
anom_status <- c()

# Loop through each row
for(i in 1:nrow(production_data))
{
  
  current_day <- production_data$Day[i]
  current_utility <- production_data$Utility[i]
  current_output <- production_data$Output[i]
  
  # Calculate daily utility average
  total <- 0
  count <- 0
  
  for(j in 1:nrow(production_data))
  {
    if(production_data$Day[j] == current_day &&
       production_data$Utility[j] == current_utility)
    {
      total <- total + production_data$Output[j]
      count <- count + 1
    }
  }
  
  daily_average <- total / count
  
  # Check anomaly condition
  deviation <- abs(current_output - daily_average)
  
  if(deviation > (0.10 * daily_average))
  {
    anomaly_value <- TRUE
  }
  else
  {
    anomaly_value <- FALSE
  }
  
  # Store values
  anom_day <- c(anom_day, current_day)
  anom_utility <- c(anom_utility, current_utility)
  anom_team <- c(anom_team, production_data$Team[i])
  anom_output <- c(anom_output, current_output)
  anom_status <- c(anom_status, anomaly_value)
}

# Create anomalies dataframe
anomalies <- data.frame(
  Day = anom_day,
  Utility = anom_utility,
  Team = anom_team,
  Output = anom_output,
  Anomaly = anom_status
)

# Display first 10 anomalies detected
cat("\nFIRST 10 ANOMALIES DETECTED\n")
print(head(anomalies[anomalies$Anomaly == TRUE, ], 10))


# TASK D - IDENTIFY PEAK PRODUCTIVITY DAYS
# Create empty vectors
peak_utility <- c()
peak_day <- c()
peak_total_output <- c()

# Find peak day for each utility
for(u in 1:6)
{
  
  max_total <- -9999
  best_day <- 0
  
  for(d in 1:30)
  {
    
    daily_total <- 0
    
    for(i in 1:nrow(production_data))
    {
      if(production_data$Utility[i] == u &&
         production_data$Day[i] == d)
      {
        daily_total <- daily_total + production_data$Output[i]
      }
    }
    
    # Check maximum
    if(daily_total > max_total)
    {
      max_total <- daily_total
      best_day <- d
    }
  }
  
  # Store results
  peak_utility <- c(peak_utility, u)
  peak_day <- c(peak_day, best_day)
  peak_total_output <- c(peak_total_output, max_total)
}

# Create peak_days dataframe
peak_days <- data.frame(
  Utility = peak_utility,
  Day = peak_day,
  TotalOutput = peak_total_output
)

# Display peak productivity days
cat("\nPEAK PRODUCTIVITY DAYS\n")
print(peak_days)


# TASK E - CALCULATE EFFICIENCY SCORE
# Create empty vector
efficiency_scores <- c()

# Calculate efficiency score using loop
for(i in 1:nrow(production_data))
{
  
  score <- production_data$Output[i] /
    (production_data$Utility[i] + production_data$Team[i])
  
  efficiency_scores <- c(efficiency_scores, score)
}

# Add EfficiencyScore column
production_data$EfficiencyScore <- efficiency_scores

# Display first 10 rows of updated dataframe
cat("\nUPDATED production_data WITH EfficiencyScore\n")
print(head(production_data, 10))


# TASK F - CODE PRESENTATION
cat("PROGRAM COMPLETED SUCCESSFULLY\n")

cat("\nTotal Records Generated:", nrow(production_data), "\n")
cat("Total Utilities:", length(unique(production_data$Utility)), "\n")
cat("Total Teams:", length(unique(production_data$Team)), "\n")
cat("Total Days:", length(unique(production_data$Day)), "\n")