
import {
    JsonDB,
    Config
} from 'node-json-db';

import {
    default as ValidateSchema
} from 'validate'


var userDB = new JsonDB(new Config("datastore/database/userDB.json", true, true, '/'));

const userSchema = new ValidateSchema({
    username: {
        type: String,
        required: true,
        match: /^[a-zA-Z0-9\ \-\_]+$/,
        length: { min: 3, max: 32 },
        message: {
            type: '[username] must be of type String.',
            required: '[username] is required.',
            match: '[username] is invalid. Allowed characters: (a-z|A-Z|0-9| |-|_)',
            length: '[username] must consist of 3 to 32 characters.'
        }
    },
    firstName: {
        type: String,
        required: true,
        match: /^[a-zA-Z0-9\ \-\_]+$/,
        length: { min: 1, max: 32 },
        message: {
            type: '[firstName] must be of type String.',
            required: '[firstName] is required.',
            match: '[firstName] is invalid. Allowed characters: (a-z|A-Z|0-9| |-|_)',
            length: '[firstName] must consist of 1 to 32 characters.'
        }
    },
    lastName: {
        type: String,
        required: true,
        match: /^[a-zA-Z0-9\ \-\_]+$/,
        length: { min: 1, max: 32 },
        message: {
            type: '[lastName] must be of type String.',
            required: '[lastName] is required.',
            match: '[lastName] is invalid. Allowed characters: (a-z|A-Z|0-9| |-|_)',
            length: '[lastName] must consist of 1 to 32 characters.'
        }
    },
    emailAddress: {
        type: String,
        required: true,
        match: /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/,
        message: {
            type: '[emailAddress] must be of type String.',
            required: '[emailAddress] is required.',
            match: '[emailAddress] is invalid (e.g. admin@example.com).'
        }
    },
    enabled: {
        type: String,
        required: true,
        enum: [
            'true',
            'false'
        ],
        message: {
            type: '[enabled] must be of type String.',
            required: '[enabled] is required.',
            enum: '[enabled] must be one of [true|false].'
        }
    },
    permissions: {
        type: Array,
        required: true,
        elements: [{
            type: String
        }],
        message: {
            type: '[permissions] must be of type Array.',
            required: '[permissions] is required.',
            elements: '[permissions] elements must be of type String.'
        }
    }
})


export async function saveUser(sUserID, oUserData) {
    let dataErrorList = userSchema.validate(oUserData);

    dataErrorList = dataErrorList.map((configError) => {
        return configError.message;
    })

    if (dataErrorList.length > 0) {
        return {
            status: "error",
            errors: dataErrorList
        }
    }

    await userDB.push(`/${sUserID}`, oUserData);

    return {
        status: "ok"
    }
}

export async function getUser(userID) {
    let requestData = await userDB.getData(`/${userID}`);
    return {
        username: requestData.username,
        firstName: requestData.firstName,
        lastName: requestData.lastName,
        emailAddress: requestData.emailAddress
    };
}

export async function getAllUsers() {
    let userList = await userDB.getData(`/`);
    return userList.map((userData) => {
        return {
            username: userData.username,
            firstName: userData.firstName,
            lastName: userData.lastName,
            emailAddress: userData.emailAddress
        }
    })
}

export async function deleteUser(userID) {
    await userDB.delete(`/${userID}`);
}
