package modules;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Scanner;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import bot.Message;

public class Quotes implements bot.Module{
	private File jsonfile;
	private JsonObject quotes;
	private JsonObject json;
	private Gson gson;
	public Quotes() {
		try{
			jsonfile = new File(this.getClass().getResource("json/quotes.json").toURI());
			Scanner scan;
			scan = new Scanner(new FileInputStream(jsonfile));
			String jsonstring = "";
			while(scan.hasNext()){
				jsonstring += scan.next() + " ";
			}
			scan.close();
			gson = new GsonBuilder().setPrettyPrinting().create();
			json = gson.fromJson(jsonstring, JsonElement.class).getAsJsonObject();
			quotes = json.get("quotes").getAsJsonObject();
		}
		catch(IOException e){
			e.printStackTrace();
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void parse(Message m) {
		String target = m.param();
		if(!m.param().startsWith("#")) target = m.sender();
		if(m.command().equals("PRIVMSG") && m.botCommand().equals("")){
			if(m.sender().equals("py-ctcp"))return;
			if(quotes.has(m.sender())){
				String quote = makeJsonString(m.trailing());
				JsonArray quotearray = quotes.get(m.sender()).getAsJsonArray();
				JsonObject quotejson = new JsonObject();
				quotejson.add("quote", gson.fromJson("\"" + quote + "\"", JsonElement.class));
				quotejson.add("time", gson.fromJson("\"" + LocalDateTime.now(ZoneId.of("GMT")).toString() + "\"", JsonElement.class));
				quotejson.add("room", gson.fromJson("\"" + m.param() + "\"", JsonElement.class));
				quotearray.add(quotejson);
				quotes.add(m.sender(), quotearray);
				save();
			}
			else{
				String quote = makeJsonString(m.trailing());
				JsonArray quotearray = new JsonArray();
				JsonObject quotejson = new JsonObject();
				quotejson.add("quote", gson.fromJson("\"" + quote + "\"", JsonElement.class));
				quotejson.add("time", gson.fromJson("\"" + LocalDateTime.now(ZoneId.of("GMT")).toString() + "\"", JsonElement.class));
				quotejson.add("room", gson.fromJson("\"" + m.param() + "\"", JsonElement.class));
				quotearray.add(quotejson);
				quotes.add(m.sender(), quotearray);
				save();
			}
		}
		if(m.botCommand().equals("quote")){
			if(m.hasBotParams()){
				if(quotes.has(m.botParamsArray()[0])){
					String user = m.botParamsArray()[0];
					int random = (int)Math.floor(Math.random()*quotes.get(m.botParamsArray()[0]).getAsJsonArray().size());
					JsonObject quotejson = quotes.get(user).getAsJsonArray().get(random).getAsJsonObject();
					String quote = quotejson.get("quote").getAsString();
					String room = quotejson.get("room").getAsString();
					LocalDateTime ldt = LocalDateTime.parse(quotejson.get("time").getAsString());
					String time = String.format("%d, %s %s %s, %02d:%02d:%02d", 
							ldt.getYear(), 
							ldt.getDayOfWeek().toString().substring(0, 3).toLowerCase().replaceFirst(".", String.valueOf(ldt.getDayOfWeek().toString().charAt(0))),
							ldt.getDayOfMonth(), ldt.getMonth().toString().toLowerCase().replaceFirst(".", String.valueOf(ldt.getMonth().toString().charAt(0))),
							ldt.getHour(), ldt.getMinute(), ldt.getSecond());
					m.say(target,String.format("4​%s at 2​%s to 2%s> %s", user, time, room, quote));
				}
				else{
					m.say(target, "I don't know who that person is");
				}
			}
		}
	}

	private void save(){
		Gson gson = new GsonBuilder().create();
		try {
			PrintWriter writer = new PrintWriter(jsonfile);
			writer.println(gson.toJson(json));
			writer.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
	}
	
	private String makeJsonString(String s){
		s = s.replace("\"", "\\\"");
		
		return s;
	}
}

@@ -3563,16 +3563,20 @@
 at %032%E2%80%8B%25s
+ GMT
 %03 to %032%25
@@ -3577,16 +3577,17 @@
 to %032%25s%03
+ 
 %3E %25s%22, u

change quote formatting