001package net.filebot.web;
002
003import java.util.Arrays;
004import java.util.Collection;
005import java.util.Iterator;
006import java.util.List;
007import java.util.stream.Stream;
008
009public class MultiEpisode extends Episode implements Iterable<Episode> {
010
011        protected Episode[] episodes;
012
013        public MultiEpisode() {
014                // used by deserializer
015        }
016
017        public MultiEpisode(Episode... episodes) {
018                this.episodes = episodes.clone();
019        }
020
021        public MultiEpisode(Collection<Episode> episodes) {
022                this.episodes = episodes.toArray(new Episode[0]);
023        }
024
025        public Episode[] getEpisodes() {
026                return episodes.clone();
027        }
028
029        public int count() {
030                return episodes.length;
031        }
032
033        public Episode getFirst() {
034                return episodes[0];
035        }
036
037        public Stream<Episode> stream() {
038                return Arrays.stream(episodes);
039        }
040
041        @Override
042        public Iterator<Episode> iterator() {
043                return stream().iterator();
044        }
045
046        @Override
047        public String getSeriesName() {
048                return getFirst().getSeriesName();
049        }
050
051        @Override
052        public Integer getEpisode() {
053                return getFirst().getEpisode();
054        }
055
056        @Override
057        public Integer getSeason() {
058                return getFirst().getSeason();
059        }
060
061        @Override
062        public String getTitle() {
063                return EpisodeFormat.DEFAULT.formatMultiTitle(episodes);
064        }
065
066        @Override
067        public Integer getAbsolute() {
068                return getFirst().getAbsolute();
069        }
070
071        @Override
072        public Integer getSpecial() {
073                return getFirst().getSpecial();
074        }
075
076        @Override
077        public SimpleDate getAirdate() {
078                return getFirst().getAirdate();
079        }
080
081        @Override
082        public Integer getId() {
083                return getFirst().getId();
084        }
085
086        @Override
087        public SeriesInfo getSeriesInfo() {
088                return getFirst().getSeriesInfo();
089        }
090
091        @Override
092        public List<String> getSeriesNames() {
093                return getFirst().getSeriesNames();
094        }
095
096        @Override
097        public boolean equals(Object obj) {
098                if (obj instanceof MultiEpisode) {
099                        MultiEpisode other = (MultiEpisode) obj;
100                        return Arrays.equals(episodes, other.episodes);
101                }
102                return false;
103        }
104
105        @Override
106        public int hashCode() {
107                return Arrays.hashCode(episodes);
108        }
109
110        @Override
111        public MultiEpisode clone() {
112                return new MultiEpisode(episodes);
113        }
114
115        @Override
116        public MultiEpisode derive(String seriesName, Integer season, Integer episode, String title, Integer absolute, SimpleDate airdate) {
117                Episode[] m = new Episode[episodes.length];
118                for (int i = 0; i < episodes.length; i++) {
119                        m[i] = episodes[i].derive(seriesName, season, up(episode, i), title, up(absolute, i), airdate);
120                }
121                return new MultiEpisode(m);
122        }
123
124        private Integer up(Integer i, int delta) {
125                return i == null ? null : i + delta;
126        }
127
128        @Override
129        public String toString() {
130                return EpisodeFormat.DEFAULT.formatMultiEpisode(episodes);
131        }
132
133}