package com.pictc.jdbc.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.sql.Types;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;

import lombok.Data;
import lombok.experimental.Accessors;


@Data
@Accessors(chain = true)
public class JdbcParam implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private int jdbc;
	
	private Object val;
	
	private boolean out;
	
	private Class<?> javaType;
	
	@Override
	public String toString() {
		return (out?"OUT ":"IN ")+val+"("+JdbcType.valueOf(jdbc).name()+")";
	}
	
	public static JdbcParam ofOut(int jdbc,Class<?> javaType) {
		return new JdbcParam().setJdbc(jdbc).setJavaType(javaType).setOut(true);
	}
	
	public static JdbcParam of(int jdbc,Class<?> javaType,Object val) {
		return new JdbcParam().setJdbc(jdbc).setJavaType(javaType).setVal(val);
	}
	
	public static JdbcParam ofString(String val) {
		return new JdbcParam().setJdbc(Types.VARCHAR).setJavaType(String.class).setVal(val);
	}
	
    // 整数类型
    public static JdbcParam ofInt(Integer val) {
        return new JdbcParam()
                .setJdbc(Types.INTEGER)
                .setJavaType(Integer.class)
                .setVal(val);
    }

    // 长整数类型
    public static JdbcParam ofLong(Long val) {
        return new JdbcParam()
                .setJdbc(Types.BIGINT)
                .setJavaType(Long.class)
                .setVal(val);
    }

    // 布尔类型
    public static JdbcParam ofBoolean(Boolean val) {
        return new JdbcParam()
                .setJdbc(Types.BOOLEAN)
                .setJavaType(Boolean.class)
                .setVal(val);
    }

    // 浮点类型
    public static JdbcParam ofFloat(Float val) {
        return new JdbcParam()
                .setJdbc(Types.FLOAT)
                .setJavaType(Float.class)
                .setVal(val);
    }

    // 双精度浮点类型
    public static JdbcParam ofDouble(Double val) {
        return new JdbcParam()
                .setJdbc(Types.DOUBLE)
                .setJavaType(Double.class)
                .setVal(val);
    }

    // 字节类型
    public static JdbcParam ofByte(Byte val) {
        return new JdbcParam()
                .setJdbc(Types.TINYINT)
                .setJavaType(Byte.class)
                .setVal(val);
    }

    // 短整数类型
    public static JdbcParam ofShort(Short val) {
        return new JdbcParam()
                .setJdbc(Types.SMALLINT)
                .setJavaType(Short.class)
                .setVal(val);
    }

    // 日期类型
    public static JdbcParam ofDate(Date val) {
        return new JdbcParam()
                .setJdbc(Types.DATE)
                .setJavaType(Date.class)
                .setVal(val);
    }

    // 时间戳类型
    public static JdbcParam ofTimestamp(Timestamp val) {
        return new JdbcParam()
                .setJdbc(Types.TIMESTAMP)
                .setJavaType(java.sql.Timestamp.class)
                .setVal(val);
    }
    
    
    // 高精度小数类型
    public static JdbcParam ofBigDecimal(BigDecimal val) {
        return new JdbcParam()
                .setJdbc(Types.DECIMAL)
                .setJavaType(BigDecimal.class)
                .setVal(val);
    }

    // 大整数类型
    public static JdbcParam ofBigInteger(BigInteger val) {
        return new JdbcParam()
                .setJdbc(Types.NUMERIC)
                .setJavaType(BigInteger.class)
                .setVal(val);
    }

    // Java 8 本地日期类型 (仅日期)
    public static JdbcParam ofLocalDate(LocalDate val) {
        return new JdbcParam()
                .setJdbc(Types.DATE)
                .setJavaType(LocalDate.class)
                .setVal(val);
    }

    // Java 8 本地时间类型 (仅时间)
    public static JdbcParam ofLocalTime(LocalTime val) {
        return new JdbcParam()
                .setJdbc(Types.TIME)
                .setJavaType(LocalTime.class)
                .setVal(val);
    }

    // Java 8 本地日期时间类型 (日期+时间)
    public static JdbcParam ofLocalDateTime(LocalDateTime val) {
        return new JdbcParam()
                .setJdbc(Types.TIMESTAMP)
                .setJavaType(LocalDateTime.class)
                .setVal(val);
    }
    
    /**
     * 获取String类型值
     */
    public String getStringValue() {
    	return val == null ? null : String.class.cast(val);
    }
    
    /**
     * 获取Integer类型值
     */
    public Integer getIntValue() {
        return val == null ? null : Integer.class.cast(val);
    }
    
    /**
     * 获取Long类型值
     */
    public Long getLongValue() {
        return val == null ? null : Long.class.cast(val);
    }
    
    /**
     * 获取Boolean类型值
     */
    public Boolean getBooleanValue() {
        return val == null ? null : Boolean.class.cast(val);
    }
    
    /**
     * 获取Float类型值
     */
    public Float getFloatValue() {
        return val == null ? null : Float.class.cast(val);
    }
    
    /**
     * 获取Double类型值
     */
    public Double getDoubleValue() {
        return val == null ? null : Double.class.cast(val);
    }
    
    /**
     * 获取Byte类型值
     */
    public Byte getByteValue() {
        return val == null ? null : Byte.class.cast(val);
    }
    
    /**
     * 获取Short类型值
     */
    public Short getShortValue() {
        return val == null ? null : Short.class.cast(val);
    }
    
    /**
     * 获取Date类型值
     */
    public Date getDateValue() {
        return val == null ? null : Date.class.cast(val);
    }
    
    /**
     * 获取Timestamp类型值
     */
    public Timestamp getTimestampValue() {
        return val == null ? null : Timestamp.class.cast(val);
    }
    
    /**
     * 获取BigDecimal类型值
     */
    public BigDecimal getBigDecimalValue() {
        return val == null ? null : BigDecimal.class.cast(val);
    }
    
    /**
     * 获取BigInteger类型值
     */
    public BigInteger getBigIntegerValue() {
        return val == null ? null : BigInteger.class.cast(val);
    }
    
    /**
     * 获取LocalDate类型值
     */
    public LocalDate getLocalDateValue() {
        return val == null ? null : LocalDate.class.cast(val);
    }
    
    /**
     * 获取LocalTime类型值
     */
    public LocalTime getLocalTimeValue() {
        return val == null ? null : LocalTime.class.cast(val);
    }
    
    /**
     * 获取LocalDateTime类型值
     */
    public LocalDateTime getLocalDateTimeValue() {
        return val == null ? null : LocalDateTime.class.cast(val);
    }


}
