package be.jeffcheasey88.peeratcode.routes;

import java.time.LocalDateTime;
import java.util.regex.Matcher;

import org.json.simple.JSONObject;

import be.jeffcheasey88.peeratcode.bonus.extract.RouteDoc;
import be.jeffcheasey88.peeratcode.framework.HttpReader;
import be.jeffcheasey88.peeratcode.framework.HttpWriter;
import be.jeffcheasey88.peeratcode.framework.Response;
import be.jeffcheasey88.peeratcode.framework.Route;
import be.jeffcheasey88.peeratcode.framework.User;
import be.jeffcheasey88.peeratcode.model.Chapter;
import be.jeffcheasey88.peeratcode.model.Completion;
import be.jeffcheasey88.peeratcode.model.Puzzle;
import be.jeffcheasey88.peeratcode.repository.DatabaseRepository;

public class PuzzleElement implements Response {

	private final DatabaseRepository databaseRepo;

	public PuzzleElement(DatabaseRepository databaseRepo) {
		this.databaseRepo = databaseRepo;
	}
	
	@RouteDoc(path = "/puzzle/<id>", responseCode = 200, responseDescription = "JSON contenant les informations du puzzle")
	@RouteDoc(responseCode = 400, responseDescription = "puzzle introuvable dans la base de donnée")
	@RouteDoc(responseCode = 423, responseDescription = "L'utilisateur essaye de voir le puzzle en dehors de l'event")

	@Route(path = "^\\/puzzle\\/([0-9]+)$", needLogin = true)
	public void exec(Matcher matcher, User user, HttpReader reader, HttpWriter writer) throws Exception {
		Puzzle puzzle = databaseRepo.getPuzzle(extractId(matcher));
		if (puzzle != null){
			Chapter chapter = this.databaseRepo.getChapter(puzzle);
			if(chapter.getStartDate() != null){
				if(LocalDateTime.now().isBefore(chapter.getStartDate().toLocalDateTime())){
					writer.response(423, "Access-Control-Allow-Origin: *");
					return;
				}
			}
//			if(chapter.getEndDate() != null){
//				if(LocalDateTime.now().isAfter(chapter.getEndDate().toLocalDateTime())){
//					writer.response(423, "Access-Control-Allow-Origin: *");
//					return;
//				}
//			}
			
			JSONObject puzzleJSON = new JSONObject();
			puzzleJSON.put("id", puzzle.getId());
			puzzleJSON.put("name", puzzle.getName());
			puzzleJSON.put("content", puzzle.getContent());
			puzzleJSON.put("scoreMax", puzzle.getScoreMax());
			if(puzzle.getTags() != null) puzzleJSON.put("tags", puzzle.getJsonTags());
			Completion completion = this.databaseRepo.getCompletionGroup(user.getId(), puzzle.getId());
			if(completion != null && completion.getScore() >= 0){
				puzzleJSON.put("score", completion.getScore());
				puzzleJSON.put("tries", completion.getTries());
			}
			if(puzzle.getDepend() > 0) puzzleJSON.put("depend", puzzle.getDepend());
			writer.response(200, "Access-Control-Allow-Origin: *", "Content-Type: application/json");
			writer.write(puzzleJSON.toJSONString());
		}
		else {
			writer.response(400, "Access-Control-Allow-Origin: *");
		}
	}

	private int extractId(Matcher matcher) {
		return Integer.parseInt(matcher.group(1));
	}
}
