const shuffleArray = array => {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
const temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
const totalShows = 26;
const seasonsPerShow = 20;
const episodesPerSeason = 40;
const totalWatchedShows = totalShows * seasonsPerShow * episodesPerSeason + 1;
let seasonOffset = 1;
let showIdOffset = 0;
let episodeNumber = 1;
const watchedShows = [];
for (let i = 1; i < totalWatchedShows; i++) {
watchedShows.push({
id: i,
season: seasonOffset,
episode: episodeNumber,
showId: i - showIdOffset,
});
showIdOffset =
i !== 0 && i % (seasonsPerShow * episodesPerSeason) === 0
? showIdOffset
: showIdOffset + 1;
seasonOffset =
i !== 0 && i % episodesPerSeason === 0
? seasonOffset + 1
: seasonOffset;
episodeNumber++;
episodeNumber = episodeNumber === episodesPerSeason + 1 ? 1 : episodeNumber;
if (seasonOffset === seasonsPerShow + 1) {
seasonOffset = 1;
}
}
shuffleArray(watchedShows)
const shows = [];
for (let i = 0; i < totalShows; i++) {
const seasons = [];
const episodes = [];
for (let k = 0; k < episodesPerSeason; k++) {
episodes.push({
episode: k + 1,
});
}
for (let j = 0; j < seasonsPerShow; j++) {
seasons.push({ season_number: j + 1, episodes });
}
shows.push({ id: i + 1, seasons });
}
shuffleArray(shows)
const newShowObject = {};
for (const show of shows) {
newShowObject[show.id] = { ...show };
}
for (const show of watchedShows) {
for (const season of newShowObject[show.showId].seasons) {
if (season.season_number !== show.season) {
continue;
}
season.episodes = season.episodes.filter(
(episode) => episode.episode !== show.episode
);
}
newShowObject[show.showId].seasons = newShowObject[show.showId].seasons.filter(
(season) => season.episodes.length > 0
);
}
const unwatchedShows = [...Object.values(newShowObject)].filter(
(show) => show.seasons.length > 0
);
const newShowObject = {};
for (const show of shows) {
newShowObject[show.id] = { ...show };
const newSeasons = {};
for (const seasons of show.seasons) {
newSeasons[seasons.season_number] = { ...seasons };
const newEpisodes = {};
for (const episodes of seasons.episodes) {
newEpisodes[episodes.episode] = { ...episodes };
}
newSeasons[seasons.season_number].episodes = { ...newEpisodes };
}
newShowObject[show.id].seasons = { ...newSeasons };
}
for (const show of watchedShows) {
delete newShowObject[show.showId].seasons[show.season].episodes[show.episode];
}
let unwatchedShows = [...Object.values(newShowObject)];
for (const show of unwatchedShows) {
show.seasons = [...Object.values(show.seasons)];
for (const season of show.seasons) {
season.episodes = [...Object.values(season.episodes)];
}
show.seasons = show.seasons.filter((season) => season.episodes.length > 0);
}
unwatchedShows = unwatchedShows.filter((show) => show.seasons.length > 0);
const newShowArray = [];
for (const show of shows) {
const seasons = [];
for (const season of show.seasons) {
const episodes = [];
for (const episode of season.episodes) {
const isEpisodeWatched = watchedShows.some((watchedShow) => {
return (
show.id === watchedShow.showId &&
season.season_number === watchedShow.season &&
episode.episode === watchedShow.episode
);
});
!isEpisodeWatched && episodes.push(episode);
}
episodes.length > 0 && seasons.push({ ...season, episodes });
}
seasons.length > 0 && newShowArray.push({ ...show, seasons });
}