package org.initialde.yakasave.Api.Handlers;

import org.initialde.yakasave.Domain.Exceptions.*;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class RestResponseExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler({InvalidDeadlineException.class})
    public ResponseEntity<Object> handleInvalidDeadlineException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler({InvalidAmountException.class})
    public ResponseEntity<Object> handleInvalidAmountException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler({MinimumGoalAmountException.class})
    public ResponseEntity<Object> handleCannotBeZeroException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler({ExceedMaxMembersAllowedException.class})
    public ResponseEntity<Object> handleExceedMaxMembersException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({NotExistsSavingsFundException.class})
    public ResponseEntity<Object> handleNotExistsSavingsFundException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler({AlreadyContributorException.class})
    public ResponseEntity<Object> handleAlreadyContributorException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({IsNotContributorException.class})
    public ResponseEntity<Object> handleIsNotContributorException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler({ContributionAmountLessThanMinimumAuthorizedException.class})
    public ResponseEntity<Object> handleContributionAmountException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler({NotAuthorizeToWithdrawFromSavingsFundException.class})
    public ResponseEntity<Object> handleNotAuthorizeException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({AmountWithDrawLessThanMinimumAuthorizedException.class})
    public ResponseEntity<Object> handleAmountWithDrawIsLessException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler({AmountWithDrawGreaterThanBalanceException.class})
    public ResponseEntity<Object> handleAmountWithDrawIsGreaterException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler({SavingsFundClosedException.class})
    public ResponseEntity<Object> handleSavingsFundIsClosedException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({NotAuthorizeToCloseSavingsFundException.class})
    public ResponseEntity<Object> handleNotAuthorizeToCloseSavingsFundException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({AlreadyClosedSavingsFunException.class})
    public ResponseEntity<Object> handleAlreadyClosedSavingsFunException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({CannotRemoveContributorException.class})
    public ResponseEntity<Object> handleCannotRemoveContributorException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({NotYetContributedException.class})
    public ResponseEntity<Object> handleNotYetContributedException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({AlreadyApprovedWithdrawException.class})
    public ResponseEntity<Object> handleAlreadyApprovedWithdrawException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({OwnerCannotGiveApprovalException.class})
    public ResponseEntity<Object> handleOwnerCannotGiveApprovalException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({PasswordNotMatchesException.class})
    public ResponseEntity<Object> handlePasswordNotMatchesException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }

    @ExceptionHandler({UserAlreadyExitsException.class})
    public ResponseEntity<Object> handleUserAlreadyExistsException(
            Exception ex, WebRequest request) {
        return new ResponseEntity<>(
                ex.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT);
    }
}
