package adapters.versions;
import android.content.Context;
import android.util.Log;
import org.unfoldingword.mobile.R;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import eventbusmodels.DownloadingVersionsEvent;
import model.DaoDBHelper;
import model.DataFileManager;
import model.DownloadState;
import model.daoModels.Language;
import model.daoModels.LanguageLocale;
import model.daoModels.Project;
import model.daoModels.Version;
import model.parsers.MediaType;
import signing.Status;
import view.ViewContentHelper;
/**
* Created by Fechner on 12/1/15.
*/
public class VersionViewModel implements Comparable<VersionViewModel>{
private Context context;
private VersionViewModelListener listener;
private Version version;
private List<ResourceViewModel> resources = new ArrayList<>();
public static List<VersionViewModel> createModels(Context context, Project project, VersionViewModelListener listener){
List<VersionViewModel> models = new ArrayList<>();
for(Language language : project.getLanguages()){
for(Version version : language.getVersions()){
models.add(new VersionViewModel(context, version, listener));
}
}
Collections.sort(models);
return models;
}
public VersionViewModel(Context context, Version version, VersionViewModelListener listener) {
this.listener = listener;
this.context = context;
this.version = version;
setupResources();
}
public void updateContent(){
version = Version.getVersionForId(version.getId(), DaoDBHelper.getDaoSession(context));
// for(ResourceViewModel model : resources){
// model.setState(DownloadState.DOWNLOAD_STATE_DOWNLOADING);
// }
}
private void setupResources(){
int numAdded = 0;
resources.add(numAdded, new ResourceViewModel(MediaType.MEDIA_TYPE_TEXT));
numAdded++;
if(version.hasAudio()){
resources.add(numAdded, new ResourceViewModel(MediaType.MEDIA_TYPE_AUDIO));
numAdded++;
}
if(version.hasVideo()){
resources.add(numAdded, new ResourceViewModel(MediaType.MEDIA_TYPE_VIDEO));
}
}
public Version getVersion() {
return version;
}
public List<ResourceViewModel> getResources() {
return resources;
}
public String getTitle(){
return getLanguageName(context) + " (" + version.getLanguage().getLanguageAbbreviation() + ") - " + version.getName();
}
private String getLanguageName(Context context){
LanguageLocale languageLocale = LanguageLocale.getLocalForKey(version.getLanguage().getLanguageAbbreviation(), DaoDBHelper.getDaoSession(context));
return (languageLocale != null)? languageLocale.getLanguageName() : "";
}
private void doAction(MediaType type, VersionViewHolder viewHolder, DownloadState state){
this.listener.doAction(this, viewHolder, state, type);
}
private void itemChosen(ResourceViewModel viewModel){
this.listener.resourceChosen(viewModel, version);
}
private void showCheckingLevel(MediaType type){
this.listener.showCheckingLevel(version, type);
}
@Override
public int compareTo(VersionViewModel another) {
return version.getLanguage().getLanguageAbbreviation().compareTo(another.version.getLanguage().getLanguageAbbreviation());
}
public class ResourceViewModel{
private static final String TAG = "ResourceViewModel";
private DownloadState state = DownloadState.DOWNLOAD_STATE_DOWNLOADING;
private MediaType type;
public ResourceViewModel(MediaType type) {
this.type = type;
}
public MediaType getType() {
return type;
}
public int getImageResource(){
switch (type){
case MEDIA_TYPE_TEXT: return R.drawable.reading_icon;
case MEDIA_TYPE_AUDIO: return R.drawable.audio_icon;
case MEDIA_TYPE_VIDEO: return R.drawable.video_icon;
default: return -1;
}
}
public void setState(DownloadState state) {
this.state = state;
}
public void getDownloadState(final DataFileManager.GetDownloadStateResponse response){
if(isInLoadingEvent()){
state = DownloadState.DOWNLOAD_STATE_DOWNLOADING;
response.foundDownloadState(state);
return;
}
DataFileManager.getStateOfContent(context, version, type, new DataFileManager.GetDownloadStateResponse() {
@Override
public void foundDownloadState(DownloadState newState) {
state = newState;
if(response != null) {
response.foundDownloadState(newState);
}
}
});
}
public void getDownloadStateAsync(final DataFileManager.GetDownloadStateResponse response){
if(isInLoadingEvent()){
Log.d(TAG, "is in loading event");
state = DownloadState.DOWNLOAD_STATE_DOWNLOADING;
response.foundDownloadState(state);
}
else {
Log.d(TAG, "isn't loading event");
response.foundDownloadState(state);
DataFileManager.getStateOfContent(context, version, type, new DataFileManager.GetDownloadStateResponse() {
@Override
public void foundDownloadState(DownloadState newState) {
state = newState;
if (response != null) {
response.foundDownloadState(newState);
}
}
});
}
}
private boolean isInLoadingEvent(){
return DownloadingVersionsEvent.containsModel(version, type);
}
public String getTitle(){
switch (type){
case MEDIA_TYPE_TEXT: return "Text";
case MEDIA_TYPE_AUDIO: return "Audio";
case MEDIA_TYPE_VIDEO: return "Video";
default: return "";
}
}
public int getVerifiedCheckingLevelImage(){
if((type == MediaType.MEDIA_TYPE_TEXT && version.getVerificationStatus() != Status.VERIFIED.ordinal())){
return R.drawable.verify_fail;
}
return ViewContentHelper.getDarkCheckingLevelImageResource(Integer.parseInt(version.getStatusCheckingLevel()));
}
public int getCheckingLevelImage(){
return ViewContentHelper.getDarkCheckingLevelImageResource(Integer.parseInt(version.getStatusCheckingLevel()));
}
public void doActionOnModel(final VersionViewHolder viewHolder){
getDownloadState(new DataFileManager.GetDownloadStateResponse() {
@Override
public void foundDownloadState(DownloadState state) {
doAction(type, viewHolder, state);
}
});
}
public void itemClicked(final VersionViewHolder viewHolder){
final ResourceViewModel viewModel = this;
getDownloadStateAsync(new DataFileManager.GetDownloadStateResponse() {
@Override
public void foundDownloadState(DownloadState state) {
if (state == DownloadState.DOWNLOAD_STATE_DOWNLOADED) {
itemChosen(viewModel);
} else {
doAction(type, viewHolder, state);
}
}
});
}
public void checkingLevelClicked(){
showCheckingLevel(type);
}
@Override
public String toString() {
return "ResourceViewModel{" +
"state=" + state.toString() +
", type=" + type.toString() +
'}';
}
}
public interface VersionViewModelListener{
void doAction(VersionViewModel viewModel, VersionViewHolder viewHolder, DownloadState state, MediaType type);
void resourceChosen(ResourceViewModel viewModel, Version version);
void showCheckingLevel(Version version, MediaType type);
}
}