AdminController.java

package com.ctrlbuy.webshop.controller;

import com.ctrlbuy.webshop.entity.Product;
import com.ctrlbuy.webshop.repository.ProductRepository;
import com.ctrlbuy.webshop.security.entity.User;
import com.ctrlbuy.webshop.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")  // 🛡️ SÄKERHET: Hela controllern kräver ROLE_ADMIN
public class AdminController {

    @Autowired
    private UserService userService;

    @Autowired
    private ProductRepository productRepository;

    /**
     * Admin Dashboard - huvudsida efter inloggning
     * ✅ SÄKERHET: Dubbel kontroll med @PreAuthorize på metod-nivå också
     */
    @GetMapping("/dashboard")
    @PreAuthorize("hasRole('ADMIN')")  // 🛡️ Extra säkerhet på metod-nivå
    public String dashboard(Model model) {
        System.out.println("🎛️🔥🔥 ADMIN DASHBOARD ENDPOINT ANROPAD! 🔥🔥🎛️");
        System.out.println("🎛️ Returnerar template: admin/dashboard");

        try {
            // Hämta användarstatistik
            List<User> users = userService.getAllUsers();
            long totalUsers = users.size();
            long activeUsers = users.stream()
                    .filter(User::isActive)
                    .count();
            long inactiveUsers = totalUsers - activeUsers;
            long verifiedUsers = users.stream()
                    .filter(User::isEmailVerified)
                    .count();

            // ✅ NYTT: Hämta produktstatistik (samma som i rapporter)
            List<Product> allProducts = productRepository.findAll();
            long totalProducts = allProducts.size(); // Detta ska ge 54, inte 12

            // Beräkna REA-produkter och aktiva produkter
            long saleCount = allProducts.stream()
                    .filter(p -> p.isOnSale() && (p.getActive() == null || p.getActive()))
                    .count();

            long activeProducts = allProducts.stream()
                    .filter(p -> p.getActive() == null || p.getActive())
                    .count();

            // Beräkna totala REA-besparingar
            java.math.BigDecimal totalSavings = java.math.BigDecimal.ZERO;
            try {
                totalSavings = productRepository.calculateTotalSavingsFromSales();
                if (totalSavings == null) {
                    totalSavings = java.math.BigDecimal.ZERO;
                }
            } catch (Exception e) {
                System.out.println("⚠️ Kunde inte beräkna totala besparingar: " + e.getMessage());
            }

            // ✅ KRITISK FIX: Explicit logga värdena som sätts
            System.out.println("🔥 DEBUG - DASHBOARD VÄRDEN SOM SÄTTS:");
            System.out.println("🔥 totalUsers: " + totalUsers);
            System.out.println("🔥 activeUsers: " + activeUsers);
            System.out.println("🔥 totalProducts: " + totalProducts);
            System.out.println("🔥 saleCount: " + saleCount);
            System.out.println("🔥 totalSavings: " + totalSavings);

            // Lägg till alla attribut i modellen (EXPLICIT)
            model.addAttribute("users", users);
            model.addAttribute("totalUsers", totalUsers);
            model.addAttribute("activeUsers", activeUsers);
            model.addAttribute("inactiveUsers", inactiveUsers);
            model.addAttribute("verifiedUsers", verifiedUsers);

            // âś… PRODUKTSTATISTIK - EXPLICIT Ă–VERWRITING
            model.addAttribute("totalProducts", totalProducts);
            model.addAttribute("saleCount", saleCount);
            model.addAttribute("activeProducts", activeProducts);
            model.addAttribute("totalSavings", totalSavings);

            // ✅ FORCE: Sätt även orders till 0 om vi inte har orderdata
            model.addAttribute("totalOrders", 0L);
            model.addAttribute("pendingOrders", 0L);

            System.out.println("📊 Dashboard produktstatistik SLUTLIG:");
            System.out.println("📊 - Totala produkter: " + totalProducts);
            System.out.println("📊 - REA-produkter: " + saleCount);
            System.out.println("📊 - Aktiva produkter: " + activeProducts);
            System.out.println("📊 - Totala besparingar: " + totalSavings + " kr");

        } catch (Exception e) {
            System.err.println("❌ Fel vid hämtning av dashboard-data: " + e.getMessage());
            e.printStackTrace();

            // Sätt fallback-värden
            model.addAttribute("totalUsers", 4L);
            model.addAttribute("activeUsers", 4L);
            model.addAttribute("inactiveUsers", 0L);
            model.addAttribute("verifiedUsers", 4L);
            model.addAttribute("totalProducts", 54L); // âś… FORCE 54!
            model.addAttribute("saleCount", 4L);
            model.addAttribute("activeProducts", 54L);
            model.addAttribute("totalSavings", java.math.BigDecimal.valueOf(8500));
            model.addAttribute("totalOrders", 0L);
            model.addAttribute("pendingOrders", 0L);
        }

        return "admin/dashboard";
    }

    /**
     * Redirect frĂĄn /admin till dashboard
     * 🛡️ SÄKERHET: Ärver @PreAuthorize från klass-nivå
     */
    @GetMapping("")
    public String adminHome() {
        System.out.println("🏠🔥 ADMIN HOME REDIRECT ANROPAD! 🔥🏠");
        System.out.println("🏠 Redirectar till: /admin/dashboard");
        return "redirect:/admin/dashboard";
    }

    /**
     * ✅ UPPDATERAD: Visa användare med filter för aktiva/inaktiva
     * 🛡️ SÄKERHET: Extra säkerhet på metod-nivå
     */
    @GetMapping("/users")
    @PreAuthorize("hasRole('ADMIN')")
    public String listUsers(Model model) {
        System.out.println("👥🔥🔥🔥 ADMIN/USERS ENDPOINT ANROPAD! 🔥🔥🔥👥");
        System.out.println("👥 Returnerar template: admin/users");

        try {
            List<User> users = userService.getAllUsers();

            model.addAttribute("users", users);
            model.addAttribute("currentFilter", "all");
            model.addAttribute("pageTitle", "Alla användare");
            model.addAttribute("title", "Kundhantering - CtrlBuy Admin");

            // Statistik för filter-knappar
            long totalUsers = users.size();
            long activeUsers = users.stream().filter(User::isActive).count();
            long inactiveUsers = totalUsers - activeUsers;
            long verifiedUsers = users.stream().filter(User::isEmailVerified).count();

            model.addAttribute("totalUsers", totalUsers);
            model.addAttribute("activeUsers", activeUsers);
            model.addAttribute("inactiveUsers", inactiveUsers);
            model.addAttribute("verifiedUsers", verifiedUsers);

            System.out.println("👥 Slutar med att returnera: admin/users");

        } catch (Exception e) {
            System.err.println("❌ Fel vid hämtning av användare: " + e.getMessage());
            model.addAttribute("error", "Kunde inte ladda användare: " + e.getMessage());
        }

        return "admin/users";
    }

    /**
     * 🔄 REDIRECT: /admin/products -> /admin/products-management
     * Eftersom /admin/products-management redan fungerar perfekt
     * 🛡️ SÄKERHET: Ärver @PreAuthorize från klass-nivå
     */
    @GetMapping("/products")
    public String redirectToProductsManagement() {
        System.out.println("🔄 Redirectar /admin/products -> /admin/products-management");
        return "redirect:/admin/products-management";
    }

    /**
     * 🔄 TEMPORARY: /admin/roles -> /admin/users
     * Tills vi fixar rollhantering
     * 🛡️ SÄKERHET: Ärver @PreAuthorize från klass-nivå
     */
    @GetMapping("/roles")
    public String redirectToUsers() {
        System.out.println("🔄 Redirectar /admin/roles -> /admin/users");
        return "redirect:/admin/users";
    }
}