require(data.table)

# Read data
tourney_seed <- fread('../input/TourneySeeds.csv')
tourney_slot <- fread('../input/TourneySlots.csv')
tourney_seed[, c('Region', 'Seed_int'):=.(substr(Seed, 1, 1), as.integer(substr(Seed, 2, 3)))]
setnames(tourney_slot, 3:4, c('Seed1', 'Seed2'))
tourney_slot[, Round:=as.integer(substr(Slot, 2, 2))]

# Round 0 = First Four
tourney_slot[nchar(Slot)==3, Round:=0L]
round0 <- tourney_seed[grepl('a|b', Seed)]
round0[, Seed:=gsub('a|b', '', Seed)]
tourney_seed <- rbind(tourney_seed, round0)
rm(round0)

# Round 1
slots <- merge(tourney_slot, tourney_seed, by.x=c('Season', 'Seed1'), by.y=c('Season', 'Seed'), all.x=T)
slots <- merge(slots, tourney_seed, by.x=c('Season', 'Seed2'), by.y=c('Season', 'Seed'), all.x=T, suffix=c('1', '2'))
slots <- rbind(slots[!is.na(Team1), .(Season, Slot, Seed1, Seed2, Team1, Team2, Round)]
               , slots[!is.na(Team1), .(Season, Slot, Seed1=Seed2, Team1=Team2, Seed2=Seed1, Team2=Team1, Round)], use.names=T)

# Round 2-6
for (r in 2:6){
  temp <- merge(tourney_slot[Round==r, .(Season, Slot, Seed=Seed1)], slots[, .(Season, Seed=Slot, Seed1, Team1)], by=c('Season', 'Seed'), allow.cartesian = T)
  temp2 <- merge(tourney_slot[Round==r, .(Season, Slot, Seed=Seed2)], slots[, .(Season, Seed=Slot, Seed2, Team2)], by=c('Season', 'Seed'), allow.cartesian = T)
  
  slots2 <- merge(temp[, !'Seed', with=F], temp2[, !'Seed', with=F], by=c('Season', 'Slot'), allow.cartesian = T)
  slots2 <- rbind(slots2, slots2[, .(Season, Slot, Seed1=Seed2, Team1=Team2, Seed2=Seed1, Team2=Team1)], use.names=T)
  slots2[, Round:=r]
  
  slots <- rbind(slots, slots2, use.names=T)
  rm(temp, temp2, slots2); gc()
  slots <- unique(slots)
}

rm(tourney_seed, tourney_slot)
setkey(slots, Season, Team1)

# Usage: California = team 1143
print('Opponents Cal may have defeated to reach round 4 in 2016.')
print(slots[J(2016, 1143)][Round<4])

print('Opponents Cal may face in round 4.')
print(slots[J(2016, 1143)][Round==4])

write.csv(slots, 'slots.csv', row.names=F)