GestioneCampagnaController.java

package controller;

import controller.utils.FileServlet;
import controller.utils.Validator;
import model.beans.Campagna;
import model.beans.Categoria;
import model.beans.Donazione;
import model.beans.Immagine;
import model.beans.StatoCampagna;
import model.beans.Utente;
import model.beans.proxies.CampagnaProxy;
import model.beans.proxies.DonazioneProxy;
import model.beans.proxyInterfaces.CampagnaInterface;
import model.services.CategoriaService;
import model.services.CampagnaService;
import model.services.CategoriaServiceImpl;
import model.services.CampagnaServiceImpl;
import model.services.ReportService;
import model.services.TipoReport;
import model.services.ImmagineService;
import model.services.ImmagineServiceImpl;
import model.storage.ConPool;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@WebServlet(name = "GestioneCampagnaController",
        value = "/campagna/*",
        loadOnStartup = 0)
@MultipartConfig
public final class GestioneCampagnaController extends HttpServlet {
   /**
    * Variabile per il service di Campagna.
    */
   private static CampagnaService campagnaService;

   /**
    * Variabile per il service di Categoria.
    */
   private static CategoriaService categoriaService;

   /**
    * Costruttore per GestioneCampagnaController.
    *
    * @param service    il service di Campagna.
    * @param catService il service di Categoria.
    */
   public GestioneCampagnaController(final CampagnaService service,
                                     final CategoriaService catService) {
      campagnaService = service;
      categoriaService = catService;
   }

   /**
    * Costruttore per GestioneCampagnaController.
    */
   public GestioneCampagnaController() {
      campagnaService = new CampagnaServiceImpl();
      categoriaService = new CategoriaServiceImpl();
   }

   @Override
   public void doGet(final HttpServletRequest request,
                     final HttpServletResponse response)
           throws ServletException, IOException {
      String resource = "/";
      HttpSession session = request.getSession();
      String path = request.getPathInfo() == null
              ? "/" : request.getPathInfo();

      Utente userSession = (Utente) session.getAttribute("utente");

      switch (path) {
         case "/main":
            List<Campagna> lst = campagnaService.getActiveCampagne();
            lst.forEach(c -> {
               CampagnaInterface proxy = new CampagnaProxy(c);
               proxy.getUtente();
               proxy.getImmagini();
            });
            request.setAttribute("campagneList", lst);
            resource = "/WEB-INF/results/main_page.jsp";
            break;
         case "/creaCampagna":
            if (!new Validator(request).isValidBean(Utente.class,
                    userSession)) {
               response.sendRedirect(
                       request.getServletContext().getContextPath()
                               + "/autenticazione/login");
               return;
            } else {
               request.setAttribute("categorie",
                       categoriaService.visualizzaCategorie());
               resource = "/WEB-INF/results/form_campagna.jsp";
            }
            break;
         case "/modificaCampagna":
            visualizzaModificaCampagna(request, response);
            return;
         case "/campagna":
            String id = request.getParameter("idCampagna");
            int idCampagna = Integer.parseInt(id);
            Campagna c = campagnaService.trovaCampagna(idCampagna);
            if (c == null || c.getStato() != StatoCampagna.ATTIVA) {
               response.sendError(
                       HttpServletResponse.SC_NOT_FOUND,
                       "Campagna non trovata");
               return;
            } else {
               CampagnaInterface proxy = new CampagnaProxy(c);
               c.setUtente(proxy.getUtente());
               DonazioneProxy proxy2 = new DonazioneProxy();
               c.setImmagini(proxy.getImmagini());
               List<Donazione> donazioni = proxy.getDonazioni();
               donazioni.forEach(d -> {
                  proxy2.setDonazione(d);
                  d.setUtente(proxy2.getUtente());
               });
               c.setDonazioni(proxy.getDonazioni());
               if (campagnaService.modificaCampagna(c)) {
                  request.setAttribute("campagna", c);
                  condividiCampagna(request, c.getIdCampagna());
                  resource = "/WEB-INF/results/campagna.jsp";
               } else {
                  response.sendError(HttpServletResponse.SC_NOT_FOUND);
                  return;
               }
            }
            break;
         case "/ricerca":
            String searchText = request.getParameter("searchText");
            searchText = searchText.trim();
            List<Campagna> campagne = campagnaService.
                    ricercaCampagna(searchText);
            campagne = campagne.stream().
                    filter(campagna -> campagna.getStato()
                            == StatoCampagna.ATTIVA).
                    collect(Collectors.toList());

            if (campagne.size() > 0 && !searchText.isBlank()) {
               for (Campagna campagna : campagne) {
                  new CampagnaProxy(campagna).getImmagini();
               }
               request.setAttribute("campagneList", campagne);
               resource = "/WEB-INF/results/campagne.jsp";
            } else {
               request.setAttribute("errorSearch",
                       "Nessun risultato trovato");
               resource = "/WEB-INF/results/campagne.jsp";
            }
            break;
         case "/ricercaCategoria":
            String cat = request.getParameter("idCat");
            if (cat.isBlank()) {
               response.sendError(HttpServletResponse.SC_NOT_FOUND);
               return;
            }
            String idcattrimmed = cat.trim();
            Categoria categoria = new Categoria();
            try {
               categoria.setIdCategoria(Integer.parseInt(idcattrimmed));
            } catch (NumberFormatException e) {
               response.sendError(HttpServletResponse.SC_NOT_FOUND);
            }
            categoria = categoriaService.visualizzaCategoria(categoria);

            if (categoria == null) {
               response.sendError(HttpServletResponse.SC_NOT_FOUND);
               return;
            }

            List<Campagna> campagneSearched = campagnaService.
                    ricercaCampagnaPerCategoria(categoria.getNome());

            campagne = campagneSearched.stream().
                    filter(campagna -> campagna.getStato()
                            == StatoCampagna.ATTIVA).
                    collect(Collectors.toList());

            if (campagne.size() > 0) {
               for (Campagna campagna : campagne) {
                  new CampagnaProxy(campagna).getImmagini();
               }
               request.setAttribute("campagneList", campagne);
            } else {
               request.setAttribute("errorSearch",
                       "Nessun risultato trovato");
            }
            resource = "/WEB-INF/results/campagne.jsp";
            break;
         default:
            response.sendError(
                    HttpServletResponse.SC_NOT_FOUND,
                    "Risorsa non trovata");
            return;
      }

      RequestDispatcher dispatcher =
              request.getRequestDispatcher(resource);
      dispatcher.forward(request, response);
   }

   @Override
   public void doPost(final HttpServletRequest request,
                      final HttpServletResponse response)
           throws ServletException, IOException {

      HttpSession session = request.getSession();
      Utente userSession = (Utente) session.getAttribute("utente");
      String path = request.getPathInfo();
      if (!new Validator(request).isValidBean(Utente.class, userSession)) {
         response.sendRedirect(
                 request.getServletContext().getContextPath()
                         + "/autenticazione/login");
      } else {
         String idCampagna = request.getParameter("idCampagna");
         int id;

         switch (path) {
            case "/creaCampagna":
               creaCampagna(request, response, userSession);
               break;
            case "/modificaCampagna":
               if (idCampagna != null) {
                  modificaCampagna(request, response, campagnaService
                                  .trovaCampagna(
                                          Integer.parseInt(idCampagna)),
                          userSession);
               } else {
                  ReportService.creaReport(request, TipoReport.ERRORE,
                          "Operazione modifica campagna:",
                          "Non effettuata con successo");
               }
               break;
            case "/cancellaCampagna":
               id = Integer.parseInt(idCampagna);
               Campagna campagna = campagnaService.trovaCampagna(id);

               if (campagna.getUtente().getIdUtente()
                       != userSession.getIdUtente()) {
                  response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
                  return;
               } else {
                  if (campagnaService.cancellaCampagna(campagna)) {
                     if (campagnaService.rimborsaDonazioni(campagna,
                             new CampagnaProxy(campagna))) {
                        ReportService.creaReport(request,
                                TipoReport.INFO,
                                "Operazione rimborso donazioni:",
                                "Effettuata con successo");
                     } else {
                        ReportService.creaReport(request,
                                TipoReport.ERRORE,
                                "Operazione rimborso donazioni:",
                                "Non effettuata con successo");
                     }
                     response.sendRedirect(request.getServletContext()
                             .getContextPath()
                             + "/GestioneUtenteController"
                             + "/visualizzaDashboard");
                     return;
                  } else {
                     ReportService.creaReport(request,
                             TipoReport.ERRORE,
                             "Operazione cancellazione campagna:",
                             "Non effettuata con successo");
                  }
               }
               break;
            case "/chiudiCampagna":
               id = Integer.parseInt(idCampagna);
               Campagna campagna1 = campagnaService.trovaCampagna(id);
               if (campagnaService.chiudiCampagna(campagna1)) {
                  ReportService.creaReport(request,
                          TipoReport.INFO,
                          "Chiusura campagna",
                          "Azione effettuata con successo");
                  response.sendRedirect(request.getServletContext()
                          .getContextPath()
                          + "/GestioneUtenteController"
                          + "/visualizzaDashboard");
               } else {
                  response.sendError(
                          HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
               }
               return;
            default:
               response.sendError(
                       HttpServletResponse.SC_NOT_FOUND);
               break;
         }
      }
   }

   private void condividiCampagna(final HttpServletRequest request,
                                  final int idCampagna) {

      Map<String, String> map =
              campagnaService.condividiCampagna(idCampagna, request);

      request.setAttribute("linkList", map);

   }

   private void visualizzaModificaCampagna(final HttpServletRequest request,
                                           final HttpServletResponse response)
           throws ServletException, IOException {
      HttpSession session = request.getSession();
      Utente userSession = (Utente) session.getAttribute("utente");

      if (!new Validator(request).isValidBean(Utente.class,
              session.getAttribute("utente"))) {
         response.sendRedirect(
                 request.getServletContext().getContextPath()
                         + "/autenticazione/login");
         return;
      }

      String idCampagna = request.getParameter("idCampagna");
      int id;
      try {
         id = Integer.parseInt(idCampagna);
      } catch (NumberFormatException e) {
         response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE,
                 "Input errato");
         e.printStackTrace();
         return;
      }
      Campagna c = campagnaService.trovaCampagna(id);
      if (c.getUtente().getIdUtente() != userSession.getIdUtente()) {
         response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                 "Non Autorizzato");
         return;
      }
      request.setAttribute("campagna", c);
      request.setAttribute("categorie",
              categoriaService.visualizzaCategorie());
      RequestDispatcher dispatcher =
              request.getRequestDispatcher(
                      "/WEB-INF/results/form_campagna.jsp");
      dispatcher.forward(request, response);
   }

   private void creaCampagna(final HttpServletRequest req,
                             final HttpServletResponse res,
                             final Utente utente)
           throws IOException, ServletException {

      Campagna c = extractCampagna(req);
      c.setSommaRaccolta(0d);
      c.setUtente(utente);

      if (campagnaService.creazioneCampagna(c)) {
         uploadFoto(req, c);
         ReportService.creaReport(req, TipoReport.INFO,
                 "Operazione creazione campagna:",
                 "Effettuata con successo");
         res.sendRedirect(
                 req.getServletContext().getContextPath() + "/index.jsp");
      } else {
         ReportService.creaReport(req, TipoReport.ERRORE,
                 "Operazione creazione campagna:",
                 "Non effettuata con successo");
         res.sendRedirect(
                 req.getServletContext().getContextPath()
                         + "/campagna/creaCampagna");
      }
   }

   private Campagna extractCampagna(final HttpServletRequest request) {
      Campagna c = new Campagna();

      c.setStato(StatoCampagna.ATTIVA);
      c.setTitolo(request.getParameter("titolo"));
      c.setDescrizione(request.getParameter("descrizione"));

      c.setSommaTarget(
              Double.parseDouble(request.getParameter("sommaTarget")));
      c.setUtente((Utente) request.getSession(false).getAttribute("utente"));

      Categoria categoria = new Categoria();
      categoria.setIdCategoria(Integer.parseInt(
              request.getParameter("idCategoria")));

      c.setCategoria(
              categoriaService.visualizzaCategoria(categoria));

      return c;
   }

   private void uploadFoto(final HttpServletRequest request,
                           final Campagna campagna) throws ServletException,
           IOException {
      List<String> fotoList = FileServlet.uploadFoto(request);
      ImmagineService immagineService =
              new ImmagineServiceImpl();
      Immagine immagine = new Immagine();
      immagine.setCampagna(campagna);

      if (!fotoList.isEmpty()) {
         immagineService.eliminaImmaginiCampagna(campagna.getIdCampagna());
      }

      for (String fotoPath : fotoList) {
         immagine.setPath(fotoPath);
         immagineService.salvaImmagine(immagine);
      }
   }

   private void modificaCampagna(final HttpServletRequest request,
                                 final HttpServletResponse response,
                                 final Campagna campagna,
                                 final Utente utente)
           throws IOException, ServletException {

      Campagna c = extractCampagna(request);
      c.setIdCampagna(campagna.getIdCampagna());
      c.setSommaRaccolta(campagna.getSommaRaccolta());

      if (campagnaService.modificaCampagna(c)) {
         uploadFoto(request, c);
         ReportService.creaReport(request, TipoReport.INFO,
                 "Operazione modifica campagna:",
                 "Effettuata con successo");
         response.sendRedirect(
                 request
                         .getServletContext()
                         .getContextPath() + "/index.jsp");
      } else {
         ReportService.creaReport(request, TipoReport.ERRORE,
                 "Operazione modifica campagna:",
                 "Non effettuata con successo");
         request.getRequestDispatcher("/campagna"
                 + "/modificaCampagna").forward(request, response);
      }
   }

   @Override
   public void destroy() {
      ConPool.getInstance().closeDataSource();
      super.destroy();
   }

}