import { CONSTANT } from "./constants";

class DbTypes {

    public getType = (dialect: string, dbType: string) => {
        switch(dialect) {
            case "mssql":
                return this._sqlServer(dbType);
                break;
            case "mysql":
                return this._mySql(dbType);
                break;
            default:
                throw new Error(`this code generation tool has not been configured for <${dialect}>`);
                break;
        }
    }

    private _mySql = (value: string) => {
        let lowerCaseDbType = value.toLowerCase();

        if (lowerCaseDbType.startsWith("int") || lowerCaseDbType.startsWith("bigint") || lowerCaseDbType.includes("decimal")) return "number";
        else if (lowerCaseDbType.startsWith("longtext") || 
                 lowerCaseDbType.startsWith("varchar") || 
                 lowerCaseDbType.startsWith("nvarchar") || 
                 lowerCaseDbType.startsWith("mediumtext") || 
                 lowerCaseDbType.startsWith("shorttext")
                 ) return "string";
        else if (lowerCaseDbType.includes("date") || lowerCaseDbType.includes("time")) return "Date";
        else if (lowerCaseDbType.includes("tinyint") || lowerCaseDbType.includes("bit")) return "boolean";
        else {
            console.log("Type not registered (please make PR and add this property): ", value);
        }
    }

    private _sqlServer = (value: string) => {
        return CONSTANT.MSSQL_DATATYPES_MAP[value];
    }
}

export default new DbTypes();