package org.egl_cepgl.pm.service;

import jakarta.mail.Message;
import jakarta.mail.Session;
import jakarta.mail.Transport;
import jakarta.mail.internet.AddressException;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.egl_cepgl.pm.dto.UserPasswordDto;
import org.egl_cepgl.pm.model.user.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.Properties;

@Slf4j
@Aspect
@Component
public class CustomMailSender
{
    @Value("${spring.mail.host}")
    private String emailhost;
    @Value("${spring.mail.port}")
    private Integer emailport;
    @Value("${spring.mail.username}")
    private String emailusername;
    @Value("${spring.mail.password}")
    private String emailpassword;
    @Value("${spring.mail.sender}")
    private String emailfrom;

    @AfterReturning(
        pointcut = "execution(* org.egl_cepgl.pm.service.*.*(..))",
        returning = "result"
    )
    @Async
    public void sendEmailAfterSuccess(JoinPoint joinPoint, Object result) {
        if (result instanceof UserPasswordDto user) {
            String sentTo= user.getUser().getEmail();
            String subject= "VOTRE MOT DE PASSE POUR ACCEDER A LA PLATEFORME DE GESTION DE DOSSIERS DE PASSATION DE MARCHES DE L'EGL";
            String message= "Monsieur "+user.getUser().getFirstname()+" "+user.getUser().getLastname()+
                    ",\n\nVous avez été enregistré sur la plateforme électronique de gestion de dossiers de passation de marchés de l'EGL. "+
                    "\nVotre mot de passe est: "+user.getPassword()+
                    "\nAdresse web d'accès: https://pm.egl-cepgl.org"+
                    "\nUne fois que vous étes connecté, vous pourriez modifier ce mot de passe, si vous le souhaitez"+
                    "\n\nCordialement,\nEGL";
            sendEmail(sentTo, subject, message);
        }
    }

    public void sendEmail(String to, String subject, String body) {
        // Manually configure SMTP properties
        Properties props = new Properties();
        props.put("mail.smtp.host", emailhost);
        props.put("mail.smtp.port", emailport); // Use the correct port for your server
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.ssl.enable", "true"); // Enable ssl

        // Manually get the mail session
        Session session = Session.getInstance(props, new jakarta.mail.Authenticator() {
            protected jakarta.mail.PasswordAuthentication getPasswordAuthentication() {
                return new jakarta.mail.PasswordAuthentication(emailusername, emailpassword);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(emailfrom));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            message.setSubject(subject);
            message.setText(body);

            // Manually send the message
            Transport.send(message);
            System.out.println("Email sent successfully!");

        } catch (AddressException e) {
            log.error(e.getMessage());
            e.printStackTrace();
        } catch (jakarta.mail.MessagingException e) {
            e.printStackTrace();
        }
    }
}
