package de.fau.cs.mad.fablab.android.model;
import com.j256.ormlite.dao.RuntimeExceptionDao;
import com.j256.ormlite.stmt.QueryBuilder;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import de.fau.cs.mad.fablab.android.model.events.ProjectDeletedEvent;
import de.fau.cs.mad.fablab.android.model.events.ProjectImageUploadedEvent;
import de.fau.cs.mad.fablab.android.model.events.ProjectSavedEvent;
import de.fau.cs.mad.fablab.android.viewmodel.common.Project;
import de.fau.cs.mad.fablab.rest.core.ProjectFile;
import de.fau.cs.mad.fablab.rest.core.ProjectImageUpload;
import de.fau.cs.mad.fablab.rest.myapi.ProjectsApi;
import de.greenrobot.event.EventBus;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class ProjectModel {
private ProjectsApi mProjectsApi;
private RuntimeExceptionDao<Project, Long> mProjectDao;
private EventBus mEventBus = EventBus.getDefault();
private Callback<String> mSaveProjectCallback = new Callback<String>() {
@Override
public void success(String id, Response response) {
mEventBus.post(new ProjectSavedEvent(id, true));
}
@Override
public void failure(RetrofitError error) {
mEventBus.post(new ProjectSavedEvent(null, false));
}
};
private Callback<Response> mDeleteProjectCallback = new Callback<Response>() {
@Override
public void success(Response id, Response response) {
mEventBus.post(new ProjectDeletedEvent(true));
}
@Override
public void failure(RetrofitError error) {
mEventBus.post(new ProjectDeletedEvent(false));
}
};
private Callback<String> mUpdateProjectCallback = new Callback<String>() {
@Override
public void success(String id, Response response) {
mEventBus.post(new ProjectSavedEvent(id, true));
}
@Override
public void failure(RetrofitError error) {
mEventBus.post(new ProjectSavedEvent(null, false));
}
};
private Callback<String> mUploadImageCallback = new Callback<String>() {
@Override
public void success(String filePath, Response response) {
mEventBus.post(new ProjectImageUploadedEvent(filePath, true));
}
@Override
public void failure(RetrofitError error) {
mEventBus.post(new ProjectImageUploadedEvent(null, false));
}
};
public ProjectModel(ProjectsApi projectsApi, RuntimeExceptionDao<Project, Long> projectDao) {
mProjectsApi = projectsApi;
mProjectDao = projectDao;
}
public void saveProject(Project project)
{
mProjectDao.createOrUpdate(project);
mEventBus.post(new ProjectSavedEvent(null, true));
}
public void uploadProjectGithub(Project project)
{
ProjectFile projectFile = project.getProjectFile();
if(!projectFile.getFilename().contains(".md")) {
projectFile.setFilename(projectFile.getFilename() + ".md");
}
if(project.getGistID() == null)
{
mProjectsApi.createProject(projectFile, mSaveProjectCallback);
}
else
{
mProjectsApi.updateProject(project.getGistID(), projectFile, mUpdateProjectCallback);
}
}
public void uploadImage(ProjectImageUpload imageUpload)
{
mProjectsApi.uploadImage(imageUpload, mUploadImageCallback);
}
public List<Project> getAllProjects()
{
List<Project> fetchedProjects = new ArrayList<>();
//get next Element_count elements from database
QueryBuilder<Project, Long> queryBuilder = mProjectDao.queryBuilder();
//sort elements in descending order according to last_updated
queryBuilder.orderBy("last_updated", false);
try {
fetchedProjects = mProjectDao.query(queryBuilder.prepare());
} catch (SQLException e) {
e.printStackTrace();
}
return fetchedProjects;
}
public void deleteProject(Project project)
{
if(project.getGistID() != null)
{
mProjectDao.delete(project);
mProjectsApi.deleteProject(project.getGistID(), mDeleteProjectCallback);
}
else
{
mProjectDao.delete(project);
mEventBus.post(new ProjectDeletedEvent(true));
}
}
}