# Task A - Generate Production Data

# Set seed for reproducibility
set.seed(123)

# Base output value
BaseOutput <- 40

# Create empty vectors
Day <- c()
Utility <- c()
Team <- c()
Output <- c()

# Generate production data using nested loops
for (day in 1:30) {
  
  for (utility in 1:6) {
    
    for (team in 1:5) {
      
      RandomNoise <- sample(-5:5, 1)
      
      ProductionOutput <- BaseOutput +
        (utility * 3) +
        (team * 2) +
        RandomNoise
      
      Day <- c(Day, day)
      Utility <- c(Utility, utility)
      Team <- c(Team, team)
      Output <- c(Output, ProductionOutput)
    }
  }
}

# Create production_data dataframe
production_data <- data.frame(
  Day = Day,
  Utility = Utility,
  Team = Team,
  Output = 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 empty dataframe
utility_totals <- data.frame(
  Utility = integer(),
  TotalOutput = numeric()
)

# Calculate total output for each utility using loops
for (utility in 1:6) {
  
  TotalOutput <- 0
  
  for (i in 1:nrow(production_data)) {
    
    if (production_data$Utility[i] == utility) {
      TotalOutput <- TotalOutput + production_data$Output[i]
    }
  }
  
  utility_totals <- rbind(
    utility_totals,
    data.frame(
      Utility = utility,
      TotalOutput = TotalOutput
    )
  )
}

cat("\nUTILITY TOTALS\n")
print(utility_totals)


# Task C - Detect Production Anomalies

# Create empty anomalies dataframe
anomalies <- data.frame(
  Day = integer(),
  Utility = integer(),
  Team = integer(),
  Output = numeric(),
  Anomaly = logical()
)

# Calculate anomalies using loops
for (day in 1:30) {
  
  for (utility in 1:6) {
    
    UtilityTotal <- 0
    
    for (i in 1:nrow(production_data)) {
      
      if (production_data$Day[i] == day &&
          production_data$Utility[i] == utility) {
        
        UtilityTotal <- UtilityTotal +
          production_data$Output[i]
      }
    }
    
    UtilityAverage <- UtilityTotal / 5
    
    for (i in 1:nrow(production_data)) {
      
      if (production_data$Day[i] == day &&
          production_data$Utility[i] == utility) {
        
        CurrentOutput <- production_data$Output[i]
        
        DifferencePercent <-
          abs(CurrentOutput - UtilityAverage) /
          UtilityAverage * 100
        
        IsAnomaly <- DifferencePercent > 10
        
        anomalies <- rbind(
          anomalies,
          data.frame(
            Day = production_data$Day[i],
            Utility = production_data$Utility[i],
            Team = production_data$Team[i],
            Output = CurrentOutput,
            Anomaly = IsAnomaly
          )
        )
      }
    }
  }
}

cat("\nFIRST 10 ANOMALIES DETECTED\n")
print(head(anomalies[anomalies$Anomaly == TRUE, ], 10))


# Task D - Identify Peak Productivity Days

# Create peak_days dataframe
peak_days <- data.frame(
  Utility = integer(),
  Day = integer(),
  TotalOutput = numeric()
)

# Find peak day for each utility
for (utility in 1:6) {
  
  MaxOutput <- -999999
  PeakDay <- 0
  
  for (day in 1:30) {
    
    DailyTotal <- 0
    
    for (i in 1:nrow(production_data)) {
      
      if (production_data$Utility[i] == utility &&
          production_data$Day[i] == day) {
        
        DailyTotal <- DailyTotal +
          production_data$Output[i]
      }
    }
    
    if (DailyTotal > MaxOutput) {
      MaxOutput <- DailyTotal
      PeakDay <- day
    }
  }
  
  peak_days <- rbind(
    peak_days,
    data.frame(
      Utility = utility,
      Day = PeakDay,
      TotalOutput = MaxOutput
    )
  )
}

cat("\nPEAK PRODUCTIVITY DAYS\n")
print(peak_days)


# Task E - Calculate Efficiency Score

# Add EfficiencyScore column
production_data$EfficiencyScore <- 0

# Calculate efficiency score using loops
for (i in 1:nrow(production_data)) {
  
  production_data$EfficiencyScore[i] <-
    production_data$Output[i] /
    (production_data$Utility[i] +
       production_data$Team[i])
}

cat("\nFIRST 10 ROWS WITH EFFICIENCY SCORE\n")
print(head(production_data, 10))
