﻿function AddDAL_Includes(target)
{
    switch(providerID)
    {
        case "0":
            AddLine("using System.Data;", target);
            AddLine("using MySql.Data.MySqlClient;", target);
            break;
        case "1":
            AddLine("using System.Data;", target);
            AddLine("using System.Data.SqlClient;", target);
            break;
    }  
}

function GetConnectionType()
{
    switch(providerID)
    {
        case "0":
            return "MySqlConnection";
            break;
        case "1":
            return "SqlConnection";
            break;
    }  
}

function GetDataAdapterType()
{
    switch(providerID)
    {
        case "0":
            return "MySqlDataAdapter";
            break;
        case "1":
            return "SqlDataAdapter";
            break;
    }  

}

function GetCommandType()
{
    switch(providerID)
    {
        case "0":
            return "MySqlCommand";
            break;
        case "1":
            return "SqlCommand";
            break;
    }  
}

function GetParameterType()
{
    switch(providerID)
    {
        case "0":
            return "MySqlParameter";
            break;
        case "1":
            return "SqlParameter";
            break;
    }  

}

function GetDBTypeType()
{
    switch(providerID)
    {
        case "0":
            return "MySqlDbType";
            break;
        case "1":
            return "SqlDbType";
            break;
    }  
}

function GetParamPrefix()
{
    switch(providerID)
    {
        case "0":
            return "?_";
            break;
        case "1":
            return "@";
            break;
    }  
}

function AddDAL_BaseClassFactories()
{
    AddLine("public static " + GetParameterType() + " BuildParameterNoSize(System.Data.ParameterDirection oDirection, string sParameterName, " + GetDBTypeType() + " oDataType)", 'txtBaseClass');
    AddLine("{", 'txtBaseClass');
    AddLine(GetParameterType() + " oParameter = new " + GetParameterType() + "(sParameterName, oDataType);", 'txtBaseClass');
    AddLine("oParameter.Direction = oDirection;", 'txtBaseClass');
    AddLine("return oParameter;", 'txtBaseClass');
    AddLine("}", 'txtBaseClass');

    AddLine("public static " + GetParameterType() + " BuildParameterNoSize(System.Data.ParameterDirection oDirection, string sParameterName, " + GetDBTypeType() + " oDataType, object oValue)", 'txtBaseClass');
    AddLine("{", 'txtBaseClass');
    AddLine(GetParameterType() + " oParameter = new " + GetParameterType() + "(sParameterName, oDataType);", 'txtBaseClass');
    AddLine("oParameter.Direction = oDirection;", 'txtBaseClass');
    AddLine("oParameter.Value = oValue;", 'txtBaseClass');
    AddLine("return oParameter;", 'txtBaseClass');
    AddLine("}", 'txtBaseClass');

    AddLine("public static " + GetParameterType() + " BuildParameterWithSize(System.Data.ParameterDirection oDirection, string sParameterName, " + GetDBTypeType() + " oDataType, int iSize)", 'txtBaseClass');
    AddLine("{", 'txtBaseClass');
    AddLine(GetParameterType() + " oParameter = new " + GetParameterType() + "(sParameterName, oDataType, iSize);", 'txtBaseClass');
    AddLine("oParameter.Direction = oDirection;", 'txtBaseClass');
    AddLine("return oParameter;", 'txtBaseClass');
    AddLine("}", 'txtBaseClass');

    AddLine("public static " + GetParameterType() + " BuildParameterWithSize(System.Data.ParameterDirection oDirection, string sParameterName, " + GetDBTypeType() + " oDataType, int iSize, object oValue)", 'txtBaseClass');
    AddLine("{", 'txtBaseClass');
    AddLine(GetParameterType() + " oParameter = new " + GetParameterType() + "(sParameterName, oDataType, iSize);", 'txtBaseClass');
    AddLine("oParameter.Direction = oDirection;", 'txtBaseClass');
    AddLine("oParameter.Value = oValue;", 'txtBaseClass');
    AddLine("return oParameter;", 'txtBaseClass');
    AddLine("}", 'txtBaseClass');
}

function AddDAL_DeleteSingle()
{
    AddLine("protected static void DeleteSingle(" + types[0] + " " + fields[0] + ")");
    AddLine("{");
    AddLine("using (" + GetConnectionType() + " conn = new " + GetConnectionType() + "(BusinessObject.ConnectionString))");
    AddLine("{");
    
    AddLine("using (" + GetCommandType() + " cmd = new " + GetCommandType() + "(\"sp" + className + "DeleteSingle\", conn))");
    AddLine("{");
    
    if(types[0] == "Guid")
    {
        if( providerID == "0")
        {
            AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterWithSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[0] + "\", " + GetDBTypeType() + ".VarChar, 36, " + fields[0] + ".ToString()));");            
        }
        else
        {
            AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[0] + "\", " + GetDBTypeType() + ".UniqueIdentifier, " + fields[0] + "));");            
        }

    }
    else if(types[0] == "int")
    {

        var dbIntName = "Int32";
        if( providerID == "1")
        {
            dbIntName = "Int";
        }
       
        AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[0] + "\", " + GetDBTypeType() + "." + dbIntName + ", " + fields[0] + "));");            
        
    }

    AddLine("cmd.CommandType = CommandType.StoredProcedure;");
    AddLine("cmd.Connection.Open();");
    AddLine("cmd.ExecuteNonQuery();");
    AddLine("cmd.Connection.Close();");
    
    AddLine("}");
    AddLine("}");
    AddLine("}");
}

function AddDAL_SelectSingle()
{

    AddLine("protected static DataTable SelectSingle(" + types[0] + " " + fields[0] + ")");
    AddLine("{");
    AddLine("DataTable dt;");
    AddLine("using (" + GetConnectionType() + " conn = new " + GetConnectionType() + "(BusinessObject.ConnectionString))");
    AddLine("{");
    
    AddLine("using (" + GetDataAdapterType() + " adap = new " + GetDataAdapterType() + "(\"sp" + className + "SelectSingle\", conn))");
    AddLine("{");
    
    if(types[0] == "Guid")
    {
        if( providerID == "0")
        {
            AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterWithSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[0] + "\", " + GetDBTypeType() + ".VarChar, 36, " + fields[0] + ".ToString()));");            
        }
        else
        {
            AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[0] + "\", " + GetDBTypeType() + ".UniqueIdentifier, " + fields[0] + "));");            
        }

    }
    else if(types[0] == "int")
    {

        var dbIntName = "Int32";
        if( providerID == "1")
        {
            dbIntName = "Int";
        }
       
        AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[0] + "\", " + GetDBTypeType() + "." + dbIntName + ", " + fields[0] + "));");            
        
    }

    
    AddLine("adap.SelectCommand.CommandType = CommandType.StoredProcedure;");
    AddLine("adap.Fill(dt = new DataTable());");
    AddLine("}");
    AddLine("}");
    AddLine("return dt;");
    AddLine("}");
}

function AddDAL_AddUpdate()
{
    AddLine("protected " + types[0] + " AddUpdate()");
    AddLine("{");
    
    if(types[0] == "Guid" )
    {
        AddLine("if (_" + fields[0] + " == Guid.Empty)");
        AddLine("{");
        AddLine("_" + fields[0] + " = Guid.NewGuid();");              
        AddLine("}");
    }  
    
    AddLine("using (" + GetConnectionType() + " conn = new " + GetConnectionType() + "(BusinessObject.ConnectionString))");
    AddLine("{");
    AddLine("using (" + GetCommandType() + " cmd = new " + GetCommandType() + "(\"sp" + className + "AddUpdate\", conn))");
    AddLine("{");
    AddLine("cmd.CommandType = CommandType.StoredProcedure;");
    
    for( var i = 0; i < MAX_FIELD_TEST; i++ )
    {
        if( fields[i] )
        {
            if(types[i] == "string")
            {
                AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterWithSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".VarChar, " + fieldSize[i] + ", _" + fields[i] + ".ToString()));");            
            }
            else if(types[i] == "Guid")
            {
                if( providerID == "0")
                {
                    AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterWithSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".VarChar, 36, _" + fields[i] + ".ToString()));");            
                }
                else
                {
                    AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".UniqueIdentifier, _" + fields[i] + "));");            
                }
                
            }
            else if(types[i] == "double")
            {
                AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".Double, _" + fields[i] + "));");            
            }
            else if(types[i] == "float")
            {
                AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".Float, _" + fields[i] + "));");            
            }
            else if(types[i] == "DateTime")
            {
                AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".DateTime, _" + fields[i] + "));");            
            }
            else if(types[i] == "int")
            {
            
                var dbIntName = "Int32";
                if( providerID == "1")
                {
                    dbIntName = "Int";
                }
            
                if( i == 0 )//this means its out pk
                {
                    AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.InputOutput, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + "." + dbIntName + ", _" + fields[i] + "));");            
                }
                else
                {
                    AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + "." + dbIntName + ", _" + fields[i] + "));");            
                }
            }
            else if(types[i] == "bool")
            {
                AddLine("cmd.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".Bit, _" + fields[i] + "));");            
            }
        } else break;
    }

    AddLine("cmd.Connection.Open();");
    AddLine("cmd.ExecuteNonQuery();");
    AddLine("cmd.Connection.Close();");
    
    if(types[0] == "int" )
    {
        AddLine("if (_" + fields[0] + " == int.MinValue)");
        AddLine("{");
        AddLine("_" + fields[0] + " = int.Parse(cmd.Parameters[\"" + GetParamPrefix() + fields[0] + "\"].Value.ToString());");
        AddLine("}");
    }
    
    
    AddLine("}");
    AddLine("}");
    AddLine("return _" + fields[0] + ";");
    AddLine("}");
}

function AddDAL_SelectAll()
{
   //*** SELECT ALL ***\\\
        
    var paramstring = GetSearchableParamsCSharp("", true);
    
    AddLine("protected static DataTable SelectAll( " + paramstring + " )")
    AddLine("{");
        AddLine("DataTable dt;");
        AddLine("using (" + GetConnectionType() + " conn = new " + GetConnectionType() + "(BusinessObject.ConnectionString))");
        AddLine("{");
            AddLine("using (" + GetDataAdapterType() + " adap = new " + GetDataAdapterType() + "(\"sp" + className + "SelectAll\", conn))");
            AddLine("{");
                AddLine("adap.SelectCommand.CommandType = CommandType.StoredProcedure;");
                
                for( var i = 0; i < MAX_FIELD_TEST; i++ )
                {
                    if( fields[i] )
                    {
                        if( searchable[i] )
                        {
                            if(types[i] == "string")
                            {
                                AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterWithSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".VarChar, " + fieldSize[i] + "));");            
                                AddLine("if (" + fields[i] + " != String.Empty)");
                                AddLine("{");
                                AddLine("adap.SelectCommand.Parameters[\"" + GetParamPrefix() + fields[i] +"\"].Value = " + fields[i] + ".ToString();");
                                AddLine("}");
                            }
                            else if(types[i] == "Guid")
                            {
                                AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterWithSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".VarChar, 36));");            
                                AddLine("if (" + fields[i] + " != Guid.Empty)");
                                AddLine("{");
                                AddLine("adap.SelectCommand.Parameters[\"" + GetParamPrefix() + fields[i] +"\"].Value = " + fields[i] + ".ToString();");
                                AddLine("}");
                            }
                            else if(types[i] == "double")
                            {
                                AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".Double));");            
                                AddLine("if (" + fields[i] + " != double.MinValue)");
                                AddLine("{");
                                AddLine("adap.SelectCommand.Parameters[\"" + GetParamPrefix() + fields[i] +"\"].Value = " + fields[i] + ";");
                                AddLine("}");
                            }
                            else if(types[i] == "float")
                            {
                                AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".Float));");            
                                AddLine("if (" + fields[i] + " != float.MinValue)");
                                AddLine("{");
                                AddLine("adap.SelectCommand.Parameters[\"" + GetParamPrefix() + fields[i] +"\"].Value = " + fields[i] + ";");
                                AddLine("}");
                            }
                            else if(types[i] == "DateTime")
                            {
                                AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".DateTime));");            
                                AddLine("if (" + fields[i] + " != DateTime.MinValue)");
                                AddLine("{");
                                AddLine("adap.SelectCommand.Parameters[\"" + GetParamPrefix() + fields[i] +"\"].Value = " + fields[i] + ";");
                                AddLine("}");
                            }
                            else if(types[i] == "int")
                            {
                                var dbIntName = "Int32";
                                if( providerID == "1")
                                {
                                    dbIntName = "Int";
                                }
                                
                                AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + "."  + dbIntName +"));");            
                                AddLine("if (" + fields[i] + " != int.MinValue)");
                                AddLine("{");
                                AddLine("adap.SelectCommand.Parameters[\"" + GetParamPrefix() + fields[i] +"\"].Value = " + fields[i] + ";");
                                AddLine("}");
                            }
                            else if(types[i] == "bool")
                            {
                                AddLine("adap.SelectCommand.Parameters.Add(BusinessObject.BuildParameterNoSize(ParameterDirection.Input, \"" + GetParamPrefix() + fields[i] + "\", " + GetDBTypeType() + ".Bit));");            
                                AddLine("adap.SelectCommand.Parameters[\"" + GetParamPrefix() + fields[i] +"\"].Value = " + fields[i] + ";");
                            }
                        }
                    } else break;
                }
                AddLine("adap.Fill(dt = new DataTable());");
            AddLine("}");
        AddLine("}");
        AddLine("return dt;");
    AddLine("}");
}


function AddDAL()
{
    AddDAL_AddUpdate();
    AddLine("");
    AddDAL_SelectSingle();
    AddLine("");
    AddDAL_SelectAll();
    AddLine("");
    AddDAL_DeleteSingle();
}
