package net.filebot.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

public class Movie extends SearchResult {

	protected int year;
	protected int imdbId;
	protected int tmdbId;

	// optional movie name language hint
	protected String language;

	public Movie() {
		// used by deserializer
	}

	public Movie(int imdbId) {
		this(null, null, 0, imdbId, 0, null);
	}

	public Movie(String name, int year) {
		this(name, null, year, 0, 0, null);
	}

	public Movie(String name, int year, int imdbId) {
		this(name, null, year, imdbId, 0, null);
	}

	public Movie(String name, String[] aliasNames, int year, int imdbId, int tmdbId, Locale locale) {
		super(tmdbId > 0 ? tmdbId : imdbId > 0 ? imdbId : 0, name, aliasNames);
		this.year = year;
		this.imdbId = imdbId;
		this.tmdbId = tmdbId;
		this.language = locale == null ? null : locale.getLanguage();
	}

	public Movie(Movie movie) {
		super(movie.id, movie.name, movie.aliasNames);
		this.year = movie.year;
		this.imdbId = movie.imdbId;
		this.tmdbId = movie.tmdbId;
		this.language = movie.language;
	}

	public int getYear() {
		return year;
	}

	public int getImdbId() {
		return imdbId;
	}

	public int getTmdbId() {
		return tmdbId;
	}

	public Locale getLanguage() {
		return language == null ? null : new Locale(language);
	}

	public String getNameWithYear() {
		return toString(name, year);
	}

	@Override
	public List<String> getEffectiveNames() {
		if (aliasNames == null || aliasNames.length == 0) {
			return Collections.singletonList(toString(name, year));
		}

		List<String> names = new ArrayList<String>(1 + aliasNames.length);
		names.add(toString(name, year));
		for (String alias : aliasNames) {
			names.add(toString(alias, year));
		}
		return names;
	}

	public List<String> getEffectiveNamesWithoutYear() {
		return super.getEffectiveNames();
	}

	@Override
	public boolean equals(Object object) {
		if (object instanceof Movie) {
			Movie other = (Movie) object;

			if (tmdbId > 0 && other.tmdbId > 0) {
				return tmdbId == other.tmdbId;
			}
			if (imdbId > 0 && other.imdbId > 0) {
				return imdbId == other.imdbId;
			}

			return year == other.year && name.equals(other.name);
		}

		return false;
	}

	@Override
	public Movie clone() {
		return new Movie(name, aliasNames, year, imdbId, tmdbId, getLanguage());
	}

	@Override
	public String toString() {
		return toString(name, year);
	}

	private static String toString(String name, int year) {
		return String.format("%s (%04d)", name, year < 0 ? 0 : year);
	}

}
