package services;

import managers.AccountManager;
import managers.GroupManager;
import managers.PostManager;
import models.Group;
import models.Post;
import models.services.NotificationService;
import org.apache.http.protocol.HTTP;
import play.Configuration;
import play.Environment;
import play.api.OptionalSourceMapper;
import play.api.UsefulException;
import play.api.routing.Router;
import play.db.jpa.JPAApi;
import play.http.DefaultHttpErrorHandler;
import play.mvc.Http;
import play.mvc.Result;
import play.mvc.Results;
import views.html.defaultpages.badRequest;

import javax.inject.Inject;
import javax.inject.Provider;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

/**
 * Created by Iven on 08.12.2015.
 */
public class ErrorHandler extends DefaultHttpErrorHandler {

    private int MAX_FILESIZE;

    GroupManager groupManager;
    PostManager postManager;
    AccountManager accountManager;
    NotificationService notificationService;
    Configuration configuration;
    JPAApi jpaApi;

    @Inject
    public ErrorHandler(JPAApi jpaApi, Configuration configuration, Environment environment, OptionalSourceMapper optionalSourceMapper, Provider<Router> provider, AccountManager accountManager, GroupManager groupManager,
            PostManager postManager, NotificationService notificationService) {
        super(configuration, environment, optionalSourceMapper, provider);
        this.configuration = configuration;
        this.jpaApi = jpaApi;
        this.accountManager = accountManager;
        this.groupManager = groupManager;
        this.postManager = postManager;
        this.notificationService = notificationService;

        this.MAX_FILESIZE = configuration.getInt("media.maxSize.file");
    }

    protected CompletionStage<Result> onProdServerError(Http.RequestHeader request, UsefulException exception) {
        jpaApi.withTransaction(() -> {
            Group group = groupManager.findByTitle(configuration.getString("htwplus.admin.group"));
            if (group != null) {
                Post post = new Post();
                post.content = "Request: " + request + "\nError: " + exception;
                post.owner = accountManager.findByEmail(configuration.getString("htwplus.admin.mail"));
                post.group = group;
                postManager.createWithoutIndex(post);
                notificationService.createNotification(post, Post.GROUP);
            }
        });

        return CompletableFuture.completedFuture(Results.redirect(controllers.routes.Application.error()));
    }

    protected CompletionStage<Result> onForbidden(Http.RequestHeader request, String message) {
        jpaApi.withTransaction(() -> {
            Group group = groupManager.findByTitle(configuration.getString("htwplus.admin.group"));
            if (group != null) {
                Post post = new Post();
                post.content = "Request: " + request + "\nError: 403 - Forbidden (" + message + ")";
                post.owner = accountManager.findByEmail(configuration.getString("htwplus.admin.mail"));
                post.group = group;
                postManager.createWithoutIndex(post);
                notificationService.createNotification(post, Post.GROUP);
            }
        });

        return CompletableFuture.completedFuture(Results.redirect(controllers.routes.Application.index()));
    }

    protected CompletionStage<Result> onBadRequest(Http.RequestHeader request, String message) {
        jpaApi.withTransaction(() -> {
            Group group = groupManager.findByTitle(configuration.getString("htwplus.admin.group"));
            if (group != null) {
                Post post = new Post();
                post.content = "Request: " + request + "\nError: 400 - Bad Request (" + message + ")";
                post.owner = accountManager.findByEmail(configuration.getString("htwplus.admin.mail"));
                post.group = group;
                postManager.createWithoutIndex(post);
                notificationService.createNotification(post, Post.GROUP);
            }
        });

        return CompletableFuture.completedFuture(Results.redirect(controllers.routes.Application.index()));
    }

    protected CompletionStage<Result> onOtherClientError(Http.RequestHeader request, int errorCode, String message) {
        jpaApi.withTransaction(() -> {
            Group group = groupManager.findByTitle(configuration.getString("htwplus.admin.group"));
            if (group != null) {
                Post post = new Post();
                post.content = "Request: " + request + "\nError: " + errorCode + " - " + message;
                post.owner = accountManager.findByEmail(configuration.getString("htwplus.admin.mail"));
                post.group = group;
                postManager.createWithoutIndex(post);
                notificationService.createNotification(post, Post.GROUP);
            }
        });

        if (errorCode == Http.Status.REQUEST_ENTITY_TOO_LARGE) {
            return CompletableFuture.completedFuture(Results.status(errorCode, "Es sind maximal "+ MAX_FILESIZE + " MByte pro Datei möglich."));
        }

        return CompletableFuture.completedFuture(Results.status(errorCode, badRequest.render(request.method(), request.uri(), message)));
    }
}

@@ -2372,82 +2372,8 @@
 t);%0A
-                notificationService.createNotification(post, Post.GROUP);%0A
     
@@ -2374,32 +2374,32 @@
 ;%0A            %7D%0A
+
         %7D);%0A%0A   
@@ -3117,82 +3117,8 @@
 t);%0A
-                notificationService.createNotification(post, Post.GROUP);%0A
     
@@ -3865,82 +3865,8 @@
 t);%0A
-                notificationService.createNotification(post, Post.GROUP);%0A
     
@@ -4563,32 +4563,32 @@
 .group = group;%0A
+
                 
@@ -4629,82 +4629,8 @@
 t);%0A
-                notificationService.createNotification(post, Post.GROUP);%0A
     

remove notifications on server errors to avoid spam