// Path: android/src/main/java/com/raulh82vlc/MoviesFinder/domain/api/WebServicesApiCallsImpl.java
// public class WebServicesApiCallsImpl implements WebServicesApiCalls<SearchJSONResults, Movie> {
// 
//     private APIInterface mAPIInterface;
// 
//     @Inject
//     WebServicesApiCallsImpl() {
//         RestAdapter restAdapterRetrofit = new RestAdapter.Builder()
//                 .setEndpoint(APIConstants.HOST_URL)
//                 .setLogLevel(RestAdapter.LogLevel.FULL)
//                 .build();
//         this.mAPIInterface = restAdapterRetrofit.create(APIInterface.class);
//     }
// 
//     @Override
//     public SearchJSONResults getMoviesList(String query) {
//         return mAPIInterface.getMoviesList(query);
//     }
// 
//     @Override
//     public Movie getMovieDetail(String id) {
//         return mAPIInterface.getMovieDetails(id);
//     }
// }
// 
// Path: domain/src/main/java/com/raulh82vlc/MoviesFinder/domain/exceptions/InternetConnectionException.java
// public class InternetConnectionException extends Exception {
//     public InternetConnectionException(String detailMessage) {
//         super(detailMessage);
//     }
// }
// 
// Path: domain/src/main/java/com/raulh82vlc/MoviesFinder/domain/models/Movie.java
// public class Movie {
//     @SerializedName("Genre")
//     private String genre;
// 
//     @SerializedName("Director")
//     private String director;
// 
//     @SerializedName("Runtime")
//     private String duration;
// 
//     @SerializedName("Writer")
//     private String writer;
// 
//     @SerializedName("Actors")
//     private String actors;
// 
//     @SerializedName("Language")
//     private String language;
// 
//     @SerializedName("Plot")
//     private String synopsis;
// 
//     @SerializedName("Awards")
//     private String awards;
// 
//     @SerializedName("imdbRating")
//     private String rating;
// 
//     @SerializedName("imdbVotes")
//     private String numVotes;
// 
//     @SerializedName("Rated")
//     private String ratedForPublic;
// 
//     public String getDirector() {
//         return director;
//     }
// 
//     public String getDuration() {
//         return duration;
//     }
// 
//     public String getWriter() {
//         return writer;
//     }
// 
//     public String getActors() {
//         return actors;
//     }
// 
//     public String getLanguage() {
//         return language;
//     }
// 
//     public String getSynopsis() {
//         return synopsis;
//     }
// 
//     public String getAwards() {
//         return awards;
//     }
// 
//     public String getRating() {
//         return rating;
//     }
// 
//     public String getNumVotes() {
//         return numVotes;
//     }
// 
//     public String getRatedForPublic() {
//         return ratedForPublic;
//     }
// }
// 
// Path: domain/src/main/java/com/raulh82vlc/MoviesFinder/domain/models/SearchJSONResults.java
// public class SearchJSONResults {
// 
//     @SerializedName("Search")
//     private List<SearchJSONEntity> searchList;
// 
//     public List<SearchJSONEntity> getSearchList() {
//         return searchList;
//     }
// 
//     public class SearchJSONEntity {
//         @SerializedName("Title")
//         private String title;
//         @SerializedName("Year")
//         private String year;
//         @SerializedName("Type")
//         private String type;
//         private String imdbID;
//         @SerializedName("Poster")
//         private String imageUrl;
// 
//         public String getTitle() {
//             return title;
//         }
// 
//         public String getYear() {
//             return year;
//         }
// 
//         public String getType() {
//             return type;
//         }
// 
//         public String getImdbID() {
//             return imdbID;
//         }
// 
//         public String getImageUrl() {
//             return imageUrl;
//         }
//     }
// }
// 
// Path: android/src/main/java/com/raulh82vlc/MoviesFinder/domain/repository/datasources/APIDataSource.java
// public interface APIDataSource<L, M> {
// 
//     /**
//      * Gets a Search results with movies list from the API
//      *
//      * @param query user query
//      */
//     L getMoviesList(String query) throws InternetConnectionException;
// 
//     /**
//      * Gets a Movie from the API
//      *
//      * @param id identifier of the movie
//      */
//     M getMovieDetail(String id) throws InternetConnectionException;
// }


import retrofit.RetrofitError;
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import com.raulh82vlc.MoviesFinder.R;
import com.raulh82vlc.MoviesFinder.domain.api.WebServicesApiCallsImpl;
import com.raulh82vlc.MoviesFinder.domain.exceptions.InternetConnectionException;
import com.raulh82vlc.MoviesFinder.domain.models.Movie;
import com.raulh82vlc.MoviesFinder.domain.models.SearchJSONResults;
import com.raulh82vlc.MoviesFinder.domain.repository.datasources.APIDataSource;
import javax.inject.Inject;

    /**
     * Starts Movies List Request
     *
     * @return List of movies
     * @throws InternetConnectionException
     */
    private Movie startMovieRequest(String id) throws InternetConnectionException {
        if (isThereInternetConnection(mContext)) {
            try {
                return mWebServicesApiCallsImpl.getMovieDetail(id);
            } catch (RetrofitError e) {
                throw new InternetConnectionException(e.getMessage());
            }
        } else {
            throw new InternetConnectionException(mContext.getString(R.string.internet_connection_error));
        }
    }

    /**
     * Starts Movies List Request
     *
     * @return Search results
     * @throws InternetConnectionException
     */
    private SearchJSONResults startMovieFromListRequest(String query) throws InternetConnectionException {
        if (isThereInternetConnection(mContext)) {
            try {
                return mWebServicesApiCallsImpl.getMoviesList(query);
            } catch (RetrofitError e) {
// Path: android/src/main/java/com/raulh82vlc/MoviesFinder/domain/api/WebServicesApiCallsImpl.java
// public class WebServicesApiCallsImpl implements WebServicesApiCalls<SearchJSONResults, Movie> {
// 
//     private APIInterface mAPIInterface;
// 
//     @Inject
//     WebServicesApiCallsImpl() {
//         RestAdapter restAdapterRetrofit = new RestAdapter.Builder()
//                 .setEndpoint(APIConstants.HOST_URL)
//                 .setLogLevel(RestAdapter.LogLevel.FULL)
//                 .build();
//         this.mAPIInterface = restAdapterRetrofit.create(APIInterface.class);
//     }
// 
//     @Override
//     public SearchJSONResults getMoviesList(String query) {
//         return mAPIInterface.getMoviesList(query);
//     }
// 
//     @Override
//     public Movie getMovieDetail(String id) {
//         return mAPIInterface.getMovieDetails(id);
//     }
// }
// 
// Path: domain/src/main/java/com/raulh82vlc/MoviesFinder/domain/exceptions/InternetConnectionException.java
// public class InternetConnectionException extends Exception {
//     public InternetConnectionException(String detailMessage) {
//         super(detailMessage);
//     }
// }
// 
// Path: domain/src/main/java/com/raulh82vlc/MoviesFinder/domain/models/Movie.java
// public class Movie {
//     @SerializedName("Genre")
//     private String genre;
// 
//     @SerializedName("Director")
//     private String director;
// 
//     @SerializedName("Runtime")
//     private String duration;
// 
//     @SerializedName("Writer")
//     private String writer;
// 
//     @SerializedName("Actors")
//     private String actors;
// 
//     @SerializedName("Language")
//     private String language;
// 
//     @SerializedName("Plot")
//     private String synopsis;
// 
//     @SerializedName("Awards")
//     private String awards;
// 
//     @SerializedName("imdbRating")
//     private String rating;
// 
//     @SerializedName("imdbVotes")
//     private String numVotes;
// 
//     @SerializedName("Rated")
//     private String ratedForPublic;
// 
//     public String getDirector() {
//         return director;
//     }
// 
//     public String getDuration() {
//         return duration;
//     }
// 
//     public String getWriter() {
//         return writer;
//     }
// 
//     public String getActors() {
//         return actors;
//     }
// 
//     public String getLanguage() {
//         return language;
//     }
// 
//     public String getSynopsis() {
//         return synopsis;
//     }
// 
//     public String getAwards() {
//         return awards;
//     }
// 
//     public String getRating() {
//         return rating;
//     }
// 
//     public String getNumVotes() {
//         return numVotes;
//     }
// 
//     public String getRatedForPublic() {
//         return ratedForPublic;
//     }
// }
// 
// Path: domain/src/main/java/com/raulh82vlc/MoviesFinder/domain/models/SearchJSONResults.java
// public class SearchJSONResults {
// 
//     @SerializedName("Search")
//     private List<SearchJSONEntity> searchList;
// 
//     public List<SearchJSONEntity> getSearchList() {
//         return searchList;
//     }
// 
//     public class SearchJSONEntity {
//         @SerializedName("Title")
//         private String title;
//         @SerializedName("Year")
//         private String year;
//         @SerializedName("Type")
//         private String type;
//         private String imdbID;
//         @SerializedName("Poster")
//         private String imageUrl;
// 
//         public String getTitle() {
//             return title;
//         }
// 
//         public String getYear() {
//             return year;
//         }
// 
//         public String getType() {
//             return type;
//         }
// 
//         public String getImdbID() {
//             return imdbID;
//         }
// 
//         public String getImageUrl() {
//             return imageUrl;
//         }
//     }
// }
// 
// Path: android/src/main/java/com/raulh82vlc/MoviesFinder/domain/repository/datasources/APIDataSource.java
// public interface APIDataSource<L, M> {
// 
//     /**
//      * Gets a Search results with movies list from the API
//      *
//      * @param query user query
//      */
//     L getMoviesList(String query) throws InternetConnectionException;
// 
//     /**
//      * Gets a Movie from the API
//      *
//      * @param id identifier of the movie
//      */
//     M getMovieDetail(String id) throws InternetConnectionException;
// }


// Path: android/src/main/java/com/raulh82vlc/MoviesFinder/domain/datasources/APIDataSourceImpl.java
import retrofit.RetrofitError;
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import com.raulh82vlc.MoviesFinder.R;
import com.raulh82vlc.MoviesFinder.domain.api.WebServicesApiCallsImpl;
import com.raulh82vlc.MoviesFinder.domain.exceptions.InternetConnectionException;
import com.raulh82vlc.MoviesFinder.domain.models.Movie;
import com.raulh82vlc.MoviesFinder.domain.models.SearchJSONResults;
import com.raulh82vlc.MoviesFinder.domain.repository.datasources.APIDataSource;
import javax.inject.Inject;


    /**
     * Starts Movies List Request
     *
     * @return List of movies
     * @throws InternetConnectionException
     */
    private Movie startMovieRequest(String id) throws InternetConnectionException {
        if (isThereInternetConnection(mContext)) {
            try {
                return mWebServicesApiCallsImpl.getMovieDetail(id);
            } catch (RetrofitError e) {
                throw new InternetConnectionException(e.getMessage());
            }
        } else {
            throw new InternetConnectionException(mContext.getString(R.string.internet_connection_error));
        }
    }

    /**
     * Starts Movies List Request
     *
     * @return Search results
     * @throws InternetConnectionException
     */
    private SearchJSONResults startMovieFromListRequest(String query) throws InternetConnectionException {
        if (isThereInternetConnection(mContext)) {
            try {
                return mWebServicesApiCallsImpl.getMoviesList(query);
            } catch (RetrofitError e) {
                throw new InternetConnectionException(e.getMessage());