/*
chekcSofue.js

Checked per cron jeden Tag die SOFUE - Datenbank. Prüft, ob 'gestern' eine
Führung hätte stattfinden sollen. Wenn ja, wird der BEO der Führung per mail
benachrichtigt mit der Bitte, die Nachbearbeitungs-Webseite auszufüllen.



TODO
Dieses Programm kann auch die Überwachung machen, dass Einträge in der DB gelöscht werden:
- abgesagte: sofort nach Absage
- stattgefundene: nach 6 Monaten, hier nur die persönl. Daten löschen
- Aber Statistik-Daten behalten: Anzahl der Anfragen, davon zugesagt, davon abgesagt


Versions:
V 1.0.2 2026-03-01  rxf
    - Mehrere Führungen am gleichen Tag werden nun alle verarbeitet (je eine E-Mail pro Eintrag).

V 1.0.1 2025-11-17  rxf
    - Übergabe der Tage bis zu 'gestern' als Commandline Parameter: '-d x'. Ohne -d wird 1 angesetzt.
    
V 1.0.0 2025-11-15  rxf
    - Mit Tricks kann das nun DOCH realisiert werden:
        Auf externem Rechner (z.Zt. 'strato_1'; Miet-Server von rxf) wird der cron angestoßen,
        der das Programm hier (checkfuehrung.js) auf dem Sternwartemserver aufruft.
        Das zugehörige 'beoanswer' ist eine Webseute, die auch hier auf dem Sternwarte-Server 
        gehostet ist.

V 0.0   2019-02-04  rxf
    - Start
*/
"use strict"

const DEVELOP=1;                                            // 1 -> Entwicklung  0-> Produktion

const moment = require('moment');
const axios = require('axios');
const mysql = require('mysql2/promise');
const nodemailer = require('nodemailer');

const beo_Url = 'beoanswer/?id=';
const Url =         DEVELOP ? 'http://localhost:8081/' : 'https://sternwarte-welzheim.de/';
const DB_host =     DEVELOP ? 'localhost' : 'localhost';
const DB_port =     DEVELOP ? 3306 : 3306;
const DB_user =     DEVELOP ? 'root' : 'admin_310927';
const DB_pass =     DEVELOP ? 'SFluorit' : '5D5u49cKNFqf';
const DB_dbase =    DEVELOP ? 'sternwarte' : 'db310927';

const transporter = DEVELOP ? nodemailer.createTransport({
    host: 'localhost',
    port: 1025,
    secure: false, // true for 465, false for other ports
}) : nodemailer.createTransport({
	sendmail: true
//    host: 'smtp.1und1.de',
//   port: 587,
//    secure: false, // true for 465, false for other ports
//    auth: {
//        user: 'rxf@fuerst-stuttgart.de', // generated ethereal user
//        pass: 'tibTop-xopqar-1qyrqe'  // generated ethereal password
//    }
});


// Daten aus der DB holen und für jeden Eintrag eine E-Mail senden
async function fetchDatafromDB(conn, termin) {
    try {
        const query = "select mitarbeiter,id from SoFue2 where DATE(wtermin) = '" + termin + "' and status = 2";
        const [rows] = await conn.query(query);

        if (rows.length === 0) {
            console.log("Keine Führung gewesen");
            return;
        }

        console.log(`${rows.length} Führung(en) gefunden für ${termin}`);

        for (const row of rows) {
            const ma = row.mitarbeiter;
            const id = row.id;
            const beoQuery = "select vorname,email_1 from beos where name = '" + ma + "'";
            const [beoRows] = await conn.query(beoQuery);

            if (beoRows.length === 0) {
                console.log(`Kein BEO-Eintrag gefunden für Mitarbeiter: ${ma} (id=${id})`);
                continue;
            }

            send2BEO({
                name:  beoRows[0].vorname,
                email: (beoRows[0].email_1).toLowerCase(),
                date:  termin,
                id:    id
            });
        }
    }
    catch (err) {
        console.log(err);
    }
    finally {
        conn.end();
    }
}


function send2BEO(info) {
    var mailOptions = {
        from: 'noreply@sternwarte-welzheim.de',
        to: info.email, 
        cc: 'rexfue@gmail.com',
        subject: 'Sonderführung vom '+info.date,
        text: 'Hallo ' + info.name + ',\n\n'
            + 'du hattest gestern Führung! '
            + 'Bitte fülle folgendes Webformular aus:\n\n'
            + Url + beo_Url + info.id
            + '\n\nBitte nur über diesen Link zugreifen (oder exakt abschreiben),\n'
            + 'da sonst die Zuordnung nicht hergestellt werden kann.\n\n'
            + 'Besten Dank.\n\nGrüße vom Sonderführungsteam'
    };

    transporter.sendMail(mailOptions, function (error, info) {
        if (error) {
            console.log(error);
        } else {
            console.log('Email gesendet an ' + mailOptions.to);
//            console.log(info);
        }
    });
}

async function main() {
//    console.log(DB_host, DB_port, DB_user, DB_pass, DB_dbase);
      console.log('Start: ' + moment().format('YYYY-MM-DD HH:mm'))	
    const connection = await mysql.createConnection(DEVELOP ? {
        host: DB_host,
        port: DB_port,
        user: DB_user,
        password: DB_pass,
        database: DB_dbase,
    } : {
        user: DB_user,
        password: DB_pass,
        database: DB_dbase,
        socketPath: '/var/lib/mysql/mysql.sock'
    });
    const yesterday = moment().subtract(DAYS, 'd').format('YYYY-MM-DD');
    console.log('Yesterday:', yesterday)
    await fetchDatafromDB(connection, yesterday);
    console.log("All done");
}

const argv = require('minimist')(process.argv.slice(2));

const DAYS = argv.d || 1;

main().catch(console.error);
