package ch.tkuhn.memetools;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;

public class ApsMetadataEntry {

	private String id;
	private String date;
	private Map<String,String> title;
	private List<Map<String,String>> authors;
	@SerializedName("abstract")
	private Map<String,String> abstractText;

	public static ApsMetadataEntry load(File file) throws FileNotFoundException {
		BufferedReader br = new BufferedReader(new FileReader(file));
		return new Gson().fromJson(br, ApsMetadataEntry.class);
	}

	public String getId() {
		return id;
	}

	public String getDate() {
		return date;
	}

	public List<String> getNormalizedAuthors() {
		List<String> nAuthors = new ArrayList<String>();
		for (Map<String,String> m : authors) {
			if (!m.containsKey("type") || !"Person".equals(m.get("type")) || !m.containsKey("firstname") ||
					!m.containsKey("surname") || m.get("firstname").isEmpty() || m.get("surname").isEmpty()) {
				nAuthors.add(null);
				continue;
			}
			String f = m.get("firstname").toLowerCase();
			String s = m.get("surname").toLowerCase();
			nAuthors.add(f.substring(0, 1) + "." + s);
		}
		return nAuthors;
	}

	public String getNormalizedTitle() {
		if (title == null || !title.containsKey("value")) return null;
		String n = title.get("value");
		if (n == null) return null;
		if (title.containsKey("format") && title.get("format").startsWith("html")) {
			n = preprocessHtml(n);
		}
		return MemeUtils.normalize(n);
	}

	public String getNormalizedAbstract() {
		if (abstractText == null || !abstractText.containsKey("value")) return null;
		String n = abstractText.get("value");
		if (n == null) return null;
		if (abstractText.containsKey("format") && abstractText.get("format").startsWith("html")) {
			n = preprocessHtml(n);
		}
		return MemeUtils.normalize(n);
	}

	public String preprocessHtml(String htmlText) {
		htmlText = htmlText.replaceAll("</?[a-z]+ ?.*?/?>", "");
		return htmlText;
	}

}

@@ -909,16 +909,42 @@
 ing%3E();%0A
+%09%09if (authors != null) %7B%0A%09
 %09%09for (M
@@ -976,16 +976,17 @@
 hors) %7B%0A
+%09
 %09%09%09if (!
@@ -1076,16 +1076,17 @@
 me%22) %7C%7C%0A
+%09
 %09%09%09%09%09!m.
@@ -1177,16 +1177,17 @@
 ) %7B%0A%09%09%09%09
+%09
 nAuthors
@@ -1198,16 +1198,17 @@
 (null);%0A
+%09
 %09%09%09%09cont
@@ -1216,18 +1216,20 @@
 nue;%0A%09%09%09
+%09
 %7D%0A
+%09
 %09%09%09Strin
@@ -1268,16 +1268,17 @@
 Case();%0A
+%09
 %09%09%09Strin
@@ -1318,16 +1318,17 @@
 e();%0A%09%09%09
+%09
 nAuthors
@@ -1362,16 +1362,21 @@
 %22 + s);%0A
+%09%09%09%7D%0A
 %09%09%7D%0A%09%09re

Fix null pointer problem