/// <summary>
 /// Gera os arquivos ORM (TO/DAL/BLL)
 /// </summary>
 public static void Create(Configuration parammeter, ITemplateText dictionaryTemplates)
 {
     foreach (var objetoOrm in parammeter.ObjetosMapeaveis)
     {
         GeraClassesOrm(objetoOrm, parammeter, dictionaryTemplates);
     }
 }
        public void Create(Configuration parametro, string nomeProvider)
        {
            CreateLinqFiles(parametro, nomeProvider);
            CreateBusinessFiles(parametro.DestinationPath, parametro.NameSpace);
            CreatePocoFiles(parametro.DestinationPath);
            CreateInterfaceFiles(parametro.DestinationPath, parametro.NameSpace);

        }
        private static void GeraClassesOrm(DatabaseObjectInfo objectDatabase, Configuration configuration, ITemplateText dictionaryTemplates)
        {
            var gerador = new FileFactory(dictionaryTemplates) { Log = Log };
            var nomeArquivo = FileFactory.RetornaNomeClasseAjustado(objectDatabase.Name);

            var arquivo = gerador.GeneratePocoFiles(nomeArquivo,objectDatabase, configuration);
            var arquivoBLL = gerador.GenerateBusinessFiles(nomeArquivo, objectDatabase, configuration);
            var arquivoDAL = gerador.GenerateDataAccesFiles(nomeArquivo, objectDatabase, configuration);

            File.WriteAllText(string.Format("{0}\\TO\\{1}TO.cs", configuration.DestinationPath, nomeArquivo), arquivo);
            File.WriteAllText(string.Format("{0}\\BLL\\{1}BLL.cs", configuration.DestinationPath, nomeArquivo), arquivoBLL);
            File.WriteAllText(string.Format("{0}\\DAL\\{1}DAL.cs", configuration.DestinationPath, nomeArquivo), arquivoDAL);
        }
        private static void CriaPropriedades(List<ColumnInfo> colunas, StringBuilder retorno, IEnumerable<ForeignKey> listaFk, Configuration parametros)
        {
            colunas = colunas.OrderByDescending(c => c.IsPrimaryKey).ToList();

            foreach (var coluna in colunas)
            {
                var colunaRequirida = false;

                if (parametros.MapLinq)
                {
                    if (coluna.IsPrimaryKey || coluna.IsNullability == false)
                    {
                        retorno.AppendFormat("[Required, DisplayName(\"{0}\")]{1}", coluna.ColumnName, Environment.NewLine);
                        colunaRequirida = !coluna.IsNullability;
                    }

                    if (coluna.Type.ToLower().Contains("char") || coluna.Type.ToLower() == "string")
                    {
                        switch (colunaRequirida)
                        {
                            case true:
                                retorno.AppendFormat("[StringLength({0})]{1}", coluna.Size, Environment.NewLine);
                                break;
                            default:
                                retorno.AppendFormat("[StringLength({0}), DisplayName(\"{1}\")]{2}", coluna.Size, coluna.ColumnName, Environment.NewLine);
                                break;
                        }
                    }
                    //valida se o campo possui validação personalizada
                    if (!string.IsNullOrEmpty(coluna.RegularExpression))
                    {
                        retorno.AppendLine(string.Format("[RegularExpression(@\"{0}\")]", coluna.RegularExpression));
                    }
                    retorno.Append(RetornaMapColumn(coluna)).Append(Environment.NewLine);
                }

                if (parametros.MapWcf)
                {
                    retorno.AppendFormat("[DataMember]{0}", Environment.NewLine);
                }

                retorno.Append(string.Format("public {0}{1} {2} {{ get; set; }}", coluna.Type, CheckIsNullable(coluna.Type, coluna.IsNullability), StringHelper.RemoveInvalidCharacters(coluna.ColumnName)) + Environment.NewLine + Environment.NewLine);
            }

            CriaAssociacoes(retorno, listaFk);

            retorno.Append("}" + Environment.NewLine);
            retorno.Append("}" + Environment.NewLine);
        }
        public static void Create(Configuration parametros, string provider)
        {

            var guidProjInterface = Guid.NewGuid().ToString().ToUpper();
            var guidProjTO = Guid.NewGuid().ToString().ToUpper().ToUpper();
            var guidProjDal = Guid.NewGuid().ToString().ToUpper().ToUpper();
            var guidProjBll = Guid.NewGuid().ToString().ToUpper().ToUpper();
            var guidProjWcf = Guid.NewGuid().ToString().ToUpper().ToUpper();


            var arquivosInterface = (from DatabaseObjectInfo t in parametros.ObjetosMapeaveis select string.Format("<Compile Include=\"IPersistence{0}.cs\" />", FileFactory.RetornaNomeClasseAjustado(t.Name).Replace(" ", ""))).ToList();
            var arquivosTO = (from DatabaseObjectInfo t in parametros.ObjetosMapeaveis select string.Format("<Compile Include=\"{0}TO.cs\" />", FileFactory.RetornaNomeClasseAjustado(t.Name))).ToList();
            var arquivosDal = (from DatabaseObjectInfo t in parametros.ObjetosMapeaveis select string.Format("<Compile Include=\"{0}DAL.cs\" />", FileFactory.RetornaNomeClasseAjustado(t.Name))).ToList();
            var arquivosBll = (from DatabaseObjectInfo t in parametros.ObjetosMapeaveis select string.Format("<Compile Include=\"{0}BLL.cs\" />", FileFactory.RetornaNomeClasseAjustado(t.Name))).ToList();

            var sbLog4Net = new StringBuilder();

            sbLog4Net.AppendLine("<Reference Include=\"log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, processorArchitecture=AMD64\">");
            sbLog4Net.AppendLine("<SpecificVersion>False</SpecificVersion>");
            sbLog4Net.AppendLine("<HintPath>..\\log4net.dll</HintPath>");
            sbLog4Net.AppendLine("</Reference>");

            var templateAssembly = AssinaProjeto(parametros);

            GeraProjetoInterface(parametros, guidProjInterface, arquivosInterface, templateAssembly);
            GeraProjetoTo(parametros, guidProjTO, guidProjInterface, arquivosTO, templateAssembly);
            GeraProjetoDal(parametros, provider, guidProjDal, guidProjInterface, guidProjTO, arquivosDal, sbLog4Net, templateAssembly);
            GeraProjetoBll(parametros, guidProjBll, guidProjInterface, guidProjTO, guidProjDal, arquivosBll, sbLog4Net, templateAssembly);
            
            if (parametros.MapWcf)
            {
                GeraProjetoWcf(parametros, guidProjWcf);
            }
            else
            {
                guidProjWcf = null;
            }
            
            GeraSoluction(parametros, guidProjTO, guidProjDal, guidProjInterface, guidProjBll, guidProjWcf);

            Directory.Move(string.Format("{0}\\TO", parametros.DestinationPath), string.Format("{0}\\{1}TO", parametros.DestinationPath, parametros.NameSpace.Replace(".", "")));
            Directory.Move(string.Format("{0}\\DAL", parametros.DestinationPath), string.Format("{0}\\{1}DAL", parametros.DestinationPath, parametros.NameSpace.Replace(".", "")));
            Directory.Move(string.Format("{0}\\BLL", parametros.DestinationPath), string.Format("{0}\\{1}BLL", parametros.DestinationPath, parametros.NameSpace.Replace(".", "")));
            Directory.Move(string.Format("{0}\\Interfaces", parametros.DestinationPath), string.Format("{0}\\{1}Interfaces", parametros.DestinationPath, parametros.NameSpace.Replace(".", "")));

        }
        public static void WriteFile(Configuration parametros)
        {
            if (!parametros.GerarAppConfig) return;

            var sbAppConfig = new StringBuilder();

            sbAppConfig.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
            sbAppConfig.AppendLine("<configuration>");
            sbAppConfig.AppendLine("<connectionStrings>");
            sbAppConfig.AppendLine(string.Format("<add name=\"STRING_CONNECTION\" connectionString=\"Data Source = {0}; Initial Catalog = {2}; " +
                                                 "Persist Security Info = True; User ID = {1}; Password = {3}; " +
                                                 "\" providerName=\"System.Data.SqlClient\" />", parametros.User.ServerAddress, 
                                                 parametros.User.UserName, parametros.User.DatabaseName, parametros.User.Password));
            sbAppConfig.AppendLine("</connectionStrings>");
            sbAppConfig.AppendLine("</configuration>");

            File.WriteAllText(string.Format("{0}\\app.config", parametros.DestinationPath), sbAppConfig.ToString());
        }
        private static void GeraSoluction(Configuration parametros, string guidProjTO, string guidProjDAL, string guidProjInterface, string guidProjBLL, string guidProjWcf)
        {
            var trocasSolution = new Hashtable
            {
                {"[guid]", Guid.NewGuid().ToString().ToUpper().ToUpper()},
                {"[namespace]", parametros.NameSpace},
                {"[guidTO]", guidProjTO},
                {"[guidDAL]", guidProjDAL},
                {"[guidInterface]", guidProjInterface},
                {"[guidBLL]", guidProjBLL}
            };

            var projSolution = FileFactory.RetornaTextoBase("noituloS");

            if (parametros.MapWcf)
            {
                projSolution = projSolution.Replace("[guidWcf]", string.Format("Project(\"{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}\") = \"{0}Wcf\", \"{0}Wcf\\{0}Wcf.csproj\", \"{{53034ACE-081D-4CDA-8075-D3B158C7DAF9}}\"{1}EndProject", parametros.NameSpace, Environment.NewLine));
                projSolution = projSolution.Replace("[guidGlobalWcf]", string.Format("{{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU{1}{{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU{1}{{{0}}}.Release|Any CPU.ActiveCfg = Release|Any CPU{1}{{{0}}}.Release|Any CPU.Build.0 = Release|Any CPU", guidProjWcf, Environment.NewLine));
            }
            else
            {
                projSolution = projSolution.Replace("[guidWcf]", "");
                projSolution = projSolution.Replace("[guidGlobalWcf]", "");
            }

            switch (parametros.VersaoFramework)
            {
                case "v2.0":
                    projSolution = projSolution.Replace("2010", "2008");
                    projSolution = projSolution.Replace("11.00", "10.00");
                    break;
                case "v4.5":
                    projSolution = projSolution.Replace("2010", "2012");
                    projSolution = projSolution.Replace("11.00", "12.00");
                    break;
            }

            projSolution = trocasSolution.Cast<DictionaryEntry>().Aggregate(projSolution, (current, entry) => current.Replace(entry.Key.ToString(), entry.Value.ToString()));

            File.WriteAllText(string.Format("{0}\\{1}.sln", parametros.DestinationPath, parametros.NameSpace), projSolution);
        }
        private static void CreateLinqFiles(Configuration parametro, string nomeProvider)
        {

            // ReSharper disable ResourceItemNotResolved
            var dbExpressions = _template.GelValue("DbExpressions").Value;
            var dbExpressionVisitor = _template.GelValue("DbExpressionVisitor").Value;
            var expressionVisitor = _template.GelValue("ExpressionVisitor").Value;
            var queryExecutor = _template.GelValue("QueryExecutor").Value;
            var queryLanguage = _template.GelValue("QueryLanguage").Value;
            var queryMapping = _template.GelValue("QueryMapping").Value;
            var queryTypeSystem = _template.GelValue("QueryTypeSystem").Value;
            var sqlFormatter = _template.GelValue("SqlFormatter").Value;

            var isSqlFormatter = _template.GelValue("ISqlFormatter").Value ?? "";
            var provider = _template.GelValue(nomeProvider).Value;


            var funcoesCrud = parametro.TiposObjetosAcaoBanco.Aggregate(_template.GelValue("FuncoesCrud").Value, (current, param) => current.Replace(param.Key, param.Value)).Replace("{namespace}", parametro.NameSpace);

            var sqlLanguage = _template.GelValue("SqlLanguage").Value;

            var crudBase = parametro.TiposObjetosAcaoBanco.Aggregate(_template.GelValue("CrudBase").Value, (current, param) => current.Replace(param.Key, param.Value));
            var singleton = parametro.TiposObjetosAcaoBanco.Aggregate(_template.GelValue("Singleton").Value, (current, param) => current.Replace(param.Key, param.Value));

            var eTipoConsulta = _template.GelValue("ETipoConsulta").Value;
            var cmdMap = parametro.TiposObjetosAcaoBanco.Aggregate(_template.GelValue("CmdMap").Value, (current, param) => current.Replace(param.Key, param.Value));
            var transaction = parametro.TiposObjetosAcaoBanco.Aggregate(_template.GelValue("Transaction").Value, (current, param) => current.Replace(param.Key, param.Value));

            var fastInvoke = _template.GelValue("FastInvoke").Value;
            var mapExtension = _template.GelValue("MapExtension").Value;
            var cachingMannager = _template.GelValue("CachingMannager").Value;
            var eCacheAcao = _template.GelValue("ECacheAcao").Value;
            var cacheChangedEventArgs = _template.GelValue("CacheChangedEventArgs").Value;
            var cacheChangedEventHandler = _template.GelValue("CacheChangedEventHandler").Value;
            var cachingProvider = _template.GelValue("ICachingProvider").Value;


            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\DbExpressions.cs", parametro.DestinationPath), dbExpressions);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\DbExpressionVisitor.cs", parametro.DestinationPath), dbExpressionVisitor);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\ExpressionVisitor.cs", parametro.DestinationPath), expressionVisitor);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\QueryExecutor.cs", parametro.DestinationPath), queryExecutor);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\QueryLanguage.cs", parametro.DestinationPath), queryLanguage);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\QueryMapping.cs", parametro.DestinationPath), queryMapping);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\QueryTypeSystem.cs", parametro.DestinationPath), queryTypeSystem);
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\TSqlORM\\SqlFormatter.cs", parametro.DestinationPath), sqlFormatter);

            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\FastInvoke.cs", parametro.DestinationPath), fastInvoke);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\MapExtension.cs", parametro.DestinationPath), mapExtension);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\CachingMannager.cs", parametro.DestinationPath), cachingMannager);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\Enuns\\ECacheAcao.cs", parametro.DestinationPath), eCacheAcao);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\Events\\CacheChangedEventArgs.cs", parametro.DestinationPath), cacheChangedEventArgs);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\Events\\CacheChangedEventHandler.cs", parametro.DestinationPath), cacheChangedEventHandler);
            File.WriteAllText(string.Format("{0}\\DAL\\ORM\\Caching\\Interfaces\\ICachingProvider.cs", parametro.DestinationPath), cachingProvider);



            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\Factories\\ISqlFormatter.cs", parametro.DestinationPath), isSqlFormatter.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\Factories\\{1}.cs", parametro.DestinationPath, nomeProvider), provider.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));

            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\FuncoesCrud.cs", parametro.DestinationPath), funcoesCrud.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));
            File.WriteAllText(string.Format("{0}\\DAL\\DataDrain\\SqlLanguage.cs", parametro.DestinationPath), sqlLanguage.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));

            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\Base\\CrudBase.cs", parametro.DestinationPath), crudBase.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)).Replace("{namespace}", parametro.NameSpace));
            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\Conexao\\Singleton.cs", parametro.DestinationPath), singleton.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));
            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\Enumeradores\\ETipoConsulta.cs", parametro.DestinationPath), eTipoConsulta.Replace("TesteDAL", string.Format("{0}DAL", parametro.NameSpace)));
            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\CommandMap\\CmdMap.cs", parametro.DestinationPath), cmdMap);
            File.WriteAllText(string.Format("{0}\\DAL\\Apoio\\CommandMap\\Transaction.cs", parametro.DestinationPath), transaction);

        }
        public void CreateProjectFiles(Configuration parametros, ITemplateText dictionaryTemplates)
        {
            var returnCreateDirectory = OrmDirectory.Create(parametros.DestinationPath);

            if (returnCreateDirectory.Key)
            {
                new OrmBasicFiles(dictionaryTemplates).Create(parametros, "MySqlFormatter");
                OrmObjectFiles.Create(parametros, dictionaryTemplates);
                OrmProjectFiles.Create(parametros, "MySqlFormatter");
                AppConfig.WriteFile(parametros);
            }
            else
            {
                throw new SecurityException(returnCreateDirectory.Value);
            }
        }
        private static string AssinaProjeto(Configuration parametros)
        {
            var templateAssembly = FileFactory.RetornaTextoBase("ofnIylbmessA");
            var tmpAssInfo = string.Empty;

            if (parametros.AssinarProjeto)
            {
                if (string.IsNullOrEmpty(parametros.CaminhoStrongName))
                {
                    var nomeSnkFile = string.Format("{0}.snk", parametros.NameSpace);

                    GerarKey(string.Format("{0}\\{1}", parametros.DestinationPath, nomeSnkFile));
                    tmpAssInfo = string.Format("[assembly: AssemblyKeyFile({0}\"{1}{2}\")]", "@", "..\\", nomeSnkFile);
                }
                else
                {
                    tmpAssInfo = string.Format("[assembly: AssemblyKeyFile({0}\"{1}\")]", "@", parametros.CaminhoStrongName);
                }
            }

            templateAssembly = templateAssembly.Replace("{sing}", tmpAssInfo);
            return templateAssembly;
        }
        public string GeneratePocoFiles(string tableName, DatabaseObjectInfo objectDatabase, Configuration configuration)
        {
            var retorno = new StringBuilder();

            CriaCabecario(tableName, configuration.NameSpace, retorno, configuration);

            CriaPropriedades(objectDatabase.Columns, retorno, objectDatabase.ForeignKeys, configuration);

            return retorno.ToString();
        }
        private static void GeraProjetoInterface(Configuration parametros, string guidProjInterface, List<string> arquivosInterface, string templateAssembly)
        {
            var trocasInterface = new Hashtable
            {
                {"[guid]", guidProjInterface},
                {"[namespace]", parametros.NameSpace},
                {"[arquivos]", string.Join("\n", arquivosInterface.ToArray())}
            };

            var projInterface = FileFactory.RetornaTextoBase("secafretnIetalpmeT");
            projInterface = trocasInterface.Cast<DictionaryEntry>().Aggregate(projInterface, (current, entry) => current.Replace(entry.Key.ToString(), entry.Value.ToString()));
            projInterface = projInterface.Replace("[versao]", parametros.VersaoFramework);

            var assemblyInterface = templateAssembly.Replace("[log]", "");
            assemblyInterface = assemblyInterface.Replace("[namespace]", parametros.NameSpace);
            assemblyInterface = assemblyInterface.Replace("[guid]", guidProjInterface);

            File.WriteAllText(string.Format("{0}\\Interfaces\\{1}Interfaces.csproj", parametros.DestinationPath, parametros.NameSpace), projInterface);
            File.WriteAllText(string.Format("{0}\\Interfaces\\Properties\\AssemblyInfo.cs", parametros.DestinationPath), assemblyInterface);
        }
        private static void GeraProjetoDal(Configuration parametros, string provider, string guidProjDAL, string guidProjInterface, string guidProjTO, List<string> arquivosDAL, StringBuilder sbLog4Net, string templateAssembly)
        {
            var trocasDAL = new Hashtable
            {
                {"[guid]", guidProjDAL},
                {"[namespace]", parametros.NameSpace},
                {"[guidInterface]", guidProjInterface},
                {"[guidTO]", guidProjTO},
                {"[provider]", string.Format("<Compile Include=\"DataDrain\\Factories\\{0}.cs\" />", provider)},
                {"[arquivos]", string.Join("\n", arquivosDAL.ToArray())},
            };

            var projDAL = FileFactory.RetornaTextoBase("SSLADetalpmet").Replace("[log]", "");

            projDAL = trocasDAL.Cast<DictionaryEntry>().Aggregate(projDAL, (current, entry) => current.Replace(entry.Key.ToString(), entry.Value.ToString()));
            projDAL = projDAL.Replace("[versao]", parametros.VersaoFramework);


            var assemblyDAL = templateAssembly.Replace("[camada]", "DAL").Replace("[log]", "");
            
            assemblyDAL = assemblyDAL.Replace("[namespace]", parametros.NameSpace);
            assemblyDAL = assemblyDAL.Replace("[guid]", guidProjDAL);


            File.WriteAllText(string.Format("{0}\\DAL\\{1}DAL.csproj", parametros.DestinationPath, parametros.NameSpace), projDAL);
            File.WriteAllText(string.Format("{0}\\DAL\\Properties\\AssemblyInfo.cs", parametros.DestinationPath), assemblyDAL);
        }
        private static void GeraProjetoBll(Configuration parametros, string guidProjBLL, string guidProjInterface, string guidProjTO, string guidProjDAL, List<string> arquivosBLL, StringBuilder sbLog4Net, string templateAssembly)
        {
            var trocasBLL = new Hashtable
            {
                {"[guid]", guidProjBLL},
                {"[namespace]", parametros.NameSpace},
                {"[guidInterface]", guidProjInterface},
                {"[guidTO]", guidProjTO},
                {"[guidDAL]", guidProjDAL},
                {"[arquivos]", string.Join("\n", arquivosBLL.ToArray())},
            };

            var projBLL = FileFactory.RetornaTextoBase("LLBetalpmet").Replace("[log]", "");
            projBLL = trocasBLL.Cast<DictionaryEntry>().Aggregate(projBLL, (current, entry) => current.Replace(entry.Key.ToString(), entry.Value.ToString()));
            projBLL = projBLL.Replace("[versao]", parametros.VersaoFramework);

            var assemblyBLL = templateAssembly.Replace("[camada]", "bll").Replace("[log]", "");
            assemblyBLL = assemblyBLL.Replace("[namespace]", parametros.NameSpace);
            assemblyBLL = assemblyBLL.Replace("[guid]", guidProjBLL);


            File.WriteAllText(string.Format("{0}\\BLL\\{1}BLL.csproj", parametros.DestinationPath, parametros.NameSpace), projBLL);
            File.WriteAllText(string.Format("{0}\\BLL\\Properties\\AssemblyInfo.cs", parametros.DestinationPath), assemblyBLL);
        }
        public string GenerateDataAccesFiles(string nomeTabela, DatabaseObjectInfo objectDatabase, Configuration configuration)
        {

            string textoBase;
            switch (objectDatabase.DatabaseObjectType)
            {
                case EDatabaseObjectType.Tabela:
                    textoBase = RetornaTextoBase("padraoDALNativo");
                    break;
                case EDatabaseObjectType.Query:
                case EDatabaseObjectType.Procedure:
                    textoBase = RetornaTextoBase("padraoDALProc");
                    textoBase = textoBase.Replace("{parametros}", string.Join(", ", objectDatabase.StoredProcedureParameters.Select(p => string.Format("{0} {1}", p.ParameterDotNetType, p.ParameterName))));

                    var sbParametros = new StringBuilder();

                    foreach (var parametro in objectDatabase.StoredProcedureParameters)
                    {
                        sbParametros.AppendLine(string.Format("cmd.Parameters.AddWithValue(\"{0}\", {0});", parametro.ParameterName));
                    }

                    textoBase = textoBase.Replace("{carregaParametros}", sbParametros.ToString());
                    textoBase = textoBase.Replace("{query}", objectDatabase.DatabaseObjectType == EDatabaseObjectType.Procedure ? nomeTabela : objectDatabase.QuerySql);
                    textoBase = textoBase.Replace("{proc}", objectDatabase.DatabaseObjectType == EDatabaseObjectType.Procedure ? "cmd.CommandType = CommandType.StoredProcedure;" : "");

                    break;
                case EDatabaseObjectType.View:
                    textoBase = RetornaTextoBase("padraoDALNativo");
                    textoBase = Regex.Replace(textoBase, "#region .: Persistencia :.(.|\n)*?#endregion", string.Empty);
                    break;
                default:
                    throw new ArgumentOutOfRangeException("tipoObjeto");
            }
            textoBase = Log ? textoBase.Replace("[log]", "Log.Error(ex.Message, ex);").Replace("[logHeader]", string.Format("private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof({0}DAL));", nomeTabela)) : textoBase.Replace("[log]", "").Replace("[logHeader]", "");

            return textoBase.Replace("{namespace}", configuration.NameSpace).Replace("{classe}", (nomeTabela));

        }
        public string GenerateBusinessFiles(string nomeTabela, DatabaseObjectInfo objectDatabase, Configuration configuration)
        {

            string textoBase;
            switch (objectDatabase.DatabaseObjectType)
            {
                case EDatabaseObjectType.Tabela:
                    textoBase = RetornaTextoBase("padraoBLLNativo");
                    break;
                case EDatabaseObjectType.Query:
                case EDatabaseObjectType.Procedure:
                    textoBase = RetornaTextoBase("padraoBLLProc");
                    textoBase = textoBase.Replace("{parametros}", string.Join(", ", objectDatabase.StoredProcedureParameters.Select(p => string.Format("{0} {1}", p.ParameterDotNetType, p.ParameterName))));
                    textoBase = textoBase.Replace("{parametros2}", string.Join(", ", objectDatabase.StoredProcedureParameters.Select(p => p.ParameterName)));
                    break;
                case EDatabaseObjectType.View:
                    textoBase = RetornaTextoBase("padraoBLLNativo");
                    textoBase = Regex.Replace(textoBase, "#region .: CRUD :.(.|\n)*?#endregion", string.Empty);
                    break;
                default:
                    throw new ArgumentOutOfRangeException("tipoObjeto");
            }
            textoBase = Log ? textoBase.Replace("[log]", "Log.Error(ex.Message, ex);").Replace("[logHeader]", string.Format("private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof({0}BLL));", nomeTabela)) : textoBase.Replace("[log]", "").Replace("[logHeader]", "");

            return textoBase.Replace("{namespace}", configuration.NameSpace).Replace("{classe}", (nomeTabela));

        }
        private static void GeraProjetoWcf(Configuration parametros, string guidProjWcf)
        {
            var servicos = new List<string>();
            var servicosCode = new List<string>();
            var servicosInterface = new List<string>();

            Directory.CreateDirectory(string.Format("{0}\\{1}Wcf\\", parametros.DestinationPath, parametros.NameSpace));
            Directory.CreateDirectory(string.Format("{0}\\{1}Wcf\\Interface", parametros.DestinationPath, parametros.NameSpace));
            Directory.CreateDirectory(string.Format("{0}\\{1}Wcf\\Properties", parametros.DestinationPath, parametros.NameSpace));

            var assemblyInfoWcf = FileFactory.RetornaTextoBase("AssemblyInfoWcf").Replace("{namespace}", parametros.NameSpace).Replace("{guid}", Guid.NewGuid().ToString("D"));
            File.WriteAllText(string.Format("{0}\\{1}Wcf\\Properties\\AssemblyInfo.cs", parametros.DestinationPath, parametros.NameSpace), assemblyInfoWcf);

            foreach (var classe in parametros.ObjetosMapeaveis)
            {
                File.WriteAllText(string.Format("{0}\\{1}Wcf\\{2}.cs", parametros.DestinationPath, parametros.NameSpace, classe.Name), string.Format("<%@ ServiceHost Language=\"C#\" Debug=\"true\" Service=\"CorpWcf.Aceite\" CodeBehind=\"{0}.svc.cs\" %>", classe.Name));

                var corpoServico = FileFactory.RetornaTextoBase("corpoServico").Replace("{namespace}", parametros.NameSpace).Replace("{classe}", classe.Name);
                File.WriteAllText(string.Format("{0}\\{1}Wcf\\{2}.svc.cs", parametros.DestinationPath, parametros.NameSpace, classe.Name), corpoServico);

                var corpoInterfaceServico = FileFactory.RetornaTextoBase("corpoInterfaceServico").Replace("{namespace}", parametros.NameSpace).Replace("{classe}", classe.Name); ;
                File.WriteAllText(string.Format("{0}\\{1}Wcf\\Interface\\I{2}.cs", parametros.DestinationPath, parametros.NameSpace, classe.Name), corpoInterfaceServico);

                servicos.Add(string.Format("<Content Include=\"{0}.svc\" />", classe.Name));
                servicosCode.Add(string.Format("<Compile Include=\"{0}.svc.cs\">{1}<DependentUpon>{0}.svc</DependentUpon>{1}</Compile>", classe.Name, Environment.NewLine));
                servicosInterface.Add(string.Format("<Compile Include=\"Interface\\I{0}.cs\" />", classe.Name));
            }

            var corpoProjetoWcf = FileFactory.RetornaTextoBase("corpoProjetoWcf").Replace("{namespace}", parametros.NameSpace)
                .Replace("{servicos}", string.Join("\n", servicos))
                .Replace("{servicosCode}", string.Join("\n", servicosCode))
                .Replace("[guid]", guidProjWcf)
                .Replace("{servicosInterface}", string.Join("\n", servicosInterface));

            File.WriteAllText(string.Format("{0}\\{1}Wcf\\{2}Wcf.csproj", parametros.DestinationPath, parametros.NameSpace, parametros.NameSpace), corpoProjetoWcf);

            var corpoWebConfig = FileFactory.RetornaTextoBase("corpoWebConfig");
            File.WriteAllText(string.Format("{0}\\{1}Wcf\\Web.config", parametros.DestinationPath, parametros.NameSpace), corpoWebConfig);

        }
        private static void CriaCabecario(string nomeTabela, string strNamespace, StringBuilder retorno, Configuration parametros)
        {
            retorno.AppendFormat("using System;{0}", Environment.NewLine);

            if (parametros.MapLinq)
            {
                retorno.AppendFormat("using System.ComponentModel;{0}", Environment.NewLine);
                retorno.AppendFormat("using System.ComponentModel.DataAnnotations;{0}", Environment.NewLine);
                retorno.AppendFormat("using System.Data.Linq.Mapping;{0}", Environment.NewLine);
            }
            if (parametros.MapWcf)
            {
                retorno.AppendFormat("using System.Runtime.Serialization;{0}", Environment.NewLine);
            }

            retorno.AppendLine();
            retorno.AppendFormat("{0}{1}", string.Format("namespace {0}TO", strNamespace), Environment.NewLine);
            retorno.AppendFormat("{{{0}", Environment.NewLine);

            if (parametros.MapLinq)
            {
                retorno.AppendFormat("{0}{1}", string.Format("[Table(Name = \"{0}\")]", nomeTabela), Environment.NewLine);
            }
            if (parametros.MapWcf)
            {
                retorno.AppendFormat("{0}{1}", "[DataContract]", Environment.NewLine);
            }

            retorno.AppendFormat("{0}{1}", string.Format("public class {0}TO", RetornaNomeClasseAjustado(nomeTabela)), Environment.NewLine);
            retorno.AppendFormat("{{{0}{0}", Environment.NewLine);
        }