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 getRuntime() {
083                return stream().map(Episode::getRuntime).mapToInt(Integer::intValue).sum();
084        }
085
086        @Override
087        public Integer getId() {
088                return getFirst().getId();
089        }
090
091        @Override
092        public SeriesInfo getSeriesInfo() {
093                return getFirst().getSeriesInfo();
094        }
095
096        @Override
097        public List<String> getSeriesNames() {
098                return getFirst().getSeriesNames();
099        }
100
101        @Override
102        public boolean equals(Object obj) {
103                if (obj instanceof MultiEpisode) {
104                        MultiEpisode other = (MultiEpisode) obj;
105                        return Arrays.equals(episodes, other.episodes);
106                }
107                return false;
108        }
109
110        @Override
111        public int hashCode() {
112                return Arrays.hashCode(episodes);
113        }
114
115        @Override
116        public MultiEpisode clone() {
117                return new MultiEpisode(episodes);
118        }
119
120        @Override
121        public MultiEpisode derive(String seriesName, Integer season, Integer episode, String title, Integer absolute, SimpleDate airdate) {
122                Episode[] m = new Episode[episodes.length];
123                for (int i = 0; i < episodes.length; i++) {
124                        m[i] = episodes[i].derive(seriesName, season, up(episode, i), title, up(absolute, i), airdate);
125                }
126                return new MultiEpisode(m);
127        }
128
129        private Integer up(Integer i, int delta) {
130                return i == null ? null : i + delta;
131        }
132
133        @Override
134        public String toString() {
135                return EpisodeFormat.DEFAULT.formatMultiEpisode(episodes);
136        }
137
138}