const express = require('express');
const router = express.Router();

const nodemailer = require('nodemailer');

const { authenticate, authenticate_noerror, auth_default } = require('../middleware/authenticate');

const sendemail = require('../sendemail');
const tools = require('../tools/general');

const shared_consts = require('../tools/shared_nodejs');

const { User } = require('../models/user');
const { MsgTemplate } = require('../models/msg_template');
const ListaInvitiEmail = require('../models/listainvitiemail');

// ==========================================
// ENDPOINT API
// ==========================================

router.post('/getmsgtempl', authenticate, async (req, res) => {
  try {
    const { idTemplate, idapp } = req.body;

    // Validazione
    if (!idTemplate) {
      return res.status(400).json({
        success: false,
        message: 'idTemplate non presente',
      });
    }

    const myuser = req.user;

    const rismsg = await MsgTemplate.getMsgByLang(
      idapp,
      myuser,
      shared_consts.TypeMsgTemplate.MSG_INVITE_WHATSAPP,
      myuser.lang
    );

    if (rismsg) {
      return res.status(200).json({ success: true, rec: rismsg });
    } else {
      return res.status(200).json({ success: false, rec: null });
    }
  } catch (e) {
    return res.status(200).json({
      success: false,
      message: 'Errore ' + e.message,
    });
  }
});

router.post('/getinv', async (req, res) => {
  try {
    const { tok } = req.body;

    // Validazione
    if (!tok) {
      return res.status(400).json({
        success: false,
        message: 'token non presente',
      });
    }

    const invitoreg = await ListaInvitiEmail.findOne({ token: tok }).lean();

    if (invitoreg) {
      return res.status(200).json({ success: true, rec: invitoreg });
    } else {
      return res.status(200).json({ success: false, rec: null });
    }
  } catch (e) {
    return res.status(200).json({
      success: false,
      message: 'Errore ' + e.message,
    });
  }
});

/**
 * POST /inviti/invia-email
 * Invia un invito via email
 */
router.post('/invia-email', authenticate, async (req, res) => {
  try {
    const { emailAmico, messaggioPersonalizzato, usernameInvitante, idapp } = req.body;

    // Validazione
    if (!emailAmico) {
      return res.status(400).json({
        success: false,
        message: 'Email del destinatario è obbligatoria',
      });
    }

    // Validazione formato email
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(emailAmico)) {
      return res.status(400).json({
        success: false,
        message: 'Formato email non valido',
      });
    }

    const dati = { messaggioPersonalizzato, emailAmico, usernameInvitante };

    const userInvitante = await User.findOne({ idapp, username: usernameInvitante }, { username: 1 }).lean();

    const invitoesiste = await ListaInvitiEmail.findOne({ idapp, email: emailAmico });
    if (invitoesiste) {
      const dateInvito = new Date(invitoesiste.date_Invited);
      const dateNow = new Date();
      const diffTime = Math.abs(dateNow - dateInvito);
      const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24 * 7));

      if (diffDays > 1) {
        // Posso reinviare l'invito
        await ListaInvitiEmail.deleteOne({ _id: invitoesiste._id });
        invitoesiste = null;
      } else {
        return res.status(200).json({
          success: false,
          message: "L'invito a questa email è stato già inviato il " + tools.getstrDate_DD_MM_YYYY(dateInvito),
          emailInviata: false,
        });
      }
    }

    dati.token = tools.getTokenRandom();

    // aggiungi la email alla lista inviti
    const listainviti = new ListaInvitiEmail({
      idapp,
      email: emailAmico,
      usernameInvitante: userInvitante.username,
      userIdInvite: userInvitante._id,
      token: dati.token,
    });

    await listainviti.save();
  
    const ris = await sendemail.sendEmail_InvitaAmico('it', emailAmico, null, idapp, dati);

    if (ris) {
      // Risposta successo
      res.status(200).json({
        success: true,
        message: 'Invito inviato con successo',
        emailInviata: true,
      });
    } else {
      res.status(500).json({
        success: false,
        message: "Errore durante l'invio dell'invito",
        emailInviata: false,
      });
    }
  } catch (error) {
    console.error('Errore invio email invito:', error);

    res.status(500).json({
      success: false,
      message: "Errore durante l'invio dell'invito",
      emailInviata: false,
    });
  }
});

/**
 * GET /inviti/test-email
 * Endpoint di test per verificare la configurazione email
 */
router.get('/test-email', authenticate, async (req, res) => {
  try {
    await transporter.verify();
    res.json({
      success: true,
      message: 'Configurazione email corretta!',
    });
  } catch (error) {
    console.error('Errore configurazione email:', error);
    res.status(500).json({
      success: false,
      message: 'Errore nella configurazione email',
      error: error instanceof Error ? error.message : 'Errore sconosciuto',
    });
  }
});

module.exports = router;
