package com.torry.data.util;

import com.alibaba.otter.canal.protocol.CanalEntry;
import com.mongodb.BasicDBObject;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.format.DateTimeFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * 数据转换类
 *
 * @author zhangtongrui
 * @date 2017/10/12
 */
public class DBConvertUtil {
    protected final static Logger logger = LoggerFactory.getLogger(DBConvertUtil.class);

    /**
     * binlog行数据列转换成DBObject
     *
     * @param columns
     * @return
     */
    public static BasicDBObject columnToJson(List<CanalEntry.Column> columns) {
        BasicDBObject obj = new BasicDBObject();
        for (CanalEntry.Column column : columns) {
            Object value = dataTypeConvert(column.getMysqlType(), column.getValue());
            obj.put(column.getName(), value);
        }
        return obj;
    }

    /**
     * 数据类型转换
     *
     * @param mysqlType
     * @param value
     * @return
     */
    private static Object dataTypeConvert(String mysqlType, String value) {

        try {
            if (mysqlType.startsWith("int") || mysqlType.startsWith("tinyint") || mysqlType.startsWith("smallint") || mysqlType.startsWith("mediumint")) {
                //int(32)
                return StringUtils.isBlank(value) ? null : Integer.parseInt(value);
            } else if (mysqlType.startsWith("bigint")) {
                //int(64)
                return StringUtils.isBlank(value) ? null : Long.parseLong(value);
            } else if (mysqlType.startsWith("float") || mysqlType.startsWith("double")) {
                return StringUtils.isBlank(value) ? null : Double.parseDouble(value);
            } else if (mysqlType.startsWith("decimal")) {
                //小数精度为0时转换成long类型,否则转换为double类型
                int lenBegin = mysqlType.indexOf('(');
                int lenCenter = mysqlType.indexOf(',');
                int lenEnd = mysqlType.indexOf(')');
                if (lenBegin > 0 && lenEnd > 0 && lenCenter > 0) {
                    int length = Integer.parseInt(mysqlType.substring(lenCenter + 1, lenEnd));
                    if (length == 0) {
                        return StringUtils.isBlank(value) ? null : Long.parseLong(value);
                    }
                }
                return StringUtils.isBlank(value) ? null : Double.parseDouble(value);
            } else if (mysqlType.startsWith("datetime") || mysqlType.startsWith("timestamp")) {
                return StringUtils.isBlank(value) ? null : DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime(value).toDate();
            } else if (mysqlType.equals("date")) {
                return StringUtils.isBlank(value) ? null : DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime(value).toDate();
            } else if (mysqlType.startsWith("varchar") || mysqlType.startsWith("char")) {
                //设置默认空串
                return value == null ? "" : value;
            } else {
                logger.error("unknown data type :[{}]-[{}]", mysqlType, value);
            }
        } catch (Exception e) {
            logger.error("data type convert error ", e);
        }
        return value;
    }
}