package com.pictc.jdbc.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Date;

import com.pictc.jdbc.model.Criteria.DataType;
import com.pictc.utils.DateUtils;
import com.pictc.utils.StringUtils;

import lombok.Data;

/**
 * @Description TODO(这里用一句话描述这个类的作用)
 * @author zhangfucai
 * @Date 2022年12月13日 上午11:44:58
 * @version 1.0.0
 */
@Data
public class ParamItem implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

	private DataType dataType; //数据类型
	
	private Object val;
	
	public JdbcParam toParam() {
		JdbcType jdbc = getJdbc();
		return new JdbcParam().setJavaType(jdbc.getJavaClass()).setJdbc(jdbc.getJdbc()).setVal(parseVal(val));
	}
	
	public JdbcType getJdbc() {
		switch (dataType) {
			case DATE:  return JdbcType.TIMESTAMP;
			case INTEGER:  return JdbcType.INTEGER;
			case DOUBLE:  return JdbcType.DECIMAL;
			default:  return JdbcType.VARCHAR;
		}
	}
	
	public Class<?> getJavaType(){
		switch (dataType) {
			case DATE:  return Timestamp.class;
			case INTEGER:  return Integer.class;
			case DOUBLE:  return Double.class;
			default:  return String.class;
		}
	}
	
	private Object parseVal(Object _val) {
		String _str = _val.toString();
		if(StringUtils.isEmpty(_str)) return null;
		if(dataType==DataType.DATE) {
			if(_val instanceof Timestamp || _val instanceof Date) {
				return _val;
			}else if(_str.matches("^\\d+$")) {
				return new Timestamp(Long.valueOf(_str));
			}
			return Timestamp.from(DateUtils.stringToDate(_str,DATE_FORMAT).toInstant());
		}else if(dataType==DataType.DOUBLE) {
			if(_val instanceof BigDecimal) {
				return _val;
			}
			return new BigDecimal(_str);
		}else if(dataType==DataType.INTEGER) {
			if(_val instanceof Integer) {
				return _val;
			}
			return Integer.valueOf(_str);
		}
		return _str;
	}
}
