package es.uv.saic.service;

import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.Queue;

import jakarta.mail.MessagingException;

import org.springframework.mail.MailSendException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import es.uv.saic.domain.Calendari;
import es.uv.saic.domain.Email;
import es.uv.saic.domain.InstanciaTasca;
import es.uv.saic.domain.Usuari;

@Service
public class EmailService {
	private JavaMailSender mailSender;
	private Queue<Email> pendingQueue  = new LinkedList<Email>();

    public EmailService(JavaMailSender javaMailSender) {
        this.mailSender = javaMailSender;
    }
    
    public boolean sendActiveTaskNext() {
    	if(!this.pendingQueue.isEmpty()) {
	    	Email e = this.getNextEmail();
	    	try {
	    		if(e.getInstanciaTasca() != null) {
	    			this.sendNewTaskMail(e.getUsusari(), e.getInstanciaTasca());
	    		}
	    		else {
	    			this.sendMail(e.getUsusari().getEmail(), e.getSubject(), e.getBody());
	    		}
			} 
	    	catch (MessagingException err) {
				err.printStackTrace();
			}
	    	catch (MailSendException err) {
	    		err.printStackTrace();
	    	}
	    	return true;
	    }
    	else {
    		return false;
    	}
    }
    
    public void addEmail(Email email) {
    	pendingQueue.add(email);
    }
    
    private Email getNextEmail() {
    	return this.pendingQueue.poll();
    }
    
    public Queue<Email> getPendingQueue() {
    	return this.pendingQueue;
    }
    
    public boolean pendingQueueIsEmpty() {
    	return this.pendingQueue.isEmpty();
    }

    public void sendMail(String to, String subject, String msg) throws MessagingException{

    	SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setTo(to);
        mailMessage.setSubject(subject);
        mailMessage.setText(msg);
        mailMessage.setFrom("saic@uv.es");

        mailSender.send(mailMessage);
    }
    
    public void sendNewTaskMail(Usuari u, InstanciaTasca it) throws MessagingException{
    	String subject = "Notificació de tasca a realitzar en SAIC";
    	String msg = "Estimat/da usuari/a:\n" + 
			    	"\n" + 
			    	"El Sistema d'Assegurament Intern de la Qualitat (SAIC) de la Universitat de València li informa que té vosté una tasca per realitzar\n" + 
			    	"\n" + 
			    	"Tasca: "+it.getTasca().getTitolVal()+"\n" + 
			    	"Procediment: "+it.getTasca().getProces().getTitolVal()+"\n" + 
			    	"Centre/Titulació: "+it.getInstancia().getOrgan().getOrgan().getNomVal()+" / "+it.getInstancia().getOrgan().getNomVal()+"\n" + 
			    	"Curs al qual s'aplica: "+Integer.toString(it.getInstancia().getProces().getCursAvaluat()-1) + "-" + Integer.toString(it.getInstancia().getProces().getCursAvaluat())+"\n" + 
			    	"\n" + 
			    	"Per a realitzar-la ha de connectar-se al SAIC i seguir els passos que allà es descriuen.\n" + 
			    	"\n" + 
			    	"Faça clic ací https://saic.uv.es per a accedir al Sistema d'Assegurament Intern de la Qualitat (SAIC).\n" + 
			    	"\n" + 
			    	"Per a consultes sobre procediments o la documentació que s'ha d'aportar, envie un correu a unitat.qualitat@uv.es\n" + 
			    	"Per a qualsevol consulta tècnica, envie un correu a saic@uv.es\n" + 
			    	"\n" + 
			    	"----------" +
			    	"\n" + 
			    	"Estimado/a usuario/a:\n" + 
			    	"\n" + 
			    	"El Sistema de Aseguramiento Interno de la Calidad (SAIC) de la Universitat de València le informa que tiene Vd. una tarea por realizar:\n" + 
			    	"\n" + 
			    	"Tarea: "+it.getTasca().getTitolCas()+"\n" + 
			    	"Procedimiento: "+it.getTasca().getProces().getTitolCas()+"\n" + 
			    	"Centro/Titulación: "+it.getInstancia().getOrgan().getOrgan().getNomCas()+" / "+it.getInstancia().getOrgan().getNomCas()+"\n" + 
			    	"Curso al que se aplica: "+Integer.toString(it.getInstancia().getProces().getCursAvaluat())+"\n" + 
			    	"\n" + 
			    	"Para realizarla debe Vd. conectarse al SAIC y seguir los pasos allí descritos.\n" + 
			    	"\n" + 
			    	"Pinche aquí https://saic.uv.es para acceder al Sistema de Aseguramiento Interno de la Calidad (SAIC).\n" + 
			    	"\n" + 
			    	"Para consultas sobre los procedimientos o la documentación a aportar, envíe un correo a unitat.qualitat@uv.es \n" +
    				"Para cualquier consulta técnica, envíe un correo a saic@uv.es\n";
    	this.sendMail(u.getEmail(), subject, msg);
    }
    
    public void sendCalendarMail(Usuari u, Calendari c) throws MessagingException{
    	String subject = "[SYS] Notificación de evento planificado en SAIC";
    	String msg = "Estimado/a administrador:\n" + 
			    	"\n" + 
			    	"El siguiente evento está planificado para hoy.\n" + 
			    	"\n" + 
			    	"Nombre: "+c.getTitolCas()+"\n" + 
			    	"ID Proceso: "+c.getIdProces().toString()+"\n" + 
			    	"Ámbito: "+c.getAmbit()+"\n" + 
			    	"Planificado para el día "+new SimpleDateFormat("dd/MM/yyyy").format(c.getData())+"\n"+
			    	"\n" + 
			    	"Acceda a https://saic.uv.es y realice las acciones pertinentes. \n" + 
			    	"\n";
    	this.sendMail(u.getEmail(), subject, msg);
    }
}
