package com.web.controller.user;

import com.web.dto.PaymentSession;
import com.web.dto.ResponsePayment;
import com.web.entity.Cart;
import com.web.entity.Invoice;
import com.web.entity.User;
import com.web.enums.Paytype;
import com.web.repository.CartRepository;
import com.web.service.InvoiceService;
import com.web.service.MomoService;
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.ArrayList;
import java.util.List;

@Controller
public class CheckoutController {

    @Autowired
    private CartRepository cartRepository;

    @Autowired
    private UserUtils userUtils;

    @Autowired
    private InvoiceService invoiceService;

    @Autowired
    private MomoService momoService;

    // Hiển thị trang checkout
    @GetMapping("/checkout")
    public String checkoutPage(Model model, HttpSession session) {
        User user = null;
        List<Cart> cartList = new ArrayList<>();

        try {
            user = userUtils.getUserWithAuthority();
        } catch (Exception ignored) {}

        if (user != null) {
            cartList = cartRepository.findByUser(user.getId());
        } else {
            List<Cart> guestCart = (List<Cart>) session.getAttribute("guestCart");
            if (guestCart != null) cartList = guestCart;
        }

        double total = 0D;
        for (Cart c : cartList) {
            total += c.getQuantity() * c.getProduct().getPrice();
        }

        model.addAttribute("gioHangList", cartList);
        model.addAttribute("tongTien", total);
        model.addAttribute("userLogged", user);

        return "user/checkout";
    }

    // Xử lý POST checkout
    @PostMapping("/checkout")
    public String checkoutPost(RedirectAttributes redirectAttributes,
                               HttpServletRequest request,
                               @RequestParam String fullname,
                               @RequestParam String phone,
                               @RequestParam String address,
                               @RequestParam String note,
                               @RequestParam String paytype,
                               HttpSession session) {

        User user = null;
        List<Cart> cartList = new ArrayList<>();

        try {
            user = userUtils.getUserWithAuthority();
        } catch (Exception ignored) {}

        if (user != null) {
            cartList = cartRepository.findByUser(user.getId());
        } else {
            List<Cart> guestCart = (List<Cart>) session.getAttribute("guestCart");
            if (guestCart != null) cartList = guestCart;
        }

        if (cartList.isEmpty()) {
            redirectAttributes.addFlashAttribute("error", "Giỏ hàng trống. Không thể thanh toán!");
            return "redirect:/cart";
        }

        if (address == null || address.trim().isEmpty()) {
            redirectAttributes.addFlashAttribute("error", "Địa chỉ không được để trống.");
            return "redirect:/checkout";
        }

        // Kiểm tra tồn kho
        for (Cart c : cartList) {
            if (c.getQuantity() > c.getProduct().getQuantity()) {
                redirectAttributes.addFlashAttribute("warning",
                        "Số lượng sản phẩm " + c.getProduct().getName() +
                                " không được vượt quá " + c.getProduct().getQuantity());
                return "redirect:/checkout";
            }
        }

        if (paytype.equalsIgnoreCase("momo")) {
            // Thanh toán online
            double total = cartList.stream().mapToDouble(c -> c.getQuantity() * c.getProduct().getPrice()).sum();
            ResponsePayment responsePayment = momoService.getUrlPayment(total);

            PaymentSession paymentSession = new PaymentSession();
            paymentSession.setResponsePayment(responsePayment);
            paymentSession.setFullname(fullname);
            paymentSession.setPhone(phone);
            paymentSession.setAddress(address);
            paymentSession.setNote(note);
            paymentSession.setUser(user);
            paymentSession.setCartList(cartList);

            session.setAttribute("paymentSession", paymentSession);

            return "redirect:" + responsePayment.getUrl();
        } else {
            // COD
            Invoice invoice = invoiceService.createInvoice(Paytype.COD, fullname, phone, address, note, user, cartList);

            // Xóa cart sau khi tạo invoice
            if (user != null) {
                cartRepository.deleteAll(cartList);
                redirectAttributes.addFlashAttribute("success", "Đặt hàng thành công!");
                return "redirect:/taikhoan"; // user đã login
            } else {
                // Lưu session cho guest để hiển thị checkout-success
                session.setAttribute("invoiceSession", invoice);
                session.setAttribute("cartSession", cartList);

                // Xóa giỏ hàng guest
                session.removeAttribute("guestCart");

                redirectAttributes.addFlashAttribute("success", "Đặt hàng thành công!");
                return "redirect:/checkout-success"; // guest
            }
        }
    }

    // Hiển thị trang đặt hàng thành công cho guest
    @GetMapping("/checkout-success")
    public String checkoutSuccessPage(Model model, HttpSession session) {
        Invoice invoice = (Invoice) session.getAttribute("invoiceSession");
        List<Cart> cartList = (List<Cart>) session.getAttribute("cartSession");

        if (invoice == null || cartList == null) {
            return "redirect:/"; // nếu không có dữ liệu -> quay về trang chủ
        }

        model.addAttribute("invoice", invoice);
        model.addAttribute("cartList", cartList);

        return "user/checkout-success"; // file checkout-success.html
    }
}
