// anmeld.js   rxf   2020-09-21
// Anmeldungen anzeigen und abhaken lassen
//

$(document).ready(() => {

    // Globale Konstanten und Variable
    //    const ajaxURL="php/anmeldDB.php";
    const ajaxURL = "../../DB4js_all.php";

    const maxVisitors = 25
    const months2add = 3
    let vorlauf = 24

    let oldtndata = ""


    // Von der Datenbank Werte abholen
    // Param:
    //      body: Object mit cmd und param
    // Return:
    //      angeforderte Daten als JSON
    const fetchFromDbase = async (body) => {
        const response = await fetch(ajaxURL, {
            method: 'POST',
            headers: { 'Content-Type': 'application/js' },
            body: JSON.stringify(body)
        });
        let rt = await response.json();
        return rt
    }


    // In die Datenbank Werte eintragen
    // Param:
    //      body: Object mit cmd und param
    // Return:
    //      angeforderte Daten als JSON
    const putToDbase = async (body) => {
        const response = await fetch(ajaxURL, {
            method: 'POST',
            headers: { 'Content-Type': 'application/js' },
            body: JSON.stringify(body)
        });
        return await response.json();
    }

    // Wochentag aus integer Datum extrahieren
    function getWochentag(datumInt) {
        const d = new Date(
            Math.floor(datumInt / 10000),            // Jahr
            Math.floor((datumInt % 10000) / 100) - 1, // Monat (0-basiert)
            datumInt % 100                            // Tag
        );
        return ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"][d.getDay()];
    }

    // Aus dem integer Führungsdatum (aus anmeldungen) den Wochentag und 
    // die Uhrzeit aus der Tabelle fdatum 1 holen
    const getFuhrzeit = async (dt, typ) => {
        return await fetchFromDbase({ cmd: 'GET_TIME_BY_DATE', dt: dt, typ: typ })

    }
    // Das Führungsdatum extrahieren
    const buildDatum = async (tn, short) => {
        const person = tn.anzahl === '1' ? 'Person' : 'Personen'
        const uhrzeit = await getFuhrzeit(tn.fdatum, tn.typ)
        if (short) {
            return `${moment(tn.fdatum).format('DD.MM.YYYY')}`
        }
        if(tn.typ === 'sonnen') {
            document.getElementById('fart').innerHTML = "Sonnenführung"
        }
        return `${getWochentag(tn.fdatum)}, den ${moment(tn.fdatum).format('DD.MM.YYYY')} um ${uhrzeit} mit ${tn.anzahl} ${person}`
    }

    // Das Führungsdatum anzeigen
    const showdiefuehrung = async (teiln) => {
        $('#anmeldung').text(await buildDatum(teiln, false))
        $('#anmeldid').show()
        $('#ausgetragen').hide()
        $('#umgebucht').hide()
        $('#lower_text').hide()
        $('#nixda').hide()

    }

    const austragen = async (teilnehmer) => {
        //        console.log("Austragen von ", teilnehmer)
        //        return
        oldtndata = { ...teilnehmer }
        let delstr = { cmd: 'DELETE_ENTRY', id: parseInt(teilnehmer.id) }
        const erg1 = await putToDbase(delstr)
        console.log("Storno Ergebnis: ", erg1)
        if (erg1) {
            $('#ausgetragen').show()
            $('#lower_text').show()
            sendEmail(teilnehmer, true)
        } else {
            alert("Probleme beim Stornieren\nBitte wenden Sie sich an anmeldung@sternwarte-welzheim.de")
        }
        $('#homebutton').show()
    }

    const umbuchen = async (teilnehmer) => {
        //        console.log('Umbuchen von ',teilnehmer)
        //        return
        oldtndata = { ...teilnehmer }
        let start = moment()
        start = start.add(vorlauf, 'h')
        let end = moment()
        let add = months2add
        if (teilnehmer.typ === 'sonnen') {
            add = 12
        }
        end = end.add(add, 'M')
        const anzahl = parseInt(teilnehmer.anzahl)
        let fuehrungen = await fetchFromDbase({ cmd: 'GET_FUEHRUNGEN', start: start.format('YYYYMMDD'), end: end.format('YYYYMMDD'), typ: teilnehmer.typ})
        let r = `<label for "ftermin" class="labeltext"><strong>Umbuchung auf</strong></label><br /><select name="ftermin" id="ftermin"><option>-- Bitte wählen Sie ein Datum aus--</option>`
        for (let f of fuehrungen) {
            if (f.datum == teilnehmer.fdatum) {
                continue
            }
            let count = await fetchFromDbase({ cmd: 'GET_COUNTS_DATE', date: f.datum })
            count = count ? parseInt(count) : 0
            if (count + anzahl >= maxVisitors) {
                continue                                                        // wenn der Platz nicht reicht, nicht anzeigen
            }
            r += `<option id=${f.id} value=${f.datum}>`
            r += `${getWochentag(f.datum).substring(0, 2)} , ${moment(f.datum).format('DD.MM.YYYY')} ${await getFuhrzeit(f.datum, teilnehmer.typ)}  `
            r += `Frei ${(maxVisitors - count) > 0 ? maxVisitors - count : 0}</option>`
        }
        r += '</select>'
        $('#umbuchung').html(r)
        //        $('#umgebucht').html('Bitte wählen Sie ein freies Datum über den kleine Pfeil rechts.')
        $('#umgebucht').show()

        // Eventhandler für Auswahl eines Datums über die SelectBox:
        // Anzeigen der Anmeldungen dazu
        $('#ftermin').change(async () => {
            const x = $('#ftermin').find(':selected');
            const date = x[0].value
            teilnehmer.fdatum = date
            teilnehmer.fid = x[0].id
            const update = { cmd: 'UPDATETLNFD', fdatum: date, fid: x[0].id, id: teilnehmer.id }
            const erg = await putToDbase(update)
            if (erg) {
                $('#umbuchung').hide()
                $('#umgebucht').html(`Sie wurden erfolgreich umgebucht auf <br /><br />${await buildDatum(teilnehmer, false)}`)
                $('#umgebucht').show()
                $('#anmeldid').hide()
                $('#anmeldung').show()
                $('#lower_text').show()
                sendEmail(teilnehmer, false)
            } else {
                alert("Probleme beim Umbuchen\nBitte wenden Sie sich an anmeldung@sternwarte-welzheim.de")
            }
            $('#homebutton').show()
        });
    }

    const aendern = async (teilnehmer) => {
        console.log('Ändern von ', teilnehmer)
        let count = await fetchFromDbase({ cmd: 'GET_COUNTS_DATE', date: teilnehmer.fdatum })
        let anzahl = parseInt(teilnehmer.anzahl)
        let max = anzahl
        if (count < maxVisitors) {
            max = maxVisitors - (count - anzahl)
        }
        if (max > 10) {
            max = 10
        }
        console.log("Max: ", max)
        $('#maxanzahl').text(`max. ${max}`)
        $('#personen').attr({ max: max, min: 1, step: 1, value: anzahl })

        // Evelthandler Übernehmen geklicked
        $('#bsave').click(async () => {
            $('#save').hide()
            teilnehmer.anzahl = $('#personen').val()
            let e = await putToDbase({ cmd: 'UPDATE_TLN', data: teilnehmer, id: teilnehmer.id })
            $('#newperson').html(`Sie sind nun mit <strong>${teilnehmer.anzahl} </strong> Personen angemeldet.`)
            $('#bsave').hide()
            $('#newperson').show()
            $('#homebutton').show()

        })

    }


    // Emailadresse eingegeben
    const setEvent = (f) => {
        $(document).on("keypress", "input", async function (e) {
            if (e.which === 13) {
                let inputVal = $(this).val();
                console.log(`Input Return: ${inputVal}`)
                // check die eingegebene email
                let idx = f.findIndex((obj) => obj.email.toLowerCase() === inputVal.toLowerCase())
                if (idx === -1) {                           // nicht gefunden
                    $('#anmeldid').hide()
                    $('#nixda').show()
                    $('#ausgetragen').hide()
                    $('#umgebucht').hide()
                    return
                }
                showdiefuehrung(f[idx], true)
                // Eintrag in der DB löschen
                $('#stornieren').click(() => {
                    austragen(f[idx])
                    $('#anmeldid').hide()
                })
                // Abbrechen geklicked
                $('#abbrechen').click(() => {
                    $('#anmeldid').hide()
                    $('#email').val("")
                })
                // Umbuchen geklicked
                $('#umbuchen').click(() => {
                    umbuchen(f[idx])
                    $('#anmeldid').hide()
                    //                    $('#email').val("")
                })
                // Ändern geklicked
                $('#aendern').click(() => {
                    aendern(f[idx])
                    $('#butgroup').hide()
                    $('#aenderung').show()
                    //                    $('#anmeldid').hide()
                    //                    $('#email').val("")
                })
            }
        })
    }

    // Bestätigungs-Email senden
    sendEmail = async (tln, storno) => {
        let fdatum = await buildDatum(tln, false)
        let oldfdatum = await buildDatum(oldtndata, true)
        let subject = `${storno ? "Stornierung" : "Umbuchung"} der Führung vom ${oldfdatum} auf der Sternwarte Welzheim`
        let body_txt = `
Sehr geehrte Dame, sehr geehrter Herr,

    hiermit bestätigen wir die ${storno ? 'Stornierung' : 'Umbuchung'} Ihrer Führung auf der Sternwarte Welzheim vom`
        if (!storno) {
            body_txt += `  ${oldfdatum}.    
    
    Sie wurden umgebucht auf:
    
            ${fdatum}           
                        
    Die Führung findet NUR bei sternklarem Himmel statt. Falls der Himmel bedeckt ist 
    und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn 
    eine Email. Sie können sich dann gerne zu einer anderen Führung neu anmelden.
    
    Sollten Sie Fragen haben senden Sie bitte eine Email an anmeldung@sternwarte-welzheim.de.
`} else {
            body_txt += `
            
            ${fdatum}.
            `
        }
        body_txt += `
Mit freundlichen Grüßen
    Beobachterteam der Sternwarte Welzheim
    www.sternwarte-welzheim.de
`
        let erg = await putToDbase({ cmd: 'SEND_MAIL_HTML', subject: subject, to: [tln.email], body_txt: body_txt, body_html: "" })
        console.log("Antwort von sendmail_1: ", erg)

        body_txt = `Die Führung vom ${oldfdatum} wurde ${storno ? 'storniert' : 'umgebucht'}
        `
        if (!storno) {
            body_txt += ` 
auf ${fdatum}`
        }
        body_txt += `

Besucher:   ${tln.name} ${tln.vorname}`

        body_html = `Die Führung vom ${oldfdatum} wurde ${storno ? 'storniert' : 'umgebucht'}`
        if (!storno) {
            body_html += ` auf ${fdatum}<br />`
        }
        body_html += `<br />Besucher:   ${tln.name} ${tln.vorname}`

        erg = await putToDbase({ cmd: 'SEND_MAIL_HTML', subject: subject, to: ['rexfue@gmail.com'], body_txt: body_txt, body_html: body_html })
        console.log("Antwort von sendmail_2: ", erg)
    }


    // *****************************************
    // main
    // *****************************************

    // Hier gehts los:
    // Von der Datenbank die nächsten 'n' Führungsdaten holen
    // und anzeigen
    // Params:
    //      n -> Anzahl der zu holnden Daten
    async function main() {
        console.log("Running...")
        $('.lastchange').text(`Letzte Änderungen: ${VDATE} rxf`)
        $('#anmeldid').hide()
        $('#nixda').hide()
        $('#ausgetragen').hide()
        $('#umgebucht').hide()
        $('#lower_text').hide()
        $('#aenderung').hide()
        $('#email').val('')
        $('#versn').html("Version: " + VERSION + ' vom ' + VDATE);
        let fdatum = moment().format('YYYYMMDD')
        // alle Anmeldungen ab fdatum in ein Array holen
        let fuehrungen = await fetchFromDbase({ cmd: 'GET_ALLTEILN', fdatum: fdatum })
        setEvent(fuehrungen)
    }


    main().catch(console.error);

});
