RegisterController.java

package com.ctrlbuy.webshop.controller;

import com.ctrlbuy.webshop.dto.RegisterRequest;
import com.ctrlbuy.webshop.dto.RegistrationResult;
import com.ctrlbuy.webshop.service.EmailService;
import com.ctrlbuy.webshop.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import jakarta.validation.Valid;

@Controller
@RequiredArgsConstructor
@Slf4j
public class RegisterController {

    private final UserService userService;
    private final EmailService emailService;

    @GetMapping("/register")
    public String showRegisterForm(Model model) {
        model.addAttribute("registerRequest", new RegisterRequest());
        return "register";
    }

    @PostMapping("/register")
    public String registerUser(@Valid @ModelAttribute RegisterRequest registerRequest,
                               BindingResult bindingResult,
                               Model model,
                               RedirectAttributes redirectAttributes) {

        log.info("🚀 Registreringsförsök för anvĂ€ndare: {}", registerRequest.getUsername());

        // 🔧 TRIMMA FÄLT INNAN VALIDERING
        registerRequest.trimAllFields();
        registerRequest.normalizeEmail();

        // Kontrollera om nÄgra kritiska fÀlt Àr null EFTER trimning
        if (registerRequest.getUsername() == null || registerRequest.getUsername().isEmpty()) {
            bindingResult.rejectValue("username", "username.required", "AnvÀndarnamn Àr obligatoriskt");
        }

        if (registerRequest.getEmail() == null || registerRequest.getEmail().isEmpty()) {
            bindingResult.rejectValue("email", "email.required", "E-post Àr obligatorisk");
        }

        // Kör egen validering
        validateRegistration(registerRequest, bindingResult);

        if (bindingResult.hasErrors()) {
            log.warn("⚠ Valideringsfel vid registrering för: {}", registerRequest.getUsername());
            bindingResult.getAllErrors().forEach(error -> {
                log.debug("Valideringsfel: {}", error.getDefaultMessage());
            });
            return "register";
        }

        try {
            log.info("✅ Validering OK, försöker registrera anvĂ€ndare: {}", registerRequest.getUsername());

            // ✅ ANVÄND ENKEL REGISTRERING UTAN EMAIL-VERIFIERING
            RegistrationResult registrationResult = userService.registerUser(registerRequest);

            if (registrationResult.isSuccess()) {
                log.info("🎉 Registrering lyckades för anvĂ€ndare: {}", registerRequest.getUsername());

                // ✅ ANVÄNDAREN KAN LOGGA IN DIREKT - INGEN EMAIL KRÄVS
                redirectAttributes.addFlashAttribute("success",
                        "Registrering lyckades! Du kan nu logga in direkt med ditt anvÀndarnamn och lösenord.");

                return "redirect:/login";
            } else {
                log.warn("❌ Registrering misslyckades för anvĂ€ndare: {} - {}",
                        registerRequest.getUsername(), registrationResult.getMessage());
                model.addAttribute("error", registrationResult.getMessage());
                return "register";
            }

        } catch (RuntimeException e) {
            log.error("❌ RuntimeException vid registrering för anvĂ€ndare: {}",
                    registerRequest.getUsername(), e);
            model.addAttribute("error", "Registreringsfel: " + e.getMessage());
            return "register";
        } catch (Exception e) {
            log.error("❌ OvĂ€ntat fel vid registrering för anvĂ€ndare: {}",
                    registerRequest.getUsername(), e);
            model.addAttribute("error", "Ett ovÀntat fel intrÀffade. Försök igen senare.");
            return "register";
        }
    }

    /**
     * Validerar registreringsdata
     */
    private void validateRegistration(RegisterRequest registerRequest, BindingResult bindingResult) {
        // Validera lösenordsmatchning
        if (registerRequest.getPassword() != null && registerRequest.getConfirmPassword() != null) {
            if (!registerRequest.getPassword().equals(registerRequest.getConfirmPassword())) {
                bindingResult.rejectValue("confirmPassword", "password.mismatch",
                        "Lösenorden matchar inte. Kontrollera att du har skrivit samma lösenord i bÄda fÀlten.");
            }
        }

        // Kontrollera om anvÀndarnamn redan finns
        if (registerRequest.getUsername() != null &&
                userService.existsByUsernameIncludingInactive(registerRequest.getUsername())) {
            bindingResult.rejectValue("username", "username.exists",
                    "Detta anvÀndarnamn Àr redan upptaget. VÀlj ett annat anvÀndarnamn.");
        }

        // Kontrollera om e-post redan finns
        if (registerRequest.getEmail() != null &&
                userService.existsByEmailIncludingInactive(registerRequest.getEmail())) {
            bindingResult.rejectValue("email", "email.exists",
                    "Denna e-postadress Àr redan registrerad. Om du har glömt ditt lösenord kan du ÄterstÀlla det hÀr.");
        }
    }

    @GetMapping("/verify-email")
    public String verifyEmail(@RequestParam("token") String token, Model model) {
        // ✅ EMAIL-VERIFIERING DISABLED - VISA MEDDELANDE
        model.addAttribute("message", "Email-verifiering Àr för nÀrvarande inaktiverad. Alla nya konton aktiveras automatiskt.");
        model.addAttribute("messageType", "info");
        model.addAttribute("showLoginButton", true);
        return "verification-result";
    }

    @GetMapping("/resend-verification")
    public String showResendForm(Model model) {
        // ✅ EMAIL-VERIFIERING DISABLED - VISA MEDDELANDE
        model.addAttribute("title", "Email-verifiering inaktiverad");
        model.addAttribute("message", "Email-verifiering Àr för nÀrvarande inaktiverad. Alla nya konton aktiveras automatiskt vid registrering.");
        model.addAttribute("messageType", "info");
        return "resend-verification";
    }

    @PostMapping("/resend-verification")
    public String resendVerification(@RequestParam("email") String email, Model model) {
        // ✅ EMAIL-VERIFIERING DISABLED - VISA MEDDELANDE
        model.addAttribute("message", "Email-verifiering Àr för nÀrvarande inaktiverad. Alla nya konton aktiveras automatiskt vid registrering.");
        model.addAttribute("messageType", "info");
        return "resend-verification";
    }

    /**
     * API-endpoint för att kontrollera om anvÀndarnamn Àr tillgÀngligt
     */
    @GetMapping("/api/check-username")
    @ResponseBody
    public boolean checkUsernameAvailability(@RequestParam("username") String username) {
        if (username == null || username.trim().length() < 3) {
            return false;
        }
        return !userService.existsByUsernameIncludingInactive(username.trim());
    }

    /**
     * API-endpoint för att kontrollera om e-post Àr tillgÀnglig
     */
    @GetMapping("/api/check-email")
    @ResponseBody
    public boolean checkEmailAvailability(@RequestParam("email") String email) {
        if (email == null || email.trim().isEmpty() || !email.matches("^[A-Za-z0-9+_.-]+@(.+)$")) {
            return false;
        }
        return !userService.existsByEmailIncludingInactive(email.trim());
    }
}