# Task A - Generate Production Data

# Set seed for reproducibility
set.seed(123)

# Create empty vectors to store data
Day <- c()
Utility <- c()
Team <- c()
Output <- c()

# Base output value
BaseOutput <- 40

# Nested loops to generate production data
for (d in 1:30) {
  
  for (u in 1:6) {
    
    for (t in 1:5) {
      
      # Generate random noise between -5 and +5
      RandomNoise <- sample(-5:5, 1)
      
      # Calculate output
      CurrentOutput <- BaseOutput + (u * 3) + (t * 2) + RandomNoise
      
      # Store values in vectors
      Day <- c(Day, d)
      Utility <- c(Utility, u)
      Team <- c(Team, t)
      Output <- c(Output, CurrentOutput)
    }
  }
}

# Create dataframe
production_data <- data.frame(
  Day,
  Utility,
  Team,
  Output
)

# Display first 10 rows
cat("First 10 Rows of production_data:\n")
print(head(production_data, 10))


# Task B - Total Production per Utility


# Create vectors to store totals
UtilityID <- c()
TotalOutput <- c()

# Loop through each utility
for (u in 1:6) {
  
  utility_sum <- 0
  
  # Loop through all rows in dataframe
  for (i in 1:nrow(production_data)) {
    
    if (production_data$Utility[i] == u) {
      utility_sum <- utility_sum + production_data$Output[i]
    }
  }
  
  # Store results
  UtilityID <- c(UtilityID, u)
  TotalOutput <- c(TotalOutput, utility_sum)
}

# Create Utility_totals dataframe
Utility_totals <- data.frame(
  Utility = UtilityID,
  TotalOutput = TotalOutput
)

# Display Utility_totals
cat("\nTotal Production per Utility:\n")
print(Utility_totals)



# Task C - Detect Production Anomalies


# Create vectors for anomaly dataframe
AnomalyDay <- c()
AnomalyUtility <- c()
AnomalyTeam <- c()
AnomalyOutput <- c()
AnomalyFlag <- c()

# Loop through each day and utility
for (d in 1:30) {
  
  for (u in 1:6) {
    
    # Calculate total output for current utility and day
    daily_total <- 0
    
    for (i in 1:nrow(production_data)) {
      
      if (production_data$Day[i] == d &&
          production_data$Utility[i] == u) {
        
        daily_total <- daily_total + production_data$Output[i]
      }
    }
    
    # Calculate average output for the utility on that day
    # (5 teams in total)
    daily_average <- daily_total / 5
    
    # Check anomalies for each team
    for (i in 1:nrow(production_data)) {
      
      if (production_data$Day[i] == d &&
          production_data$Utility[i] == u) {
        
        current_output <- production_data$Output[i]
        
        # Calculate deviation percentage
        deviation <- abs(current_output - daily_average) / daily_average
        
        # Mark anomaly if deviation > 10%
        if (deviation > 0.10) {
          anomaly_status <- TRUE
        } else {
          anomaly_status <- FALSE
        }
        
        # Store data
        AnomalyDay <- c(AnomalyDay, d)
        AnomalyUtility <- c(AnomalyUtility, u)
        AnomalyTeam <- c(AnomalyTeam, production_data$Team[i])
        AnomalyOutput <- c(AnomalyOutput, current_output)
        AnomalyFlag <- c(AnomalyFlag, anomaly_status)
      }
    }
  }
}

# Create anomalies dataframe
anomalies <- data.frame(
  Day = AnomalyDay,
  Utility = AnomalyUtility,
  Team = AnomalyTeam,
  Output = AnomalyOutput,
  Anomaly = AnomalyFlag
)

# Display first 10 detected anomalies
cat("\nFirst 10 Detected Anomalies:\n")
print(head(anomalies[anomalies$Anomaly == TRUE, ], 10))



# Task D - Identify Peak Productivity Days


# Create vectors for peak days dataframe
PeakUtility <- c()
PeakDay <- c()
PeakOutput <- c()

# Loop through each utility
for (u in 1:6) {
  
  max_output <- -1
  best_day <- 0
  
  # Loop through each day
  for (d in 1:30) {
    
    daily_total <- 0
    
    # Calculate total output for utility on current day
    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 for maximum output
    if (daily_total > max_output) {
      max_output <- daily_total
      best_day <- d
    }
  }
  
  # Store results
  PeakUtility <- c(PeakUtility, u)
  PeakDay <- c(PeakDay, best_day)
  PeakOutput <- c(PeakOutput, max_output)
}

# Create peak_days dataframe
peak_days <- data.frame(
  Utility = PeakUtility,
  Day = PeakDay,
  TotalOutput = PeakOutput
)

# Display peak productivity days
cat("\nPeak Productivity Days:\n")
print(peak_days)



# Task E - Calculate Efficiency Score


# Create empty vector for efficiency scores
EfficiencyScore <- 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])
  
  EfficiencyScore <- c(EfficiencyScore, score)
}

# Add EfficiencyScore column to dataframe
production_data$EfficiencyScore <- EfficiencyScore

# Display first 10 rows of updated dataframe
cat("\nUpdated production_data with EfficiencyScore:\n")
print(head(production_data, 10))
