package io.codetail.client.mover;
import android.os.Parcel;
import com.squareup.otto.Bus;
import java.util.List;
import io.codetail.Constants;
import io.codetail.client.Page;
import io.codetail.client.State;
import io.codetail.client.models.Video;
import static io.codetail.client.mover.MoverParser.CategoryParser;
import static io.codetail.client.mover.MoverParser.PagesParser;
public abstract class Mover implements Page{
public static class Suggestion extends Mover{
String mId;
List<String> mAvailableQuality;
Suggestion(List<String> qualities, String position){
super(null);
mId = position;
mAvailableQuality = qualities;
}
public String getPosition() {
return mId;
}
public List<String> getAvailableQuality() {
return mAvailableQuality;
}
@Override
public Page from(String source) {
return null;
}
@Override
public void postEvent(Bus bus) {
bus.post(this);
}
}
String mCategory;
protected Mover(String category) {
this.mCategory = category;
}
@Override
public String getCategory() {
return mCategory;
}
/**
* Category paginated result
*/
public static class PaginatedPage extends Mover implements Page.PaginatedPage {
int pageNumber;
int pagesCount;
List<Video> videos;
public PaginatedPage(String category, int pageNumber) {
super(category);
this.pageNumber = pageNumber;
}
public void setPagesCount(int pagesCount) {
this.pagesCount = pagesCount;
}
public int getPageNumber() {
return pageNumber;
}
public void setVideos(List<Video> videos) {
this.videos = videos;
}
public List<Video> getVideos() {
return videos;
}
@Override
public boolean isMainPage() {
return pageNumber == 1;
}
@Override
public int getPagesCount() {
return pagesCount;
}
@Override
public boolean hasPagination() {
return pagesCount > 1;
}
@Override
public int getCurrentPageNumber() {
return pageNumber;
}
@Override @SuppressWarnings("unchecked")
public io.codetail.client.mover.Mover.PaginatedPage from(String source) {
return new PagesParser().parse(this, source);
}
@Override
public void postEvent(Bus bus) {
bus.post(new State.OnPaginatedPageResponseEvent(this));
}
}
public static class SearchPage extends PaginatedPage{
String mQuery;
public boolean hasResult(){
return getVideos() != null && getVideos().size() > 0;
}
public SearchPage(String query, int pageNumber) {
super(null, pageNumber);
mQuery = query;
}
public String getQuery(){
return mQuery;
}
@Override
public String getCategory() {
throw new UnsupportedOperationException("Search doesn't provide category");
}
@Override
public void postEvent(Bus bus) {
bus.post(new State.OnSearchResponseEvent(this));
}
}
/**
* Main page of category
*/
public static class CategoryPage extends Mover {
List<Video> recommends;
List<Video> popular;
List<Video> videos;
int pagesCount;
public CategoryPage(String category) {
super(category);
}
public void setRecommends(List<Video> recommends) {
this.recommends = recommends;
}
public void setPopular(List<Video> popular) {
this.popular = popular;
}
public void setPagesCount(int pagesCount) {
this.pagesCount = pagesCount;
}
public int getPagesCount() {
return pagesCount;
}
public void setVideos(List<Video> videos) {
this.videos = videos;
}
public List<Video> getVideos() {
return videos;
}
public List<Video> getRecommends() {
return recommends;
}
public List<Video> getPopular() {
return popular;
}
@Override
public CategoryPage from(String source) {
return new CategoryParser(mCategory.equals("")).parse(this, source);
}
@Override
public void postEvent(Bus bus) {
bus.post(new State.OnPageResponseEvent(this));
}
}
public static class MoverVideo extends Video{
public MoverVideo() {
super(Constants.MOVER_VIDEO_TYPE);
}
@Override
public String getLinkForShare() {
return makeWatchLink(getId());
}
public MoverVideo(Parcel in, int type) {
super(in, type);
}
@Override
public String getDirectLink(String quality) {
return createVideoLink(getId(), quality);
}
@Override
public String getThumbnail() {
return createImageLink(getId(), "s");
}
/**
* Generates url to movie first frame generated in
* mover.uz system
*
* @param id movie identification
*
* @return generated url to movie frame
*/
private static String makeWatchLink(String id){
return "http://mover.uz/watch/{id}"
.replace("{id}", id);
}
/**
* Generates url to movie first frame generated in
* mover.uz system
*
* @param id movie identification
* @param quality of picture
*
* @return generated url to movie frame
*/
public static String createVideoLink(String id, String quality){
return "http://v.mover.uz/{id}_{qq}.mp4"
.replace("{id}", id)
.replace("{qq}", quality);
}
/**
* Generates url to movie first frame generated in
* mover.uz system
*
* @param id movie identification
* @param quality of picture
*
* @return generated url to movie frame
*/
public static String createImageLink(String id, String quality){
return "http://i.mover.uz/{id}_{qq}1.jpg"
.replace("{id}", id)
.replace("{qq}", quality);
}
}
}