// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

const adminLogins = ['developers@cerc.co.uk','jon@agecon.com.au'];

//returns a list of all users, excluding admins
function listAllUsers() {
  // Would need to do more, if more than 1000 users were subscribed
  var allUsers = [];
  return admin.auth().listUsers()
    .then(function (listUsersResult) {
        listUsersResult.users.forEach(function (userRecord) {

            if (!adminLogins.includes(userRecord.email.toLowerCase())) {
                var userData = userRecord.toJSON();
                allUsers.push(userData);
            }
        });
        return allUsers;
    })
    .catch(function (error) {
        console.log("Error listing users:", error);
    });
}

function deleteByUID(uid) {
    return admin.auth().deleteUser(uid)
      .catch(function(error) {
            return error.errorInfo.message;
    });
}

function addNewUser(emailAddress, password) {

    return admin.auth().createUser({
      email: emailAddress,
      emailVerified: false,
      password: password,
      disabled: false
    })
        .then(function(userRecord) {
            // See the UserRecord reference doc for the contents of userRecord.
            return ("");
        })
        .catch(function(error) {
            return error.errorInfo.message;
        });
}

// On sign up.
exports.processSignUp = functions.auth.user().onCreate((user) => {
    // Check if user meets role criteria.
    if (user.email && adminLogins.includes(user.email.toLowerCase())) {
        const customClaims = {
            admin: true
        };
        // Set custom user claims on this newly created user.
        return admin.auth().setCustomUserClaims(user.uid, customClaims);
    }
});


exports.deleteUser = functions.https.onCall((data, context) => {
    if (context.auth.token.admin === true) {
        return deleteByUID(data.uid);
    } else {
        return "Unable to delete user, as not admin user";
    }
});


exports.listAllUsers = functions.https.onCall((data, context) => {
    if (context.auth.token.admin === true) {
        // List all users
        return listAllUsers();
    } else {
        return "";
    }
});

exports.addUser = functions.https.onCall((data, context) => {
        if (context.auth.token.admin === true) {
            // Allow access to requested admin resource.
            return addNewUser(data.emailAddress, data.userPassword);
        } else {
            return "Unable to add user, as not admin user";
        }
});

exports.isAdmin = functions.https.onCall((data, context) => {
        var admin=false;
        if (context.auth.token.admin===true) {
            admin = true;
        } 
        return admin
});