const express = require('express');
const cors = require('cors');
const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');
const { getMessaging } = require('firebase-admin/messaging')
const { getAuth } = require('firebase-admin/auth')

const serviceAccount = require('./firebase.json');

initializeApp({
    credential: cert(serviceAccount)
});
  
const db = getFirestore();

const app = express();

app.use(express.json());
app.use(cors({
	origin: '*',
}));

app.listen(7289, () => console.log('API is online!'));

app.get('/', (req, res) => {
    res.status(200).send({
        status: 'success',
    });
});

app.post('/checkrelatiecode', async (req, res) => {
    const { relatiecode, email } = req.body;

    if (!relatiecode) return res.status(400).send({ code: 'no-relatiecode'})
    if (!email) return res.status(400).send({ code: 'no-email'})

    try {
        const docRef = db.collection('ledenlijst').doc(relatiecode);
        const doc = await docRef.get();

        if (!doc.exists) return res.status(400).send({ code: 'incorrect'})

        const data = doc.data()

        if (data.email[0] === email || data.email[1] === email) {
            return res.status(200).send({ code: 'correct'})
        } else {
            return res.status(400).send({ code: 'incorrect'})
        }


    } catch (e) {
        return res.status(500).send({ code: 'error', error: e })
    }
})

app.post('/getrelatiecodes', async (req, res) => {
    const { email } = req.body;

    if (!email) return res.status(400).send({ code: 'no-email'})

    try {
        const ledenlijstRef = db.collection('ledenlijst')

        const snapshot = await ledenlijstRef.where("email", "array-contains", email).get()
        
        if (snapshot.empty) {
            res.status(400).send({ code: 'no-relatiecodes'})
            return;
        }

        let relatiecodes = [];
        let persons = [];

        snapshot.forEach(doc => {
            relatiecodes.push(doc.id)
            const data = doc.data()
            persons.push({ fullName: data.fullName, relatiecode: doc.id })
        });

        res.status(200).send({ code: 'success', relatiecodes: relatiecodes, persons: persons })


    } catch (e) {
        return res.status(500).send({ code: 'error', error: e })
    }
})

app.post('/subscribetotopic', async (req, res) => {
    const { topic, registrationToken } = req.body;

    if (!topic) return res.status(400).send({ code: 'no-topic'})
    if (!registrationToken) return res.status(400).send({ code: 'no-registrationToken'})

    try {
        getMessaging().subscribeToTopic([registrationToken], topic)
            .then((response) => {
                console.log('Successfully subscribed to topic:', response);

                res.status(200).send({ code: 'success' })
            })
            .catch((error) => {
                console.log('Error subscribing to topic:', error);

                return res.status(500).send({ code: 'error', error: error })
            });


    } catch (e) {
        return res.status(500).send({ code: 'error', error: e })
    }
})

app.post('/sendmessage', async (req, res) => {
    const { title, body, token } = req.body;

    if (!title) return res.status(400).send({ code: 'no-topic'})
    if (!body) return res.status(400).send({ code: 'no-registrationToken'})
    if (!token) return res.status(400).send({ code: 'no-token'})

    try {
        getAuth()
            .verifyIdToken(token)
            .then(async (decodedToken) => {
                const uid = decodedToken.uid;
                
                const docRef = db.collection('users').doc(uid);
                const doc = await docRef.get();

                if (!doc.exists) return res.status(400).send({ code: 'not-found'})

                const data = doc.data()

                if (!data.sendNews) return res.status(400).send({ code: 'no-permissions'})

                const message = {
                    notification: {
                        title: title,
                        body: body
                    },                    
                    topic: 'all',
                    apns: {
                        headers: {
                            'apns-push-type': 'alert'
                        }
                    }
                  };
                  

                getMessaging().send(message)
                    .then((response) => {
                        // Response is a message ID string.
                        console.log('Successfully sent message:', response);

                        res.status(200).send({ code: 'success', response: response })
                    })
                    .catch((error) => {
                        console.log('Error sending message:', error);

                        return res.status(500).send({ code: 'error', error: error })
                    });


            })
            .catch((error) => {
                console.log(error)

                return res.status(500).send({ code: 'error', error: error })
            });
      


    } catch (e) {
        return res.status(500).send({ code: 'error', error: e })
    }
})