const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
const UserError = require('vn-loopback/util/user-error');

module.exports = Self => {
    Self.remoteMethod('getEnumValues', {
        description: 'Return enum values of column',
        accessType: 'EXECUTE',
        accepts: [
            {
                arg: 'schema',
                type: 'string',
                description: 'The schema of db',
                required: true,
            },
            {
                arg: 'table',
                type: 'string',
                description: 'The table of schema',
                required: true,
            },
            {
                arg: 'column',
                type: 'string',
                description: 'The column of table',
                required: true,
            },
        ],
        returns: {
            type: 'any',
            root: true
        },
        http: {
            path: `/get-enum-values`,
            verb: 'GET'
        }
    });

    Self.getEnumValues = async(schema, table, column) => {
        const stmt = new ParameterizedSQL(`
            SELECT COLUMN_TYPE
                FROM information_schema.COLUMNS
                    WHERE TABLE_SCHEMA = ?
                        AND TABLE_NAME = ?
                        AND COLUMN_NAME = ?
                        AND DATA_TYPE = 'enum';`,
        [schema, table, column]);

        const conn = Self.dataSource.connector;
        const [result] = await conn.executeStmt(stmt);

        if (!result) throw new UserError(`No results found`);

        const regex = /'([^']*)'/g;
        return result.COLUMN_TYPE.match(regex).map(match => match.slice(1, -1));
    };
};