package com.example.dateplanner.services;

import com.example.dateplanner.models.entities.AppUser;
import com.example.dateplanner.models.enums.Role;
import com.example.dateplanner.repositories.AppUserRepository;
import com.example.dateplanner.utils.PasswordGenerator;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

import java.time.LocalDateTime;

@Slf4j
@Service
@RequiredArgsConstructor
public class RegistrationService {

    private final AppUserRepository userRepository;
    private final PasswordEncoder passwordEncoder;
    private final EmailService emailService;

    public Mono<Void> register(String email) {
        return userRepository.findByPhone(email)
                .flatMap(existing -> Mono.<Void>error(
                        new IllegalArgumentException("Этот email уже зарегистрирован")))
                .switchIfEmpty(Mono.defer(() -> createUser(email)));
    }

    private Mono<Void> createUser(String email) {
        String rawPassword = PasswordGenerator.generatePassword(10, PasswordGenerator.Complexity.MEDIUM);

        AppUser user = new AppUser();
        user.setPhone(email);
        user.setPassword(passwordEncoder.encode(rawPassword));
        user.setFirstName("");
        user.setLastName("");
        user.setRole(Role.USER);
        user.setEnabled(true);
        user.setCreatedAt(LocalDateTime.now());
        user.setUpdatedAt(LocalDateTime.now());

        return userRepository.save(user)
                .flatMap(saved -> {
                    log.info("Зарегистрирован новый пользователь: {}", email);
                    return emailService.send(email, "Регистрация на TennisHub", buildWelcomeEmail(email, rawPassword));
                })
                .onErrorResume(e -> {
                    log.error("Ошибка при отправке письма на {}: {}", email, e.getMessage());
                    return userRepository.findByPhone(email)
                            .flatMap(userRepository::delete)
                            .then(Mono.error(new IllegalStateException("Не удалось отправить письмо. Проверьте адрес почты.")));
                })
                .then();
    }

    private String buildWelcomeEmail(String email, String password) {
        return "<!DOCTYPE html>" +
                "<html><head><meta charset='utf-8'>" +
                "<title>Добро пожаловать на TennisHub</title></head>" +
                "<body style='margin:0;padding:0;background:#f4f4f4;font-family:Arial,sans-serif;'>" +
                "<div style='max-width:600px;margin:30px auto;background:#fff;border-radius:10px;overflow:hidden;box-shadow:0 4px 12px rgba(0,0,0,0.1);'>" +

                "  <div style='background:#2c3e50;padding:30px;text-align:center;'>" +
                "    <span style='font-size:2rem;font-weight:800;'>" +
                "      <span style='color:#2ecc71;'>Tennis</span><span style='color:#fff;'>Hub</span>" +
                "    </span>" +
                "  </div>" +

                "  <div style='padding:35px 40px;'>" +
                "    <h2 style='color:#2c3e50;margin-top:0;'>Добро пожаловать!</h2>" +
                "    <p style='color:#555;line-height:1.6;'>Вы успешно зарегистрировались на платформе TennisHub." +
                "       Ниже ваши данные для входа:</p>" +

                "    <div style='background:#f8f9fa;border-left:4px solid #2ecc71;border-radius:4px;padding:20px 25px;margin:25px 0;'>" +
                "      <p style='margin:0 0 10px;color:#333;'><strong>Логин (email):</strong> " + email + "</p>" +
                "      <p style='margin:0;color:#333;'><strong>Пароль:</strong> " + password + "</p>" +
                "    </div>" +

                "    <p style='color:#555;line-height:1.6;'>Рекомендуем сменить пароль после первого входа.</p>" +

                "    <div style='background:#fff8e1;border-left:4px solid #e67e22;border-radius:4px;padding:15px 20px;margin-top:20px;'>" +
                "      <p style='margin:0;color:#555;font-size:13px;'>" +
                "        <strong>Обратите внимание:</strong> не отвечайте на это письмо." +
                "      </p>" +
                "    </div>" +
                "  </div>" +

                "  <div style='background:#f4f4f4;padding:15px;text-align:center;color:#999;font-size:12px;'>" +
                "    © " + java.time.Year.now().getValue() + " TennisHub. Все права защищены." +
                "  </div>" +
                "</div></body></html>";
    }
}
