/**
 * 数据库网关服务
 */
const axios = require('axios');

class DatabaseManagementSystem {
    constructor(options) {
        this.options = Object.assign({
            user: "default",
            password: "",
            timeout: 3 * 60 * 1000, // 3 min
            enable_http_compression: 0,
            date_time_output_format: "simple",
            output_format_json_quote_64bit_integers: 1,
            named_parameter_format: "jdbc"
        }, options);
        this.http = axios.create({
            method: "POST",
            baseURL: this.options.url,
            params: {
                enable_http_compression: this.options.enable_http_compression,
                date_time_output_format: this.options.date_time_output_format,
                output_format_json_quote_64bit_integers: this.options.output_format_json_quote_64bit_integers,
                named_parameter_format: this.options.named_parameter_format
            },
            headers: {
                "Accept-Encoding": "gzip",
                "X-ClickHouse-User": this.options.user,
                "X-ClickHouse-Key": this.options.password,
                "X-ClickHouse-Format": "JSON"
            },
            responseType: "JSON",
            responseEncoding: "utf8",
            timeout: this.options.timeout
        });
    }

    async query(database, query, queryParameters) {
        let { data: { data } } = await this.http({
            url: "",
            params: {
                database: database,
                params: queryParameters ? JSON.stringify(queryParameters) : null
            },
            data: query
        });
        return data;
    }

    async predefinedQuery(database, query, queryParameters) {
        let { data: { data } } = await this.http({
            url: query,
            params: {
                database: database,
                params: queryParameters ? JSON.stringify(queryParameters) : null
            }
        });
        return data;
    }
}

module.exports = {
    DatabaseManagementSystem
}