/*
* Copyright 2015 - 2016 Hauke Oldsen
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.gebatzens.sia.data;
import android.content.Context;
import android.util.JsonReader;
import android.util.JsonWriter;
import android.util.Log;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import de.gebatzens.sia.SIAApp;
import de.gebatzens.sia.fragment.RemoteDataFragment;
public class Exams extends ArrayList<Exams.ExamItem> implements RemoteDataFragment.RemoteData {
public Throwable throwable;
@Override
public Throwable getThrowable() {
return throwable;
}
public void save() {
Log.d("ggvp", "Saving exams");
try {
OutputStream out = SIAApp.SIA_APP.openFileOutput("exams", Context.MODE_PRIVATE);
JsonWriter writer = new JsonWriter(new OutputStreamWriter(out));
writer.setIndent(" ");
writer.beginArray();
for(ExamItem s : this) {
writer.beginObject();
writer.name("date").value(s.date.getTime());
writer.name("clazz").value(s.clazz);
writer.name("lesson").value(s.lesson);
writer.name("length").value(s.length);
writer.name("subject").value(s.subject);
writer.name("teacher").value(s.teacher);
writer.name("selected").value(s.selected);
writer.endObject();
}
writer.endArray();
writer.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public void sort() {
Collections.sort(this, new Comparator<ExamItem>() {
@Override
public int compare(ExamItem lhs, ExamItem rhs) {
return lhs.date.compareTo(rhs.date);
}
});
}
public Exams filter(Filter.FilterList filters, boolean past) {
Exams e = new Exams();
for(ExamItem item : this) {
if(filters.matches(item) && (past || item.date.after(new Date(System.currentTimeMillis() - 86400000L)))) {
e.add(item);
}
}
return e;
}
public List<String> getAllClasses() {
ArrayList<String> list = new ArrayList<>();
for(ExamItem e : this) {
if(!list.contains(e.clazz)) {
list.add(e.clazz);
}
}
//TODO
Collections.sort(list);
return list;
}
public List<ExamItem> getSelectedItems(boolean past) {
ArrayList<ExamItem> list = new ArrayList<>();
for(ExamItem e : this) {
if (e.selected && (past || e.date.after(new Date(System.currentTimeMillis() - 86400000L))))
list.add(e);
}
return list;
}
public void reuseSelected(Exams exams) {
for(ExamItem e : exams) {
int index = indexOf(e);
if(index != -1) {
e.selected = get(index).selected;
}
}
}
public boolean load() {
clear();
try {
InputStream in = SIAApp.SIA_APP.openFileInput("exams");
JsonReader reader = new JsonReader(new InputStreamReader(in));
reader.beginArray();
while(reader.hasNext()) {
reader.beginObject();
ExamItem s = new ExamItem();
while(reader.hasNext()) {
String name = reader.nextName();
switch (name) {
case "date":
s.date = new Date(reader.nextLong());
break;
case "clazz":
s.clazz = reader.nextString();
break;
case "lesson":
s.lesson = reader.nextString();
break;
case "length":
s.length = reader.nextString();
break;
case "subject":
s.subject = reader.nextString();
break;
case "teacher":
s.teacher = reader.nextString();
break;
case "selected":
s.selected = reader.nextBoolean();
break;
default:
reader.skipValue();
break;
}
}
reader.endObject();
add(s);
}
reader.endArray();
reader.close();
} catch(Exception e) {
Log.w("ggvp", "Exams file does not exist");
return false;
}
return true;
}
public static class ExamItem implements Filter.Filterable {
public Date date;
public String clazz;
public String lesson;
public String length;
public String subject;
public String teacher;
public boolean selected;
@Override
public boolean equals(Object o) {
if(!(o instanceof ExamItem))
return false;
ExamItem e = (ExamItem) o;
return e.date.equals(date) && e.clazz.equals(clazz) && e.lesson.equals(lesson) &&
e.length.equals(length) && e.subject.equals(subject) && e.teacher.equals(teacher);
}
}
}