package com.florianmski.tracktoid.ui.fragments.traktitems;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import com.florianmski.tracktoid.TraktoidConstants;
import com.florianmski.tracktoid.TraktoidTheme;
import com.florianmski.tracktoid.data.WEpisode;
import com.florianmski.tracktoid.data.WShow;
import com.florianmski.tracktoid.data.database.ProviderSchematic;
import com.florianmski.tracktoid.rx.observables.CursorObservable;
import com.florianmski.tracktoid.rx.observables.TraktObservable;
import com.florianmski.tracktoid.trakt.CheckinManager;
import com.florianmski.tracktoid.trakt.TraktManager;
import com.florianmski.tracktoid.trakt.TraktSender;
import com.florianmski.tracktoid.ui.activities.CommentsActivity;
import com.florianmski.tracktoid.utils.DateHelper;
import com.florianmski.tracktoid.utils.DbHelper;
import com.florianmski.tracktoid.utils.Utils;
import com.uwetrottmann.trakt.v2.entities.Episode;
import com.uwetrottmann.trakt.v2.entities.EpisodeCheckinResponse;
import com.uwetrottmann.trakt.v2.entities.Show;
import com.uwetrottmann.trakt.v2.enums.Extended;
import com.uwetrottmann.trakt.v2.exceptions.OAuthUnauthorizedException;
import rx.Observable;
import rx.functions.Func1;
public class EpisodeFragment extends TraktItemFragment<WEpisode, EpisodeCheckinResponse>
{
private String showId;
private int season;
private int episode;
public EpisodeFragment() {}
public static EpisodeFragment newInstance(String showId, int season, String id, int episode)
{
EpisodeFragment f = new EpisodeFragment();
Bundle args = getBundle(id);
args.putString(TraktoidConstants.BUNDLE_SHOW_ID, showId);
args.putInt(TraktoidConstants.BUNDLE_SEASON, season);
args.putInt(TraktoidConstants.BUNDLE_EPISODE, episode);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
showId = getArguments().getString(TraktoidConstants.BUNDLE_SHOW_ID);
season = getArguments().getInt(TraktoidConstants.BUNDLE_SEASON);
episode = getArguments().getInt(TraktoidConstants.BUNDLE_EPISODE);
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
}
@Override
public TraktSender.Builder addItemToBuilder(TraktSender.Builder builder)
{
return builder.episode(item.getTraktItem());
}
@Override
public Observable<WEpisode> getDownloadAndInsertItemObservable()
{
return Observable.create(new TraktObservable<WEpisode>()
{
@Override
public WEpisode fire() throws OAuthUnauthorizedException
{
if(!DbHelper.isShowInDb(getActivity(), showId))
DbHelper.downloadAndInsertShow(getActivity(), showId);
else
{
// TODO this should not arrive
// if it does arrive, we can't insert the episode because we don't have the season
throw new IllegalArgumentException();
}
return item;
}
});
}
@Override
public Observable<EpisodeCheckinResponse> getCheckinObservable()
{
final Episode episode = item.getTraktItem();
return Observable.create(new CursorObservable<WShow>(
getActivity(),
ProviderSchematic.Shows.withId(item.showId),
ProviderSchematic.Shows.PROJECTION,
null, null, null, false)
{
@Override
protected WShow toObject(Cursor cursor)
{
return WShow.unpack(cursor);
}
}).flatMap(new Func1<WShow, Observable<EpisodeCheckinResponse>>()
{
@Override
public Observable<EpisodeCheckinResponse> call(WShow wShow)
{
Show show = wShow.getTraktItem();
String title = String.format("%s %s", show.title, Utils.getSeasonEpisodeString(episode.season, episode.number));
return CheckinManager.getInstance().checkinEpisode(getActivity(), episode.ids.trakt, title, show.runtime);
}
});
}
@Override
public void refreshView(WEpisode item)
{
this.item = item;
tlInfos.removeAllViews();
addInfo("Aired", DateHelper.getDate(getActivity(), item.getTraktItem().first_aired));
Double rating = item.getTraktItem().rating;
if(rating != null && item.getTraktItem().votes > 0)
addInfo("Ratings", String.format("%.01f/10", rating));
refreshGeneralView(item.getTraktBase());
if(!CheckinManager.getInstance().checkinInProgress())
{
fab.setVisibility(View.VISIBLE);
fab.show(true);
}
}
@Override
public String getDateText(boolean invalidTime)
{
if(invalidTime)
return "Unknown air date";
else
{
WEpisode episode = item;
return DateHelper.getDate(getActivity(), episode.getTraktItem().first_aired);
}
}
@Override
public WEpisode getTraktObject()
{
Episode e = TraktManager.getInstance()
.episodes()
.summary(showId, season, episode, Extended.FULLIMAGES);
return new WEpisode(e, showId);
}
@Override
public CursorObservable<WEpisode> getCursorObservable()
{
return new CursorObservable<WEpisode>(
getActivity(),
ProviderSchematic.Episodes.withId(id),
ProviderSchematic.Episodes.PROJECTION,
null, null, null)
{
@Override
protected WEpisode toObject(Cursor cursor)
{
return WEpisode.unpack(cursor);
}
};
}
@Override
public void launchCommentActivity()
{
CommentsActivity.launchEpisode(getActivity(), showId, season, episode);
}
@Override
public TraktoidTheme getTheme()
{
return TraktoidTheme.SHOW;
}
}