package com.web.controller.user;

import com.web.entity.Cart;
import com.web.entity.Product;
import com.web.entity.User;
import com.web.repository.CartRepository;
import com.web.repository.ProductRepository;
import com.web.utils.UserUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.*;

@Controller
public class CartController {

    @Autowired
    private CartRepository cartRepository;

    @Autowired
    private ProductRepository productRepository;

    @Autowired
    private UserUtils userUtils;

    // Hiển thị giỏ hàng
    @RequestMapping(value = {"/cart"}, method = RequestMethod.GET)
    public String gioHang(Model model, HttpSession session) {
        List<Cart> list = new ArrayList<>();

        User user = null;
        try {
            user = userUtils.getUserWithAuthority();
        } catch (Exception ignored) {}

        if (user != null) {
            list = cartRepository.findByUser(user.getId());
        } else {
            // Lấy giỏ hàng từ session nếu chưa login
            list = (List<Cart>) session.getAttribute("guestCart");
            if (list == null) list = new ArrayList<>();
        }

        Double d = 0D;
        for (Cart g : list) {
            d += g.getQuantity() * g.getProduct().getPrice();
        }

        model.addAttribute("gioHangList", list);
        model.addAttribute("tongTien", d);
        return "user/cart";
    }

    // Thêm sản phẩm vào giỏ hàng
    @PostMapping("/add-cart")
    public String add(RedirectAttributes redirectAttributes, HttpServletRequest request,
                      @RequestParam Integer soLuong, @RequestParam Long id) {

        Product sanPham = productRepository.findById(id).orElse(null);
        if (sanPham == null) {
            redirectAttributes.addFlashAttribute("message", "Sản phẩm không tồn tại!");
            return "redirect:" + request.getHeader("Referer");
        }

        HttpSession session = request.getSession();
        User user = null;

        try {
            user = userUtils.getUserWithAuthority();
        } catch (Exception ignored) {}

        if (user != null) {
            // Nếu đã login
            Optional<Cart> gioHang = cartRepository.findByUserAndIdSp(user.getId(), id);
            if (gioHang.isPresent()) {
                Cart gh = gioHang.get();
                gh.setQuantity(gh.getQuantity() + soLuong);
                cartRepository.save(gh);
            } else {
                Cart gh = new Cart();
                gh.setQuantity(soLuong);
                gh.setProduct(sanPham);
                gh.setUser(user);
                cartRepository.save(gh);
            }
        } else {
            // Chưa login, lưu vào session
            List<Cart> guestCart = (List<Cart>) session.getAttribute("guestCart");
            if (guestCart == null) guestCart = new ArrayList<>();

            boolean found = false;
            for (Cart c : guestCart) {
                if (c.getProduct().getId().equals(id)) {
                    c.setQuantity(c.getQuantity() + soLuong);
                    found = true;
                    break;
                }
            }

            if (!found) {
                Cart gh = new Cart();
                gh.setProduct(sanPham);
                gh.setQuantity(soLuong);
                guestCart.add(gh);
            }
            session.setAttribute("guestCart", guestCart);
        }

        redirectAttributes.addFlashAttribute("message", "Thêm sản phẩm vào giỏ hàng thành công!");
        return "redirect:" + request.getHeader("Referer");
    }

    // Cập nhật số lượng (tương tự, cần kiểm tra login hay guest)
    @PostMapping("/update-sl")
    public String upDateSl(RedirectAttributes redirectAttributes, HttpServletRequest request,
                           @RequestParam Integer soLuong, @RequestParam Long id) {
        HttpSession session = request.getSession();
        User user = null;
        try {
            user = userUtils.getUserWithAuthority();
        } catch (Exception ignored) {}

        if (user != null) {
            Cart gioHang = cartRepository.findById(id).orElse(null);
            if (gioHang != null) {
                gioHang.setQuantity(gioHang.getQuantity() + soLuong);
                if (gioHang.getQuantity() <= 0) {
                    cartRepository.delete(gioHang);
                } else {
                    cartRepository.save(gioHang);
                }
            }
        } else {
            List<Cart> guestCart = (List<Cart>) session.getAttribute("guestCart");
            if (guestCart != null) {
                for (Iterator<Cart> it = guestCart.iterator(); it.hasNext(); ) {
                    Cart c = it.next();
                    if (c.getProduct().getId().equals(id)) {
                        c.setQuantity(c.getQuantity() + soLuong);
                        if (c.getQuantity() <= 0) it.remove();
                        break;
                    }
                }
                session.setAttribute("guestCart", guestCart);
            }
        }

        return "redirect:" + request.getHeader("Referer");
    }

    // Xóa sản phẩm khỏi giỏ
    @GetMapping("/delete-giohang")
    public String deleteDonHang(RedirectAttributes redirectAttributes, HttpServletRequest request,
                                @RequestParam("id") Long id) {
        HttpSession session = request.getSession();
        User user = null;
        try {
            user = userUtils.getUserWithAuthority();
        } catch (Exception ignored) {}

        if (user != null) {
            cartRepository.deleteById(id);
        } else {
            List<Cart> guestCart = (List<Cart>) session.getAttribute("guestCart");
            if (guestCart != null) {
                guestCart.removeIf(c -> c.getProduct().getId().equals(id));
                session.setAttribute("guestCart", guestCart);
            }
        }

        redirectAttributes.addFlashAttribute("message", "Xóa giỏ hàng thành công!");
        return "redirect:/cart";
    }
}
