OrderHistoryController.java

package com.ctrlbuy.webshop.controller;

import com.ctrlbuy.webshop.model.Order;
import com.ctrlbuy.webshop.security.entity.User;
import com.ctrlbuy.webshop.service.OrderService;
import com.ctrlbuy.webshop.security.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.security.core.Authentication;
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.Optional;

@Controller
@RequestMapping("/orders")
@RequiredArgsConstructor
@Slf4j
public class OrderHistoryController {

    private final OrderService orderService;
    private final UserRepository userRepository;

    /**
     * Visa orderhistorik med paginering
     */
    @GetMapping
    public String viewOrderHistory(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size,
            Authentication authentication,
            Model model) {

        if (authentication == null) {
            return "redirect:/login";
        }

        Optional<User> userOpt = userRepository.findByUsername(authentication.getName());
        if (userOpt.isEmpty()) {
            log.error("Användare inte hittad: {}", authentication.getName());
            return "redirect:/login";
        }

        User user = userOpt.get();

        // Hämta orders med paginering
        Page<Order> orderPage = orderService.getOrdersByUserWithPagination(user, page, size);

        // Beräkna statistik
        Long totalOrders = orderService.countOrdersByUser(user);
        Double totalSpent = orderService.getTotalSpentByUser(user);
        Optional<Order> latestOrder = orderService.getLatestOrderByUser(user);

        model.addAttribute("orderPage", orderPage);
        model.addAttribute("currentPage", page);
        model.addAttribute("totalPages", orderPage.getTotalPages());
        model.addAttribute("totalOrders", totalOrders);
        model.addAttribute("totalSpent", totalSpent != null ? totalSpent : 0.0);
        model.addAttribute("latestOrder", latestOrder.orElse(null));
        model.addAttribute("user", user);

        log.info("Visar orderhistorik för användare: {} ({} orders)", user.getUsername(), totalOrders);
        return "order-history";
    }

    /**
     * Visa detaljer för specifik order
     */
    @GetMapping("/{orderId}")
    public String viewOrderDetails(
            @PathVariable Long orderId,
            Authentication authentication,
            Model model,
            RedirectAttributes redirectAttributes) {

        if (authentication == null) {
            return "redirect:/login";
        }

        Optional<User> userOpt = userRepository.findByUsername(authentication.getName());
        if (userOpt.isEmpty()) {
            return "redirect:/login";
        }

        User user = userOpt.get();
        Optional<Order> orderOpt = orderService.getOrderByIdAndUser(orderId, user);

        if (orderOpt.isEmpty()) {
            log.warn("Order {} inte hittad eller tillhör inte användare {}", orderId, user.getUsername());
            redirectAttributes.addFlashAttribute("error", "Order inte hittad eller tillhör inte dig.");
            return "redirect:/orders";
        }

        Order order = orderOpt.get();
        model.addAttribute("order", order);
        model.addAttribute("user", user);

        log.info("Visar orderdetaljer för order: {} (användare: {})", order.getOrderNumber(), user.getUsername());
        return "order-details";
    }

    /**
     * Sök order via ordernummer
     */
    @PostMapping("/search")
    public String searchOrder(
            @RequestParam String orderNumber,
            Authentication authentication,
            RedirectAttributes redirectAttributes) {

        if (authentication == null) {
            return "redirect:/login";
        }

        Optional<User> userOpt = userRepository.findByUsername(authentication.getName());
        if (userOpt.isEmpty()) {
            return "redirect:/login";
        }

        User user = userOpt.get();
        Optional<Order> orderOpt = orderService.getOrderByOrderNumberAndUser(orderNumber.trim(), user);

        if (orderOpt.isEmpty()) {
            log.warn("Order med nummer {} inte hittad för användare {}", orderNumber, user.getUsername());
            redirectAttributes.addFlashAttribute("error", "Order med nummer " + orderNumber + " inte hittad.");
            return "redirect:/orders";
        }

        log.info("Order hittad via sök: {} (användare: {})", orderNumber, user.getUsername());
        return "redirect:/orders/" + orderOpt.get().getId();
    }

    /**
     * Svenska rutt för orderhistorik
     */
    @GetMapping("/mina-ordrar")
    public String viewOrderHistorySwedish(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size,
            Authentication authentication,
            Model model) {
        return viewOrderHistory(page, size, authentication, model);
    }

    /**
     * Orderdetaljer via svensk rutt
     */
    @GetMapping("/mina-ordrar/{orderId}")
    public String viewOrderDetailsSwedish(
            @PathVariable Long orderId,
            Authentication authentication,
            Model model,
            RedirectAttributes redirectAttributes) {
        return viewOrderDetails(orderId, authentication, model, redirectAttributes);
    }
}