package ru.mcs.diary.common.service;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import java.util.Map;
@Slf4j
@Service
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender mailSender;
private final TemplateEngine templateEngine;
@Value("${app.mail.from}")
private String fromEmail;
@Value("${app.mail.base-url}")
private String baseUrl;
@Async
public void sendPasswordResetEmail(String to, String token, String userName) {
String resetLink = baseUrl + "/auth/reset-password?token=" + token;
Map<String, Object> variables = Map.of(
"userName", userName,
"resetLink", resetLink,
"expiryHours", 24
);
sendHtmlEmail(to, "Восстановление пароля — Teacher Diary", "email/password-reset", variables);
}
@Async
public void sendParentInviteEmail(String to, String token, String parentName, String teacherName) {
String inviteLink = baseUrl + "/auth/parent/invite?token=" + token;
Map<String, Object> variables = Map.of(
"parentName", parentName,
"teacherName", teacherName,
"inviteLink", inviteLink
);
sendHtmlEmail(to, "Приглашение в Teacher Diary", "email/parent-invite", variables);
}
@Async
public void sendLessonReportEmail(String to, String parentName, String childName,
String lessonDate, String topic, String grade) {
Map<String, Object> variables = Map.of(
"parentName", parentName,
"childName", childName,
"lessonDate", lessonDate,
"topic", topic != null ? topic : "Не указана",
"grade", grade != null ? grade : "Не выставлена",
"dashboardLink", baseUrl + "/parent/dashboard"
);
sendHtmlEmail(to, "Отчёт о занятии — " + childName, "email/lesson-report", variables);
}
private void sendHtmlEmail(String to, String subject, String templateName, Map<String, Object> variables) {
try {
Context context = new Context();
context.setVariables(variables);
String htmlContent = templateEngine.process(templateName, context);
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setFrom(fromEmail);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(htmlContent, true);
mailSender.send(message);
log.info("Email sent successfully to: {}", to);
} catch (MessagingException e) {
log.error("Failed to send email to: {}", to, e);
}
}
}