CheckoutServlet.java

package com.popx.presentazione;

import com.popx.modello.*;
import com.popx.persistenza.*;

import javax.servlet.ServletException;
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.sql.Date;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "CheckoutServlet", value = "/CheckoutServlet")
public class CheckoutServlet extends HttpServlet {

    private CarrelloDAO carrelloDAO = new CarrelloDAOImpl();
    private OrdineDAO ordineDAO = new OrdineDAOImpl();
    private RigaOrdineDAO rigaOrdineDAO = new RigaOrdineDAOImpl();
    private ProdottoDAO prodottoDAO = new ProdottoDAOImpl();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String userEmail = (String) request.getSession().getAttribute("userEmail");

        if (userEmail == null) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.setContentType("text/html");
            response.getWriter().write("<script>alert('Utente non autenticato');</script>");
            return;
        }

        HttpSession session = request.getSession();
        List<ProdottoBean> prodottoBeans = (List<ProdottoBean>) session.getAttribute("cart");

        if (prodottoBeans == null || prodottoBeans.isEmpty()) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            response.setContentType("text/html");
            response.getWriter().write("<script>alert('Il carrello รจ vuoto.');</script>");
            return;
        }

        double subtotal = 0;
        for (ProdottoBean prodotto : prodottoBeans) {
            subtotal += prodotto.getQty() * prodotto.getCost();
        }

        OrdineBean ordine = new OrdineBean((float) subtotal, userEmail, new Date(System.currentTimeMillis()));

        try {
            ordineDAO.insertOrdine(ordine);
            int ordineId = ordine.getId();

            for (ProdottoBean prodotto : prodottoBeans) {
                RigaOrdineBean rigaOrdine = new RigaOrdineBean(
                        ordineId,
                        prodotto.getId(),
                        prodotto.getQty(),
                        (float) prodotto.getCost()
                );
                rigaOrdineDAO.addRigaOrdine(rigaOrdine);

                // Aggiorna lo stock utilizzando il DAO
                int newQty = prodotto.getPiecesInStock() - prodotto.getQty();
                prodottoDAO.updateStock(prodotto.getId(), newQty);
            }

            carrelloDAO.clearCartByUserEmail(userEmail);
            session.setAttribute("cart", null);

            response.setStatus(HttpServletResponse.SC_OK);
            response.setContentType("text/html");
            String contextPath = request.getContextPath();
            response.getWriter().write("<script>alert('Ordine completato con successo!');setTimeout(function(){ window.location.href = '" + contextPath + "/jsp/HomePage.jsp'; }, 1500);</script>");
        } catch (Exception e) {
            e.printStackTrace();
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.setContentType("text/html");
            response.getWriter().write("<script>alert('Errore interno nel completamento dell'ordine.');</script>");
        }
    }
}