package com.yanzuoguang.db.impl;

import com.yanzuoguang.extend.ConfigDb;
import com.yanzuoguang.util.helper.StringHelper;
import com.yanzuoguang.util.log.Log;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 打印SQL语句日志工具类
 *
 * @author 颜佐光
 */
@Component
public class DbPrintSql {

    @Resource
    private ConfigDb configDb;

    /**
     * 获取参数处理之后的SQL语句
     *
     * @param sql   带参数的SQL语句
     * @param paras 参数
     * @return 不带参数的SQL语句
     */
    public String getStringSql(String sql, Object... paras) {
        StringBuilder sb = new StringBuilder();

        String[] split = sql.split("\\?");
        int pos = 0;

        // 进行SQL语句参数替换,后面增加一个空格,方便后续用正则表达式进行替换处理
        for (Object item : paras) {
            String str = StringHelper.toString(item);
            String strTo = str;
            if (str == null) {
                strTo = "null";
            } else if (item instanceof Number || item.getClass().isEnum() || item instanceof Boolean) {
                // 不进行处理
            } else {
                strTo = "'" + str.replace("'", "''") + "'";
            }
            sb.append(split[pos]);
            pos++;
            sb.append(strTo);
        }

        while (pos < split.length) {
            sb.append(split[pos]);
            pos++;
        }
        return sb.toString();
    }

    /**
     * 打印SQL语句
     *
     * @param targetClass 触发类
     * @param sqlName     SQL语句名称
     * @param start       开始执行的语句
     * @param row         SQL语句
     * @param sql         SQL语句
     * @param paras       参数
     */
    public void print(Class targetClass, String sqlName, long start, int row, String sql, Object... paras) {
        // 日志表忽略打印
        if (!configDb.isPrintSql()) {
            return;
        }
        if (!StringHelper.isEmpty(configDb.getPrintSqlFilter())) {
            if (sql.matches(configDb.getPrintSqlFilter())) {
                return;
            }
        }
        sql = getStringSql(sql, paras);
        // 打印SQL语句
        Log.infoTag(DbPrintSql.class, String.format("%d row %s.%s", row, targetClass.getSimpleName(), sqlName), sql);
    }
}