/*
    Creates a entry in tbl_NotificationTransaction
    // Todo : update this to be configurable
*/
function commonInsert(query, data, dbConfig, cb) {
    var dataValues = utils.JSON2ARRAY(data);
    var fieldValues = dataValues.splice(0, 1)[0];
    query.insert.field = fieldValues;
    query.insert.fValue = dataValues;
    var queryRequestData = {
        query: query,
        dbConfig: dbConfig
    };
    debug('query insert config: ' + JSON.stringify(queryRequestData));
    queryExecutor.executeQuery(queryRequestData, function(data) {
        cb(data);
    });
}
/*
    Inserts an email notification
*/
function insertMailNotification(data, mnStatus, userTableConfig, dbConfig, cb) {
    var query = {
        table: userTableConfig.mailNotificationTableName,
        insert: {
            field: userTableConfig.mailNotificationTableFieldArray,
            fValue: [data.mailfrom, data.mailto, data.mailsubject, data.mailhtml, mnStatus, data.notificationid]
        }
    };
    var requestData = {
        query: query,
        dbConfig: dbConfig
    };
    queryExecutor.executeQuery(requestData, function(data) {
        // data = correctResponse(data);
        cb(data);
    });
}
/*
    Inserts a push notification
*/
function insertPushNotification(data, userTableConfig, dbConfig, cb) {
    var query = {
        table: userTableConfig.pushNotificationTableName,
        insert: {
            field: userTableConfig.pushNotificationTableFieldArray,
            fValue: data
        }
    };
    var requestData = {
        query: query,
        dbConfig: dbConfig
    };
    queryExecutor.executeQuery(requestData, function(data) {
        // data = correctResponse(data);
        cb(data);
    });
}
/*
    Inserts an inapp notification
*/
function insertInappNotification(data, inStatus, userTableConfig, dbConfig, cb) {
    var query = {
        table: userTableConfig.inAppNotificationTableName,
        insert: {
            field: userTableConfig.inAppNotificationTableFieldArray,
            fValue: [data.userId, data.html, inStatus, data.notificationid]
        }
    };
    var requestData = {
        query: query,
        dbConfig: dbConfig
    };
    queryExecutor.executeQuery(requestData, function(data) {
        // data = correctResponse(data);
        cb(data);
    });
}
/*
    Gets notification master id, by table lookup in notification master by notification code
*/
function getNotificationMasterId(code, dbConfig, cb) {
    var query = constant.queries.nmGetIdQuery;
    query.filter.value = code;
    var getIdRequestData = {
        query: query,
        dbConfig: dbConfig
    };
    queryExecutor.executeQuery(getIdRequestData, function(data) {
        debug('getNotificationMasterId response: %s', JSON.stringify(data));
        if (data.status == true) {
            cb({
                status: true,
                content: data.content
            });
        } else {
            cb({
                status: false,
                content: data.error
            });
        }
    });
}
/*
    Updates notification transaction status
*/
function updateNotificationStatus(processStatus, pkId, userTableConfig, dbConfig, cb) {
    var udpateStatus = {
        table: userTableConfig.notificationTransactionTableName,
        update: [{
            field: userTableConfig.processedKeynotificationTransaction,
            fValue: '' + processStatus + ''
        }],
        filter: {
            AND: [{
                field: userTableConfig.primaryKeyNotificationTransaction,
                operator: 'EQ',
                value: '' + pkId + ''
            }]
        }
    };
    var updateRequestData = {
        query: udpateStatus,
        dbConfig: dbConfig
    };
    queryExecutor.executeQuery(updateRequestData, function(data) {
        // data = correctResponse(data);
        cb(data);
    });
}
/*
    Gets user details for specified userArray
*/
function getUserDetails(userArray, userTableConfig, dbConfig, cb) {
    var jsonQuery = {
        join: {
            table: userTableConfig.userTableName,
            alias: userTableConfig.userTableAlias,
            joinwith: [{
                type: 'LEFT',
                table: userTableConfig.userMappingTableName,
                alias: userTableConfig.userMappingTableAlias,
                joincondition: {
                    table: userTableConfig.userTableAlias,
                    field: userTableConfig.primaryKeyNameUserTable,
                    operator: 'eq',
                    value: {
                        table: userTableConfig.userMappingTableAlias,
                        field: userTableConfig.userIDKeyNameUserMapping
                    }
                }
            }]
        },
        select: [{
            table: userTableConfig.userTableAlias,
            field: userTableConfig.primaryKeyNameUserTable
        }, {
            table: userTableConfig.userTableAlias,
            field: userTableConfig.emailKeyNameUserTable
        }, {
            table: userTableConfig.userTableAlias,
            field: userTableConfig.mobileKeyNameUserTable
        }, {
            table: userTableConfig.userTableAlias,
            field: userTableConfig.firstNameUserTable
        }, {
            table: userTableConfig.userTableAlias,
            field: userTableConfig.lastNameUserTable
        }, {
            table: userTableConfig.userMappingTableAlias,
            field: userTableConfig.playerIDKeyNameUserMapping,
        }],
        filter: {
            AND: [{
                table: userTableConfig.userTableAlias,
                field: userTableConfig.emailKeyNameUserTable,
                operator: 'EQ',
                value: userArray
            }]
        }
    };

    var requestData = {
        query: jsonQuery,
        dbConfig: dbConfig
    };

    debug('getUserDetails notificationJson: %s', JSON.stringify(jsonQuery));
    debug('getUserDetails dbConfig: %s', JSON.stringify(dbConfig));
    debug('getUserDetails requestData: %s', JSON.stringify(requestData));

    queryExecutor.executeQuery(requestData, function(data) {
        debug('getUserDetails executeQuery: %s', JSON.stringify(data));
        cb(data);
    });
}
/*
    Gets notification transaction by id
    // Todo : update this to be configurable
*/
function getNotificationTransactionByID(id, dbConfig, cb) {
    var notificationJson = {
        join: {
            table: 'tbl_NotificationMaster',
            alias: 'NTM',
            joinwith: [{
                table: 'tbl_NotificationTransaction',
                alias: 'NTT',
                joincondition: {
                    table: 'NTM',
                    field: 'pk_id',
                    operator: 'eq',
                    value: {
                        table: 'NTT',
                        field: 'NT_fk_NM_id'
                    }
                }
            }]
        },
        select: [{
            table: 'NTM',
            field: 'NM_code'
        }, {
            table: 'NTM',
            field: 'NM_name'
        }, {
            table: 'NTM',
            field: 'NM_sms_template'
        }, {
            table: 'NTM',
            field: 'NM_email_template'
        }, {
            table: 'NTM',
            field: 'NM_inapp_template'
        }, {
            table: 'NTM',
            field: 'NM_push_template'
        }, {
            table: 'NTM',
            field: 'NM_subject'
        }, {
            table: 'NTT',
            field: 'pk_id'
        }, {
            table: 'NTT',
            field: 'NT_data'
        }, {
            table: 'NTT',
            field: 'NT_processed'
        }, {
            table: 'NTT',
            field: 'NT_fk_User_ids'
        }],
        limit: 1,
        filter: {
            AND: [{
                table: 'NTT',
                field: 'NT_processed',
                operator: 'EQ',
                value: '0'
            }, {
                table: 'NTT',
                field: 'pk_id',
                operator: 'EQ',
                value: id
            }]
        }
    };

    var requestData = {
        query: notificationJson,
        dbConfig: dbConfig
    };

    queryExecutor.executeQuery(requestData, function(data) {
        debug('getNotificationTransactionByID executeQuery data: %s', JSON.stringify(data));;
        cb(data);
    });
}