// Path: app/src/main/java/com/tonilopezmr/sample/domain/Subject.java
// public class Subject {
// 
//     private int id;
//     private String name;
// 
//     public Subject(String name) {
//         this.name = name;
//     }
// 
//     public Subject(int id, String name) {
//         this.id = id;
//         this.name = name;
//     }
// 
//     public int getId() {
//         return id;
//     }
// 
//     public void setId(int id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     @Override
//     public String toString() {
//         return "ID: "+this.id+" Subject: "+this.name;
//     }
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/domain/interactor/GetSubjectListUseCase.java
// public interface GetSubjectListUseCase extends Interactor {
// 
//     interface Callback{
//         void onSubjectListLoaded(Collection<Subject> subjects);
//         void onError(SubjectException exception);
//     }
// 
//     public void execute(final Callback callback);
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/domain/interactor/SubjectUseCase.java
// public interface SubjectUseCase extends Interactor {
// 
//     interface Callback {
//         void onMissionAccomplished(Subject subject);
//         void onError(SubjectException ex);
//     }
// 
//     public void execute(Subject subject, final Callback callback);
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/ui/view/SubjectListView.java
// public interface SubjectListView extends ModelListView {
// 
//     public boolean isShowLayoutError();
// 
//     public void hideLayoutError();
// 
//     public void showLayoutError();
// 
//     public void showMessage(String message);
// 
//     public void showSubjects(Collection<SubjectViewModel> subjects);
// 
//     public void showProgress();
// 
//     public void hideProgress();
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/ui/viewmodel/SubjectViewModel.java
// public interface SubjectViewModel {
// 
//     public int getId();
//     public String getName();
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/ui/viewmodel/SubjectViewModelImp.java
// public class SubjectViewModelImp implements SubjectViewModel {
// 
//     private int id;
//     private String name;
// 
//     public SubjectViewModelImp(String name) {
//         this.name = name;
//     }
// 
//     public SubjectViewModelImp(Subject subject) {
//         this.id = subject.getId();
//         this.name = subject.getName();
//     }
// 
//     public int getId(){
//         return this.id;
//     }
// 
//     public String getName(){
//         return this.name;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         boolean result = false;
//         if (o instanceof SubjectViewModel){
//             SubjectViewModel model = (SubjectViewModel)o;
//             if (this.id == model.getId() && this.name.equals(model.getName())){
//                 result = true;
//             }
//         }
//         return result;
//     }
// 
//     @Override
//     public String toString() {
//         return id+" "+name;
//     }
// }


import android.content.Context;
import android.util.Log;
import com.tonilopezmr.sample.di.BasePresenter;
import com.tonilopezmr.sample.domain.Subject;
import com.tonilopezmr.sample.domain.exception.SubjectException;
import com.tonilopezmr.sample.domain.interactor.GetSubjectListUseCase;
import com.tonilopezmr.sample.domain.interactor.SubjectUseCase;
import com.tonilopezmr.sample.ui.view.SubjectListView;
import com.tonilopezmr.sample.ui.viewmodel.SubjectViewModel;
import com.tonilopezmr.sample.ui.viewmodel.SubjectViewModelImp;
import java.util.ArrayList;
import java.util.Collection;
import javax.inject.Named;
    public void onClickItem(SubjectViewModel subjectModel) {
        view.showMessage("the subject: "+subjectModel);
    }

    @Override
    public void onLongItemClick(SubjectViewModel subjectModel) {
        deleteSubjectUseCase.execute(new Subject(subjectModel.getId(), subjectModel.getName()), new SubjectUseCase.Callback() {
            @Override
            public void onMissionAccomplished(Subject subject) {
                view.remove(new SubjectViewModelImp(subject));
                view.showMessage("Mission accomplished, "+subject+", it has been deleted.");
            }

            @Override
            public void onError(SubjectException ex) {
                view.showMessage(ex.getMessage());
            }
        });
    }

    @Override
    public void onRetryButtonClick() {
        view.hideLayoutError();
        onInit();
    }

    @Override
    public void onFloatingButtonClick(final SubjectViewModel subjectModel) {
        createSubjectUseCase.execute(new Subject(subjectModel.getName()), new SubjectUseCase.Callback() {
            @Override
// Path: app/src/main/java/com/tonilopezmr/sample/domain/Subject.java
// public class Subject {
// 
//     private int id;
//     private String name;
// 
//     public Subject(String name) {
//         this.name = name;
//     }
// 
//     public Subject(int id, String name) {
//         this.id = id;
//         this.name = name;
//     }
// 
//     public int getId() {
//         return id;
//     }
// 
//     public void setId(int id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     @Override
//     public String toString() {
//         return "ID: "+this.id+" Subject: "+this.name;
//     }
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/domain/interactor/GetSubjectListUseCase.java
// public interface GetSubjectListUseCase extends Interactor {
// 
//     interface Callback{
//         void onSubjectListLoaded(Collection<Subject> subjects);
//         void onError(SubjectException exception);
//     }
// 
//     public void execute(final Callback callback);
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/domain/interactor/SubjectUseCase.java
// public interface SubjectUseCase extends Interactor {
// 
//     interface Callback {
//         void onMissionAccomplished(Subject subject);
//         void onError(SubjectException ex);
//     }
// 
//     public void execute(Subject subject, final Callback callback);
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/ui/view/SubjectListView.java
// public interface SubjectListView extends ModelListView {
// 
//     public boolean isShowLayoutError();
// 
//     public void hideLayoutError();
// 
//     public void showLayoutError();
// 
//     public void showMessage(String message);
// 
//     public void showSubjects(Collection<SubjectViewModel> subjects);
// 
//     public void showProgress();
// 
//     public void hideProgress();
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/ui/viewmodel/SubjectViewModel.java
// public interface SubjectViewModel {
// 
//     public int getId();
//     public String getName();
// }
// 
// Path: app/src/main/java/com/tonilopezmr/sample/ui/viewmodel/SubjectViewModelImp.java
// public class SubjectViewModelImp implements SubjectViewModel {
// 
//     private int id;
//     private String name;
// 
//     public SubjectViewModelImp(String name) {
//         this.name = name;
//     }
// 
//     public SubjectViewModelImp(Subject subject) {
//         this.id = subject.getId();
//         this.name = subject.getName();
//     }
// 
//     public int getId(){
//         return this.id;
//     }
// 
//     public String getName(){
//         return this.name;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         boolean result = false;
//         if (o instanceof SubjectViewModel){
//             SubjectViewModel model = (SubjectViewModel)o;
//             if (this.id == model.getId() && this.name.equals(model.getName())){
//                 result = true;
//             }
//         }
//         return result;
//     }
// 
//     @Override
//     public String toString() {
//         return id+" "+name;
//     }
// }


// Path: app/src/main/java/com/tonilopezmr/sample/ui/presenter/SubjectListPresenterImp.java
import android.content.Context;
import android.util.Log;
import com.tonilopezmr.sample.di.BasePresenter;
import com.tonilopezmr.sample.domain.Subject;
import com.tonilopezmr.sample.domain.exception.SubjectException;
import com.tonilopezmr.sample.domain.interactor.GetSubjectListUseCase;
import com.tonilopezmr.sample.domain.interactor.SubjectUseCase;
import com.tonilopezmr.sample.ui.view.SubjectListView;
import com.tonilopezmr.sample.ui.viewmodel.SubjectViewModel;
import com.tonilopezmr.sample.ui.viewmodel.SubjectViewModelImp;
import java.util.ArrayList;
import java.util.Collection;
import javax.inject.Named;

    public void onClickItem(SubjectViewModel subjectModel) {
        view.showMessage("the subject: "+subjectModel);
    }

    @Override
    public void onLongItemClick(SubjectViewModel subjectModel) {
        deleteSubjectUseCase.execute(new Subject(subjectModel.getId(), subjectModel.getName()), new SubjectUseCase.Callback() {
            @Override
            public void onMissionAccomplished(Subject subject) {
                view.remove(new SubjectViewModelImp(subject));
                view.showMessage("Mission accomplished, "+subject+", it has been deleted.");
            }

            @Override
            public void onError(SubjectException ex) {
                view.showMessage(ex.getMessage());
            }
        });
    }

    @Override
    public void onRetryButtonClick() {
        view.hideLayoutError();
        onInit();
    }

    @Override
    public void onFloatingButtonClick(final SubjectViewModel subjectModel) {
        createSubjectUseCase.execute(new Subject(subjectModel.getName()), new SubjectUseCase.Callback() {
            @Override
            public void onMissionAccomplished(Subject subject) {