package xyz.wbsite.dbtool.javafx.po;

import xyz.wbsite.dbtool.javafx.enums.DataBase;
import xyz.wbsite.dbtool.javafx.enums.FieldType;

public class SQLiteDBmapper extends AbstractDBmapper {

    public SQLiteDBmapper(DataBase mDataBase) {
        super(mDataBase);
    }

    @Override
    public String getFieldSql(Field field) {
        StringBuffer sb = new StringBuffer("");
        sb.append("\"").append(field.getFieldName()).append("\"");

        FieldType type = field.getFieldType();

        if (FieldType.Boolean.name().equals(type.name())) {
            sb.append("BOOLEAN");
        } else if (FieldType.Byte.name().equals(type.name())) {
            sb.append("TINYINT");
        } else if (FieldType.Bytes.name().equals(type.name())) {
            sb.append("BLOB");
        } else if (FieldType.Character.name().equals(type.name())) {
            sb.append("CHARACTER(1)");
        } else if (FieldType.Short.name().equals(type.name())) {
            sb.append("SMALLINT");
        } else if (FieldType.Integer.name().equals(type.name())) {
            sb.append("MEDIUMINT");
        } else if (FieldType.Long.name().equals(type.name())) {
            sb.append("BIGINT");
        } else if (FieldType.Float.name().equals(type.name())) {
            sb.append("FLOAT");
        } else if (FieldType.Double.name().equals(type.name())) {
            sb.append("DOUBLE");
        } else if (FieldType.Date.name().equals(type.name())) {
            sb.append("DATETIME");
        } else if (FieldType.Dict.name().equals(type.name())) {
            sb.append("VARCHAR(10)");
        }  else if (FieldType.BigDecimal.name().equals(type.name())) {
            sb.append("INTEGER");
        } else if (FieldType.String_1.name().equals(type.name())) {
            sb.append("CHAR(1)");
        } else if (FieldType.String_10.name().equals(type.name())) {
            sb.append("CHAR(10)");
        } else if (FieldType.String_var.name().equals(type.name())) {
            Integer fieldLength = field.getFieldLength();
            sb.append("VARCHAR(" + fieldLength + ")");
        } else if (FieldType.String_var50.name().equals(type.name())) {
            sb.append("VARCHAR(50)");
        } else if (FieldType.String_var100.name().equals(type.name())) {
            sb.append("VARCHAR(100)");
        } else if (FieldType.String_var255.name().equals(type.name())) {
            sb.append("VARCHAR(250)");
        } else if (FieldType.String_var500.name().equals(type.name())) {
            sb.append("VARCHAR(500)");
        } else if (FieldType.String_var2500.name().equals(type.name())) {
            sb.append("TEXT");
        } else if (FieldType.String_var4000.name().equals(type.name())) {
            sb.append("TEXT");
        } else if (FieldType.String_super.name().equals(type.name())) {
            sb.append("TEXT");
        }

        if (!field.getIsSystem() && field.getIsMust() && (field.getDefaultValue() == null || field.getDefaultValue().toUpperCase().equals("NULL"))) {
            sb.append(" NOT NULL");
        } else if (field.getIsSystem() && field.getFieldName().equals("ID")) {
            sb.append(" PRIMARY KEY NOT NULL");
        } else if (field.getIsSystem() && field.getFieldName().equals("ROW_VERSION")) {
            sb.append(" NOT NULL");
        } else if (field.getIsSystem() && field.getFieldName().equals("IS_DELETED")) {
            sb.append(" NOT NULL");
        } else if (field.getIsSystem() && field.getFieldName().equals("CREATE_BY")) {
            sb.append(" NOT NULL");
        } else if (field.getIsSystem() && field.getFieldName().equals("CREATE_TIME")) {
            sb.append(" NOT NULL");
        }
        return sb.toString();
    }

    @Override
    DataBase getDataBase() {
        return super.getDataBase();
    }

    @Override
    public String getDataBaseType(FieldType type) {
        if (FieldType.Boolean.name().equals(type.name())) {
            return "BOOLEAN";
        } else if (FieldType.Byte.name().equals(type.name())) {
            return "TINYINT";
        } else if (FieldType.Short.name().equals(type.name())) {
            return "SMALLINT";
        } else if (FieldType.Integer.name().equals(type.name())) {
            return "MEDIUMINT";
        } else if (FieldType.Long.name().equals(type.name())) {
            return "BIGINT";
        } else if (FieldType.Float.name().equals(type.name())) {
            return "FLOAT";
        } else if (FieldType.Double.name().equals(type.name())) {
            return "DOUBLE";
        } else if (FieldType.Character.name().equals(type.name())) {
            return "VARCHAR";
        } else if (FieldType.String_1.name().equals(type.name())) {
            return "CHARACTER";
        } else if (FieldType.String_10.name().equals(type.name())) {
            return "CHARACTER";
        } else if (FieldType.String_var.name().equals(type.name())) {
            return "VARCHAR";
        } else if (FieldType.String_var50.name().equals(type.name())) {
            return "VARCHAR";
        } else if (FieldType.String_var100.name().equals(type.name())) {
            return "VARCHAR";
        } else if (FieldType.String_var255.name().equals(type.name())) {
            return "VARCHAR";
        } else if (FieldType.String_var500.name().equals(type.name())) {
            return "VARCHAR";
        } else if (FieldType.String_var2500.name().equals(type.name())) {
            return "TEXT";
        } else if (FieldType.String_var4000.name().equals(type.name())) {
            return "TEXT";
        } else if (FieldType.Date.name().equals(type.name())) {
            return "DATE";
        } else if (FieldType.Bytes.name().equals(type.name())) {
            return "BLOB";
        } else {
            return "";
        }
    }

    @Override
    public FieldType getType(String type, int length, int precision, int scale) {
        return FieldType.String_var50;
    }
}