package com.winsun.utils;

import com.winsun.auth.core.util.DateUtil;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 主要用于作为Mybatis-Plus的工具类使用
 *
 * @datetime 2019-10-19/10/13 08:42
 */
public class MyBatisPlusUpdateUtils {

    /**
     * 用于标记是否函数
     */
    public static final String FUNC = "func:";

    /**
     * 将准备用于更新的Map转换成update set的SQL中set的部分
     * 支持数据类型：String、Long、Integer、Double、Float、Date
     * 其中：
     *  Date：通过DateUtil.format((Date)val, "yyyy-MM-dd HH:mm:ss")转化之后变成字符串形式生成
     *  String：如果包含工具类的常量FUNC开头，则认为是一个SQL的函数，切割之后原样生成；其他情况则添加前后"'"生成
     * @param setMapper SQL set
     * @return
     */
    public static String toUpdateSet(@NotNull Map<String, ? extends Object> setMapper) {
        List<String> sqlSet = new ArrayList<>(setMapper.size());
        setMapper.forEach((key, val) -> {
            if(val == null) {
                sqlSet.add(String.format("%s = null", key));
            } else if(val instanceof String) {
                String tmp = (String)val;
                if(StringUtils.startsWith(tmp, FUNC)) {
                    tmp = tmp.substring(FUNC.length());
                    sqlSet.add(String.format("%s = %s", key, tmp));
                } else {
                    sqlSet.add(String.format("%s = '%s'", key, val));
                }
            } else if(val instanceof Integer) {
                sqlSet.add(String.format("%s = %d", key, val));
            } else if(val instanceof Long) {
                sqlSet.add(String.format("%s = %d", key, val));
            } else if(val instanceof Float) {
                sqlSet.add(String.format("%s = %g", key, val));
            } else if(val instanceof Double) {
                sqlSet.add(String.format("%s = %g", key, val));
            } else if(val instanceof Date) {
                sqlSet.add(String.format("%s = '%s'", key, DateUtil.format((Date)val, "yyyy-MM-dd HH:mm:ss")));
            } else {
                throw new NullPointerException("生成更新代码失败，遇到不支持数据类型");
            }
        });
        return StringUtils.join(sqlSet, ",");
    }
}
