package net.northking.cctp.maven.analyse.entity;

import net.northking.cctp.maven.analyse.util.StringUtil;
import net.northking.cctp.maven.analyse.util.TypeSqlToJava;

/**
 * JAVA类的属性对象
 *
 * @author 谢秀松
 * @since 1.0
 */
public final class AttributesRef implements Cloneable
{
  /**
   * 外键前缀
   */
  private static final String FK_SUFFIX = "Fk";

  /**
   * JDBC类型名称
   */
  private String jdbcTypeName;

  /**
   * JAVA类型名称
   */
  private String javaTypeName;

  /**
   * JAVA类名
   */
  private String className;

  /**
   * 句柄名称
   */
  private String refName;

  /**
   * 注释
   */
  private String comment;

  /**
   * 最大长度
   */
  private int maxSize = 0;

  /**
   * 是否主键字段
   */
  private boolean primaryKey = false;

  public int getMaxSize()
  {
    return maxSize;
  }

  public void setMaxSize(int maxSize)
  {
    this.maxSize = maxSize;
  }

  /**
   * 获取JDBC类型名称
   *
   * @return JDBC类型名称
   */
  public String getJdbcTypeName()
  {
    return jdbcTypeName;
  }

  /**
   * 设置JDBC类型名称
   *
   * @param jdbcTypeName JDBC类型名称
   */
  public void setJdbcTypeName(final String jdbcTypeName)
  {
    this.jdbcTypeName = jdbcTypeName;
  }

  /**
   * 获取JAVA类型名称
   *
   * @return JAVA类型名称
   */
  public String getJavaTypeName()
  {
    return javaTypeName;
  }

  /**
   * 设置JAVA类型名称
   *
   * @param javaTypeName JAVA类型名称
   */
  public void setJavaTypeName(final String javaTypeName)
  {
    this.javaTypeName = javaTypeName;
  }

  /**
   * 获取句柄名称
   *
   * @return 句柄名称
   */
  public String getRefName()
  {
    return refName;
  }

  /**
   * 设置句柄名称
   *
   * @param refName 句柄名称
   */
  public void setRefName(final String refName)
  {
    this.refName = refName;
  }

  /**
   * 获取注释
   *
   * @return 注释
   */
  public String getComment()
  {
    return comment;
  }

  /**
   * 设置注释
   *
   * @param comment 注释
   */
  public void setComment(final String comment)
  {
    this.comment = comment;
  }

  /**
   * 获取类命名
   *
   * @return 类命名
   */
  public String getClassName()
  {
    return className;
  }

  /**
   * 设置类命名
   *
   * @param className 类命名
   */
  public void setClassName(final String className)
  {
    this.className = className;
  }

  public boolean isPrimaryKey()
  {
    return primaryKey;
  }

  public void setPrimaryKey(boolean primaryKey)
  {
    this.primaryKey = primaryKey;
  }

  /**
   * 构造函数，通过数据表的字段构造JAVA类的属性
   *
   * @param columnRef 表字段
   */
  public AttributesRef(final ColumnRef columnRef)
  {
    javaTypeName = TypeSqlToJava.sqlToJava(columnRef.getType(), columnRef.getSize(), columnRef.getDigits());
    jdbcTypeName = TypeSqlToJava.sqlToJdbc(columnRef.getType(), columnRef.getSize(), columnRef.getDigits());
    comment = columnRef.getComment();
    if ("boolean".equalsIgnoreCase(javaTypeName))
    {
      className = StringUtil.underlineToCamelByBoolean(columnRef.getName());
    } else
    {
      className = StringUtil.underlineToCamel(columnRef.getName());
    }
    refName = StringUtil.toJavaRefName(className);
    primaryKey = columnRef.isPrimaryKey();

    if ("String".equalsIgnoreCase(javaTypeName))
    {
      maxSize = columnRef.getSize();
    }
  }

  /**
   * 构造函数，通过数据表的外键构造JAVA类的属性
   *
   * @param foreignKeyRef 表外键
   */
  public AttributesRef(final ForeignKeyRef foreignKeyRef)
  {
    javaTypeName = StringUtil.underlineToCamel(foreignKeyRef.getPkTableName());
    jdbcTypeName = javaTypeName;
    className = StringUtil.underlineToCamel(foreignKeyRef.getFkColumnName()) + FK_SUFFIX;
    refName = StringUtil.toJavaRefName(className);
  }

  /**
   * 重写
   *
   * @return 描述信息
   */
  public String toString()
  {
    return "comment=" + comment + ", javaTypeName=" + javaTypeName + ", refName=" + refName;
  }

  /**
   * 克隆
   *
   * @return 克隆体
   */
  public Object clone()
  {
    AttributesRef a = null;
    try
    {
      a = (AttributesRef) super.clone();
    } catch (CloneNotSupportedException e)
    { // Won't happen
    }
    return a;
  }
}
