package de.fau.cs.mad.fablab.android.model;
import android.widget.Toast;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import de.fau.cs.mad.fablab.android.model.events.NotificationEvent;
import de.fau.cs.mad.fablab.android.model.events.ReservationChangedEvent;
import de.fau.cs.mad.fablab.android.model.events.ShowToastEvent;
import de.fau.cs.mad.fablab.android.util.Formatter;
import de.fau.cs.mad.fablab.android.viewmodel.common.ObservableArrayList;
import de.fau.cs.mad.fablab.rest.core.FabTool;
import de.fau.cs.mad.fablab.rest.core.ToolUsage;
import de.fau.cs.mad.fablab.rest.core.User;
import de.fau.cs.mad.fablab.rest.myapi.ToolUsageApi;
import de.greenrobot.event.EventBus;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class ToolUsageModel {
private ObservableArrayList<ToolUsage> mUsages;
private List<ToolUsage> mOwnToolUsages;
private List<FabTool> mTools;
private ToolUsageApi mToolUsageApi;
private long mToolId;
private String mUuidRandom;
private String mCurrentTool;
private String mCurrentProject;
EventBus mEventBus = EventBus.getDefault();
private Callback<List<FabTool>> mFabToolsCallback = new Callback<List<FabTool>>() {
@Override
public void success(List<FabTool> tools, Response response) {
mTools.clear();
mTools.addAll(tools);
Collections.sort(mTools, new Comparator<FabTool>() {
@Override
public int compare(FabTool lhs, FabTool rhs) {
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.SECONDARY);
return collator.compare(lhs.getTitle(), rhs.getTitle());
}
});
}
@Override
public void failure(RetrofitError error) {
}
};
private Callback<List<ToolUsage>> mToolUsagesCallback = new Callback<List<ToolUsage>>() {
@Override
public void success(List<ToolUsage> usages, Response response) {
mUsages.clear();
mUsages.addAll(usages);
}
@Override
public void failure(RetrofitError error) {
mEventBus.post(new ShowToastEvent("Leider ist beim Abfragen der Liste ein Fehler aufgetreten.", Toast.LENGTH_SHORT));
}
};
private Callback<ToolUsage> mAddToolUsageCallback = new Callback<ToolUsage>() {
@Override
public void success(ToolUsage usage, Response response) {
if(usage != null) {
mOwnToolUsages.add(usage);
mEventBus.post(new ReservationChangedEvent());
Date dateNow = new Date();
Date date = new Date(usage.getStartTime());
/* more than 2 minutes in the future */
if ((date.getTime() - dateNow.getTime()) > 1000 * 60 * 2) {
mEventBus.post(new NotificationEvent(Formatter.formatNotificationToolUsage(mCurrentTool, mCurrentProject), "Du bist in ca. einer Minute an der Reihe!", new Date(usage.getStartTime() - 1000 * 60 * 1), (int) usage.getId()));
/* more than 12 minutes in the future */
if((date.getTime() - dateNow.getTime()) > 1000 * 60 * 12) {
mEventBus.post(new NotificationEvent(Formatter.formatNotificationToolUsage(mCurrentTool, mCurrentProject), "Noch ca. 10 Minuten", new Date(usage.getStartTime() - 1000 * 60 * 10), (int) usage.getId()));
}
}
mEventBus.post(new NotificationEvent(Formatter.formatNotificationToolUsage(mCurrentTool, mCurrentProject), "Los geht's! Du bist an der Reihe.", new Date(usage.getStartTime()), (int) usage.getId()));
NotificationEvent removeEvent = new NotificationEvent("", "", new Date(usage.getStartTime() + usage.getDuration() * 60 * 1000), (int) usage.getId());
removeEvent.setRemove();
mEventBus.post(removeEvent);
mEventBus.post(new ShowToastEvent(Formatter.formatToastToolUsageOffset((int) (new Date(date.getTime() - dateNow.getTime()).getTime() / 1000 / 60)), Toast.LENGTH_SHORT));
}
}
@Override
public void failure(RetrofitError error) {
mEventBus.post(new ShowToastEvent("Leider ist beim Hinzuf\u00FCgen ein Fehler aufgetreten.", Toast.LENGTH_SHORT));
}
};
private Callback<Response> mRemoveToolUsageCallback = new Callback<Response>() {
@Override
public void success(Response usage, Response response) {
if(usage != null) {
mEventBus.post(new ReservationChangedEvent());
}
}
@Override
public void failure(RetrofitError error) {
mEventBus.post(new ShowToastEvent("Leider ist beim L\u00F6schen ein Fehler aufgetreten. Es ist nur m\u00F6glich, eigene Reservierungen zu l\u00F6schen.", Toast.LENGTH_SHORT));
}
};
public ToolUsageModel(ToolUsageApi toolUsageApi)
{
mUsages = new ObservableArrayList<>();
mTools = new ArrayList<>();
mOwnToolUsages = new ArrayList<>();
mToolUsageApi = toolUsageApi;
mUuidRandom = UUID.randomUUID().toString();
mToolUsageApi.getEnabledTools(mFabToolsCallback);
}
public void setObservableArrayListListener(ObservableArrayList.Listener<ToolUsage> listener) {
mUsages.setListener(listener);
}
public String getUuidRandom() {
return mUuidRandom;
}
public List<FabTool> getEnabledFabTools()
{
mToolUsageApi.getEnabledTools(mFabToolsCallback);
return mTools;
}
public ObservableArrayList<ToolUsage> getToolUsages(long toolId)
{
mToolId = toolId;
mUsages.clear();
mToolUsageApi.getUsageForTool(mToolId, mToolUsagesCallback);
return mUsages;
}
public void addToolUsage(User user, FabTool tool, String project, long duration) {
ToolUsage t = new ToolUsage();
t.setTool(tool);
if(user != null) {
t.setUser(user.getUsername());
}
t.setProject(project);
t.setDuration(duration);
t.setToken(getUuidRandom());
mCurrentTool = tool.getTitle();
mCurrentProject = project;
mToolUsageApi.addUsage(getUuidRandom(), tool.getId(), t, mAddToolUsageCallback);
}
public boolean isOwnUsage(ToolUsage usage) {
for(ToolUsage t : mOwnToolUsages) {
if(t.getId() == usage.getId() && t.toString().equals(usage.toString()))
return true;
}
return false;
}
public void removeEntry(ToolUsage entry) {
mToolUsageApi.removeUsage(getUuidRandom(), entry.getToolId(), entry.getId(), mRemoveToolUsageCallback);
mUsages.remove(entry);
}
}