package com.web.controller.admin;

import com.web.entity.Product;
import com.web.entity.ProductImage;
import com.web.repository.CategoryRepository;
import com.web.repository.ProductImageRepository;
import com.web.repository.ProductRepository;
import com.web.utils.CloudinaryService;
import jakarta.servlet.http.HttpServletRequest;
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.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.sql.Timestamp;
import java.util.List;

@Controller(value = "adminProductController")
@RequestMapping("/admin")
public class ProductController {

    @Autowired
    private ProductRepository productRepository;

    @Autowired
    private CategoryRepository categoryRepository;

    @Autowired
    private ProductImageRepository productImageRepository;

    @Autowired
    private CloudinaryService cloudinaryService;
    // Kiểm tra mã sản phẩm đã tồn tại qua AJAX
    @ResponseBody
    @RequestMapping(value = "/check-product-code", method = RequestMethod.GET)
    public boolean checkProductCode(@RequestParam("code") String code) {
        // Kiểm tra xem mã sản phẩm đã tồn tại trong cơ sở dữ liệu hay chưa
        Product existingProduct = productRepository.findByCode(code);
        return existingProduct != null; // Nếu có sản phẩm tồn tại, trả về true, ngược lại false
    }
    @RequestMapping(value = {"/product"}, method = RequestMethod.GET)
    public String product(Model model, @RequestParam(required = false) Long category) {
        List<Product> products;
        if (category == null || category == -1) {
            products = productRepository.findAll();
        } else {
            products = productRepository.findByCategoryId(category);
        }

        if (products.isEmpty()) {
            model.addAttribute("error", "Không có sản phẩm nào thuộc danh mục này!");
        } else {
            model.addAttribute("listProduct", products);
        }

        model.addAttribute("category", category);
        model.addAttribute("listCategory", categoryRepository.findAll());
        return "admin/product";
    }

    // Hàm xử lý GET để thêm và sửa sản phẩm
    @RequestMapping(value = {"/addproduct"}, method = RequestMethod.GET)
    public String addproduct(Model model, @RequestParam(required = false) Long id, RedirectAttributes redirectAttributes) {
        if (id == null) {
            // Khi thêm mới sản phẩm
            model.addAttribute("product", new Product());
            model.addAttribute("type", "add");
        } else {
            // Khi sửa sản phẩm
            Product existingProduct = productRepository.findById(id).get();
            model.addAttribute("product", existingProduct);
            model.addAttribute("type", "update");

            // Thêm thông báo cập nhật thành công
            redirectAttributes.addFlashAttribute("message", "Sản phẩm đã được cập nhật thành công!");
        }

        model.addAttribute("danhMucList", categoryRepository.findAll());
        return "admin/addproduct";
    }

    // Hàm xử lý POST để thêm hoặc cập nhật sản phẩm
    @PostMapping("/add-san-pham")
    public String postSanPham(@ModelAttribute Product product, @RequestParam("imgbanner") MultipartFile imgbanner,
                              @RequestParam("listfile") List<MultipartFile> listfile, RedirectAttributes redirectAttributes) {

        String img = "";
        product.setCreatedDate(new Timestamp(System.currentTimeMillis()));
        product.setQuantitySold(0);

        // Kiểm tra nếu đây là cập nhật hay thêm mới
        if (product.getId() != null) {
            // Cập nhật sản phẩm
            Product existingProduct = productRepository.findById(product.getId()).get();
            product.setCreatedDate(existingProduct.getCreatedDate());  // Giữ nguyên ngày tạo
            product.setQuantitySold(existingProduct.getQuantitySold()); // Giữ nguyên số lượng đã bán
            img = existingProduct.getImageBanner();  // Giữ ảnh banner cũ nếu không có ảnh mới
        }

        // Nếu có ảnh banner mới, tải lên Cloudinary
        if (!imgbanner.isEmpty()) {
            img = cloudinaryService.uploadFile(imgbanner);
        }

        product.setImageBanner(img);  // Cập nhật ảnh banner
        productRepository.save(product);  // Lưu sản phẩm

        // Tải lên các ảnh phụ
        List<String> imageUrls = cloudinaryService.uploadMultiFile(listfile);
        for (String imageUrl : imageUrls) {
            ProductImage productImage = new ProductImage();
            productImage.setLinkImage(imageUrl);
            productImage.setProduct(product);
            productImageRepository.save(productImage);
        }

        // Thêm thông báo thành công
        if (product.getId() == null) {
            // Thêm sản phẩm mới
            redirectAttributes.addFlashAttribute("message", "Thêm sản phẩm thành công!");
        } else {
            // Cập nhật sản phẩm
            redirectAttributes.addFlashAttribute("message", "Cập nhật sản phẩm thành công!");
        }

        // Sau khi thêm hoặc cập nhật, chuyển hướng về danh sách sản phẩm
        return "redirect:/admin/product";
    }

    // Hàm xóa sản phẩm
    @GetMapping("/delete-sanpham")
    public String deleteSanPham(@RequestParam("id") Long id, RedirectAttributes redirectAttributes){
        try {
            productRepository.deleteById(id);
        }
        catch (Exception e){
            // Nếu xóa không được, đánh dấu sản phẩm là đã xóa
            Product p = productRepository.findById(id).get();
            p.setDeleted(true);
            productRepository.save(p);
        }
        redirectAttributes.addFlashAttribute("message", "Xóa sản phẩm thành công!");
        return "redirect:/admin/product";
    }

    // Hàm xóa ảnh sản phẩm
    @GetMapping("/delete-anh-sanpham")
    public String deleteAnhSanPham(@RequestParam("id") Long id, RedirectAttributes redirectAttributes, HttpServletRequest request){
        productImageRepository.deleteById(id);
        redirectAttributes.addFlashAttribute("message", "Xóa ảnh thành công!");
        String referer = request.getHeader("Referer");
        return "redirect:" + referer;
    }
}
