const Vue = require('vue');
const path = require('path');
const db = require('../database');

const dbHelper = {
    methods: {
        /**
         * Retuns a pool connection from specific cluster node
         * @param {String} name - The cluster name
         *
         * @return {Object} - Pool connection
         */
        getConnection: name => db.getConnection(name),

        /**
         * Makes a query from a raw sql
         * @param {String} query - The raw SQL query
         * @param {Object} params - Parameterized values
         * @param {Object} connection - Optional pool connection
         *
         * @return {Object} - Result promise
         */
        rawSql: (query, params, connection) =>
            db.rawSql(query, params, connection),

        /**
         * Makes a query from a SQL file
         * @param {String} queryName - The SQL file name
         * @param {Object} params - Parameterized values
         * @param {Object} connection - Optional pool connection
         *
         * @return {Object} - Result promise
         */
        rawSqlFromDef(queryName, params, connection) {
            const absolutePath = path.join(__dirname, '../', this.path, 'sql', queryName);
            return db.rawSqlFromDef(absolutePath, params, connection);
        },

        /**
         * Returns the first row from a given raw sql
         * @param {String} query - The raw SQL query
         * @param {Object} params - Parameterized values
         *
         * @return {Object} - Result promise
         */
        findOne: (query, params) => db.findOne(query, params),

        /**
         * Returns the first row from a given SQL file
         * @param {String} queryName - The SQL file name
         * @param {Object} params - Parameterized values
         *
         * @return {Object} - Result promise
         */
        findOneFromDef(queryName, params) {
            return this.rawSqlFromDef(queryName, params)
                .then(([row]) => row);
        },

        /**
         * Returns the first property from a given raw sql
         * @param {String} query - The raw SQL query
         * @param {Object} params - Parameterized values
         *
         * @return {Object} - Result promise
         */
        findValue: (query, params) => db.findValue(query, params),

        /**
         * Returns the first property from a given SQL file
         * @param {String} queryName - The SQL file name
         * @param {Object} params - Parameterized values
         *
         * @return {Object} - Result promise
         */
        findValueFromDef(queryName, params) {
            return this.findOneFromDef(queryName, params).then(row => {
                if (row) return Object.values(row)[0];
            });
        },

        /**
         * Returns the content of an SQL file
         * @param {String} queryName - The SQL file name
         *
         * @return {Object} - SQL
         */
        getSqlFromDef(queryName) {
            const absolutePath = path.join(__dirname, '../', this.path, 'sql', queryName);
            return db.getSqlFromDef(absolutePath);
        },
    }
};

Vue.mixin(dbHelper);