package com.alibaba.druid.sql.ast.statement;

import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLCommentHint;
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.FnvHash;
import java.util.List;

public class SQLCharacterDataType extends SQLDataTypeImpl {
   private String charSetName;
   private String collate;
   private String charType;
   private boolean hasBinary;
   public List<SQLCommentHint> hints;
   public static final String CHAR_TYPE_BYTE = "BYTE";
   public static final String CHAR_TYPE_CHAR = "CHAR";

   public SQLCharacterDataType(String name) {
      super(name);
   }

   public SQLCharacterDataType(String name, int precision) {
      super(name, precision);
   }

   public String getCharSetName() {
      return this.charSetName;
   }

   public void setCharSetName(String charSetName) {
      this.charSetName = charSetName;
   }

   public boolean isHasBinary() {
      return this.hasBinary;
   }

   public void setHasBinary(boolean hasBinary) {
      this.hasBinary = hasBinary;
   }

   public String getCollate() {
      return this.collate;
   }

   public void setCollate(String collate) {
      this.collate = collate;
   }

   public String getCharType() {
      return this.charType;
   }

   public void setCharType(String charType) {
      this.charType = charType;
   }

   public List<SQLCommentHint> getHints() {
      return this.hints;
   }

   public void setHints(List<SQLCommentHint> hints) {
      this.hints = hints;
   }

   public int getLength() {
      if (this.arguments.size() == 1) {
         SQLExpr arg = (SQLExpr)this.arguments.get(0);
         if (arg instanceof SQLIntegerExpr) {
            return ((SQLIntegerExpr)arg).getNumber().intValue();
         }
      }

      return -1;
   }

   protected void accept0(SQLASTVisitor visitor) {
      if (visitor.visit(this)) {
         for(int i = 0; i < this.arguments.size(); ++i) {
            SQLExpr arg = (SQLExpr)this.arguments.get(i);
            if (arg != null) {
               arg.accept(visitor);
            }
         }
      }

      visitor.endVisit(this);
   }

   public SQLCharacterDataType clone() {
      SQLCharacterDataType x = new SQLCharacterDataType(this.getName());
      super.cloneTo(x);
      x.charSetName = this.charSetName;
      x.collate = this.collate;
      x.charType = this.charType;
      x.hasBinary = this.hasBinary;
      return x;
   }

   public String toString() {
      return SQLUtils.toSQLString(this);
   }

   public int jdbcType() {
      long nameNash = this.nameHashCode64();
      if (nameNash == FnvHash.Constants.NCHAR) {
         return -15;
      } else if (nameNash != FnvHash.Constants.CHAR && nameNash != FnvHash.Constants.JSON) {
         if (nameNash != FnvHash.Constants.VARCHAR && nameNash != FnvHash.Constants.VARCHAR2 && nameNash != FnvHash.Constants.STRING) {
            return nameNash != FnvHash.Constants.NVARCHAR && nameNash != FnvHash.Constants.NVARCHAR2 ? 1111 : -9;
         } else {
            return 12;
         }
      } else {
         return 1;
      }
   }
}
