package com.avitam.bankloanapplication.service.impl;


import com.avitam.bankloanapplication.mail.service.MailService;
import com.avitam.bankloanapplication.model.dto.ContactDto;
import com.avitam.bankloanapplication.model.entity.Customer;
import com.avitam.bankloanapplication.repository.CustomerRepository;
import com.avitam.bankloanapplication.service.ContactService;
import freemarker.template.Configuration;
import jakarta.mail.Authenticator;
import jakarta.mail.MessagingException;
import jakarta.mail.PasswordAuthentication;
import jakarta.mail.Session;
import jakarta.mail.internet.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.Objects;
import java.util.Properties;


@Service
public class ContactServiceImpl implements ContactService {

    @Value("${spring.mail.username}")
    String admin;
    @Autowired
    Configuration configuration;
    @Autowired
    Environment env;
    Logger logger = LoggerFactory.getLogger(MailService.class);
    @Autowired
    private JavaMailSenderImpl mailSender;
    @Autowired
    private CustomerRepository customerRepository;

    private Properties getServerProperties() {
        Properties properties = new Properties();
        properties.setProperty("mail.transport.protocol", env.getProperty("spring.transport.protocol"));
        properties.setProperty("mail.smtp.auth", env.getProperty("spring.smtp.auth"));
        properties.setProperty("mail.smtp.starttls.enable", env.getProperty("spring.smtp.starttls.enable"));
        properties.setProperty("mail.debug", env.getProperty("spring.mail.debug"));
        properties.setProperty("mail.smtp.ssl.enable", env.getProperty("spring.smtp.ssl.enable"));
        return properties;
    }

//
//    @Override
//    public void sendContactUsToAdmin(ContactDto contactDto) {
//        try {
//            MimeMessage mimeMessage = mailSender.createMimeMessage();
//            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//
//            Customer customer = customerRepository.findByRecordId(String.valueOf(contactDto.getCustomerId()));
//
//            String userMail = (customer.getEmail() == null || customer.getEmail().isEmpty())
//                    ? "no-reply@example.com" // fallback if no email
//                    : customer.getEmail();
//
//            helper.setFrom(admin);
//            helper.setReplyTo(userMail);
//            helper.setTo(admin);
//            helper.setSubject("Contact Us Message from " + customer.getName());
//
//            if (contactDto.getFile() != null && !contactDto.getFile().isEmpty()) {
//                File attachment = new File(contactDto.getFile());
//                if (attachment.exists()) {
//                    helper.addAttachment(attachment.getName(), attachment);
//                } else {
//                    logger.warn("Attachment file not found: {}", attachment.getAbsolutePath());
//                }
//            }
//
//            String body = "Message From User: " + customer.getName() + "\n" +
//                    "User Email: " + userMail + "\n\n" +
//                    "Message: " + contactDto.getMessage() + "\n" +
//                    "Description: " + contactDto.getDescription();
//
//            helper.setText(body, false); // plain text
//            mailSender.send(mimeMessage);
//
//        } catch (MessagingException e) {
//            logger.error("Failed to send contact email", e);
//            throw new RuntimeException("Failed to send email", e);
//        }
//    }


    @Override
    public void sendContactUsToAdmin(ContactDto contactDto) {
        try {
            if (mailSender == null) {
                throw new RuntimeException("Mail sender is not configured!");
            }

            Customer customer = customerRepository.findByRecordId(contactDto.getRecordId());
            if (customer == null) {
                throw new RuntimeException("Customer not found for ID: " + contactDto.getRecordId());
            }

            if (admin == null || admin.isEmpty()) {
                throw new RuntimeException("Admin email is not configured!");
            }

            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

            String userMail = (customer.getEmail() == null || customer.getEmail().isEmpty())
                    ? "no-reply@example.com" // fallback if no email
                    : customer.getEmail();

            helper.setFrom(admin);
            helper.setReplyTo(userMail);
            helper.setTo(admin);
            helper.setSubject("Contact Us Message from " + customer.getName());

            if (contactDto.getFile() != null && !contactDto.getFile().isEmpty()) {
                File attachment = new File(contactDto.getFile());
                if (attachment.exists()) {
                    helper.addAttachment(attachment.getName(), attachment);
                } else {
                    logger.warn("Attachment file not found: {}", attachment.getAbsolutePath());
                }
            }

            String body = "Message From User: " + customer.getName() + "\n" +
                    "User Email: " + userMail + "\n\n" +
                    "Message: " + contactDto.getMessage() + "\n" +
                    "Description: " + contactDto.getDescription();

            helper.setText(body, false); // plain text
            mailSender.send(mimeMessage);

            logger.info("Contact email sent successfully for customer ID: {}", contactDto.getRecordId());

        } catch (MessagingException e) {
            logger.error("Failed to send contact email due to MessagingException", e);
            throw new RuntimeException("Failed to send email", e);
        } catch (Exception e) {
            logger.error("Unexpected error while sending contact email", e);
            throw new RuntimeException("Unexpected error: " + e.getMessage(), e);
        }
    }


    private JavaMailSenderImpl getMailSender() {
        mailSender.setHost(env.getProperty("spring.mail.host"));
        mailSender.setPort(Integer.parseInt(Objects.requireNonNull(env.getProperty("spring.mail.port"))));
        mailSender.setUsername(env.getProperty("spring.mail.username"));
        mailSender.setPassword(env.getProperty("spring.mail.password"));
        Properties props = mailSender.getJavaMailProperties();
        props.putAll(getServerProperties());
        return mailSender;
    }


    private Session getSession() {
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", env.getProperty("spring.transport.protocol"));
        props.setProperty("mail.smtp.auth", env.getProperty("spring.smtp.auth"));
        props.setProperty("mail.smtp.starttls.enable", env.getProperty("spring.smtp.starttls.enable"));
        //props.setProperty("mail.smtp.ssl.enable", env.getProperty("spring.smtp.ssl.enable"));
        props.setProperty("mail.smtp.host", env.getProperty("spring.mail.host"));
        props.setProperty("mail.smtp.port", env.getProperty("spring.mail.port"));
        props.setProperty("mail.smtp.quitwait", "false");

        return Session.getDefaultInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(
                        env.getProperty("spring.mail.username"),
                        env.getProperty("spring.mail.password"));
            }
        });
    }


}