package de.oaa.xxx.registration;

import de.oaa.xxx.user.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * Koordiniert den Aktivierungsflow: liest die RegistrationEntity aus der DB
 * und delegiert die User-Anlage an den UserService.
 * Ersetzt den direkten Controller→Controller-Aufruf im ActivationController.
 */
@Service
public class RegistrationService {

    private static final Logger LOGGER = LoggerFactory.getLogger(RegistrationService.class);

    private final RegistrationRepository registrationRepository;
    private final UserService userService;

    public RegistrationService(RegistrationRepository registrationRepository, UserService userService) {
        this.registrationRepository = registrationRepository;
        this.userService = userService;
    }

    /**
     * Aktiviert eine Registrierung: legt den User an und markiert die Registration als aktiviert.
     *
     * @return E-Mail des aktivierten Users (für Redirect im Controller)
     * @throws IllegalArgumentException wenn UUID ungültig oder Registration nicht gefunden
     * @throws IllegalStateException    wenn Registration bereits aktiviert
     */
    public String activate(String token) {
        RegistrationEntity registration;
        try {
            UUID registrationId = UUID.fromString(token);
            registration = registrationRepository.findById(registrationId)
                    .orElseThrow(() -> new IllegalArgumentException("Registration nicht gefunden: " + token));
        } catch (IllegalArgumentException e) {
            // Kein UUID-Format → nach kurzem Aktivierungscode suchen
            registration = registrationRepository.findByActivationCode(token)
                    .orElseThrow(() -> new IllegalArgumentException("Aktivierungscode ungültig: " + token));
        }

        if (Boolean.TRUE.equals(registration.getActivated())) {
            throw new IllegalStateException("Registration bereits aktiviert");
        }

        userService.createUser(registration.toRegistration());

        registration.setActivated(Boolean.TRUE);
        registrationRepository.save(registration);

        LOGGER.info("Registration {} aktiviert, User {} angelegt", token, registration.getEmail());
        return registration.getEmail();
    }
}
