using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace Generator_Class_BD.Clases.Utilitarios
{
    public class Util
    {
        public static void CrearArchivo(string sFileName, string path, StringBuilder cuerpo)
        {
            Directory.CreateDirectory(path);
            StreamWriter writer = File.CreateText(sFileName);
            writer.WriteLine(cuerpo.ToString());
            writer.Close();
        }
        public static StringBuilder GenerarControles(string tipo, string campo, string vNombreClase, bool Edit)
        {
            StringBuilder cuerpo = new StringBuilder();

            switch (tipo)
            {
                case "char":
                    cuerpo = GenerarTextField(campo, vNombreClase, "", "", Edit);
                    break;
                case "datetime":
                    cuerpo = GenerarTextField(campo, vNombreClase, "date", "", Edit);
                    break;
                case "float":
                    cuerpo = GenerarTextField(campo, vNombreClase, "number", "{ { min: \"0\", max: \"10000000\", step: \"1\" } }", Edit);
                    break;

                case "int":
                    cuerpo = GenerarTextField(campo, vNombreClase, "number", "{ { min: \"0\", max: \"10000000\", step: \"1\" } }", Edit);
                    break;
                case "varchar":
                    cuerpo = GenerarTextField(campo, vNombreClase, "", "", Edit);
                    break;

                case "bit":
                    cuerpo = GenerarSwitch(campo, vNombreClase, Edit);
                    break;

                case "smallint":
                    cuerpo = GenerarTextField(campo, vNombreClase, "number", "{ { min: \"0\", max: \"99\", step: \"1\" } }", Edit);
                    break;
                case "bigint":
                    cuerpo = GenerarTextField(campo, vNombreClase, "number", "{ { min: \"0\", max: \"10000000\", step: \"1\" } }", Edit);
                    break;
                default:
                    cuerpo = GenerarTextField(campo, vNombreClase, "", "", Edit);
                    break;
            }

            return cuerpo;
            // "<Switch id=\"EsEditableUsuario\" name=\"EsEditableUsuario\" color=\"primary\" checked={addNewConfigDetails.EsEditableUsuario} onChange={(e) => onChangeAddNewConfigDetails('EsEditableUsuario', e.target.checked)} />";
        }
        private static StringBuilder GenerarSwitch(string campo, string vNombreClase, bool editar)
        {
            StringBuilder cuerpo = new StringBuilder();

            cuerpo.Append("\t\t\t\t\t<Col sm=\"6\">\n");
            cuerpo.Append("\t\t\t\t\t\t<FormControlLabel\n");
            cuerpo.AppendFormat("\t\t\t\t\t\t\tlabel={0}\n", "{<IntlMessages id=\"" + vNombreClase + "." + campo + "\" />}");
            cuerpo.Append("\t\t\t\t\t\t\tcontrol={\n");
            cuerpo.Append("\t\t\t\t\t\t\t\t<Switch\n");

            if (editar)
            {
                cuerpo.Append("\t\t\t\t\t\t\t\t\tchecked={editar" + vNombreClase + "." + campo + "}\n");
            }

            cuerpo.Append("\t\t\t\t\t\t\t\t\tinputProps={{\n");
            cuerpo.AppendFormat("\t\t\t\t\t\t\t\t\t\tname: '{0}',\n", campo);
            cuerpo.AppendFormat("\t\t\t\t\t\t\t\t\t\tid: '{0}',\n", campo);
            cuerpo.Append("\t\t\t\t\t\t\t\t\t}}\n");

            if (editar)
            {
                cuerpo.Append("\t\t\t\t\t\t\t\t\tonChange={alEditar" + vNombreClase + "Detalle}\n");
            }
            else
            {
                cuerpo.Append("\t\t\t\t\t\t\t\t\tonChange={alCrear" + vNombreClase + "Detalle}\n");
            }

            cuerpo.Append("\t\t\t\t\t\t\t\t\tcolor=\"primary\"\n");
            cuerpo.Append("\t\t\t\t\t\t\t\t/>\n");
            cuerpo.Append("\t\t\t\t\t\t\t}\n");
            cuerpo.Append("\t\t\t\t\t\t/>\n");
            cuerpo.Append("\t\t\t\t\t</Col>\n");
            return cuerpo;

        }
        private static StringBuilder GenerarTextField(string campo, string vNombreClase, string tipo, string inputProps, bool Edit)
        {
            StringBuilder cuerpo = new StringBuilder();

            cuerpo.Append("\t\t\t\t\t<Col sm=\"6\">\n");
            cuerpo.Append("\t\t\t\t\t\t<TextField\n");
            cuerpo.Append("\t\t\t\t\t\t\trequired\n");
            cuerpo.AppendFormat("\t\t\t\t\t\t\tlabel={0}\n", "{<IntlMessages id=\"" + vNombreClase + "." + campo + "\" />}");
            cuerpo.Append("\t\t\t\t\t\t\tmargin=\"normal\"\n");
            cuerpo.Append("\t\t\t\t\t\t\tinputProps={{\n");
            cuerpo.AppendFormat("\t\t\t\t\t\t\t\tname: '{0}',\n", campo);
            cuerpo.AppendFormat("\t\t\t\t\t\t\t\tid: '{0}',\n", campo);
            cuerpo.Append("\t\t\t\t\t\t\t}}\n");

            if (tipo == "date")
            {
                cuerpo.Append("\t\t\t\t\t\t\tInputLabelProps={\n");
                cuerpo.Append("\t\t\t\t\t\t\t\t{\n");
                cuerpo.Append("\t\t\t\t\t\t\t\t\tshrink: true,\n");
                cuerpo.Append("\t\t\t\t\t\t\t\t}\n");
                cuerpo.Append("\t\t\t\t\t\t\t}\n");
            }

            cuerpo.AppendFormat("\t\t\t\t\t\t\ttype=\"" + tipo + "\"\n");

            if (Edit)
            {
                cuerpo.Append("\t\t\t\t\t\t\tvalue={editar" + vNombreClase + "." + campo + "}\n");
                cuerpo.Append("\t\t\t\t\t\t\tonChange={alEditar" + vNombreClase + "Detalle}\n");
            }
            else
            {
                cuerpo.Append("\t\t\t\t\t\t\tonChange={alCrear" + vNombreClase + "Detalle}\n");
            }

            cuerpo.Append("\t\t\t\t\t\t/>\n");
            cuerpo.Append("\t\t\t\t\t</Col>\n");

            return cuerpo;
        }
        public static String Convertir(string val)
        {
            string convertido = "";
            if (val.Length > 0)
            {
                convertido = val.Substring(0, 1).ToUpper() + val.Substring(1);
            }
            return convertido;
        }
        public static String ConvertirTipoGet(string tipo)
        {
            string convertido = "";

            switch (tipo)
            {
                //case "char":
                //    convertido = "GetString";
                case "datetime":
                    convertido = "GetDateTime";
                    break;
                case "float":
                    convertido = "GetDouble";
                    break;
                case "int":
                    convertido = "GetInt32";
                    break;
                case "varchar":
                    convertido = "GetString";
                    break;
                default:
                    convertido = "GetString";
                    break;
            }
            return convertido;
        }
        public static String ConvertirTipo(string tipo, string nullable)
        {
            string convertido = "";

            switch (tipo)
            {
                case "char":
                    convertido = "string";
                    break;
                case "datetime":
                    convertido = "DateTime";
                    break;
                case "float":
                    convertido = "double";
                    if (nullable == "YES")
                    {
                        convertido = "double?";
                    }
                    break;
                case "int":
                    convertido = "int";
                    if (nullable == "YES")
                    {
                        convertido = "int?";
                    }
                    break;
                case "varchar":
                    convertido = "string";
                    break;
                case "nvarchar":
                    convertido = "string";
                    break;
                case "uniqueidentifier":
                    convertido = "Guid";
                    if (nullable == "YES")
                    {
                        convertido = "Guid?";
                    }
                    break;
                case "image":
                    convertido = "byte[]";
                    break;
                case "smallint":
                    convertido = "short";
                    if (nullable == "YES")
                    {
                        convertido = "short?";
                    }
                    break;
                case "bit":
                    convertido = "bool";
                    if (nullable == "YES")
                    {
                        convertido = "bool?";
                    }
                    break;
                case "numeric":
                    convertido = "decimal";
                    if (nullable == "YES")
                    {
                        convertido = "decimal?";
                    }
                    break;
                case "bigint":
                    convertido = "Int64";
                    if (nullable == "YES")
                    {
                        convertido = "Int64?";
                    }
                    break;
                case "text":
                    convertido = "String";
                    break;
                case "varbinary":
                    convertido = "byte[]";
                    break;
                case "date":
                    convertido = "DateTime";
                    break;
                case "nchar":
                    convertido = "String";
                    break;
                case "ntext":
                    convertido = "String";
                    break;
                case "decimal":
                    convertido = "decimal";
                    if (nullable == "YES")
                    {
                        convertido = "decimal?";
                    }
                    break;
                case "smalldatetime":
                    convertido = "DateTime";
                    break;
            }
            if ((convertido == "DateTime") && (nullable == "YES"))
            {
                convertido = "DateTime?";
            }
            return convertido;
        }
        public static String ConvertirTipo(string tipo)
        {
            string convertido = "";

            switch (tipo)
            {
                case "char":
                    convertido = "string";
                    break;
                case "datetime":
                    convertido = "DateTime";
                    break;
                case "float":
                    convertido = "double";
                    break;
                case "int":
                    convertido = "int";
                    break;
                case "varchar":
                    convertido = "string";
                    break;
                case "uniqueidentifier":
                    convertido = "Guid";
                    break;
                case "image":
                    convertido = "byte[]";
                    break;
                case "smallint":
                    convertido = "short";
                    break;
                case "bigint":
                    convertido = "Int64";
                    break;
                case "text":
                    convertido = "String";
                    break;
                case "varbinary":
                    convertido = "byte[]";
                    break;
                case "date":
                    convertido = "DateTime";
                    break;
                case "nchar":
                    convertido = "String";
                    break;
                case "ntext":
                    convertido = "String";
                    break;
                case "decimal":
                    convertido = "Decimal";
                    break;
                case "smalldatetime":
                    convertido = "DateTime";
                    break;
            }
            return convertido;
        }
        public static String ConvertirTipoSQL(string tipo)
        {
            string convertido = "";

            switch (tipo)
            {
                case "char":
                    convertido = "Char";
                    break;
                case "datetime":
                    convertido = "DateTime";
                    break;
                case "float":
                    convertido = "Float";
                    break;
                case "int":
                    convertido = "Int";
                    break;
                case "varchar":
                    convertido = "VarChar";
                    break;
                case "image":
                    convertido = "byte[]";
                    break;
                case "smallint":
                    convertido = "short";
                    break;
                case "bigint":
                    convertido = "Int64";
                    break;
            }
            return convertido;
        }
        public static string SeparadorPorMayusculas(string cadena)
        {
            string[] splitClass = Regex.Split(cadena, @"(?<!^)(?=[A-Z])");
            string respuesta = string.Join(" ", splitClass);
            return respuesta;
        }
        public static void GenerarSummaryPropiedades(StringBuilder cuerpo, string nombrePropiedad, string tipo)
        {
            cuerpo.Append("\t\t/// <summary>\n");
            if (tipo == "bool" || tipo == "bool?")
            {
                cuerpo.Append("\t\t/// Obtiene o establece un valor que indica si esta activo o no " + Util.SeparadorPorMayusculas(nombrePropiedad) + "\n");
            }
            else
            {
                cuerpo.Append("\t\t/// Obtiene o establece el " + Util.SeparadorPorMayusculas(nombrePropiedad) + "\n");
            }
            cuerpo.Append("\t\t/// </summary>\n");
        }
        public static String ConvertirTipoReact(string tipo, string nullable)
        {
            string convertido = "";

            switch (tipo)
            {
                case "char":
                    convertido = "string";
                    break;
                case "datetime":
                    convertido = "string";
                    break;
                case "float":
                    convertido = "boolean";
                    break;
                case "int":
                    convertido = "number";
                    break;
                case "varchar":
                    convertido = "string";
                    break;
                case "nvarchar":
                    convertido = "string";
                    break;
                case "uniqueidentifier":
                    convertido = "string";
                    break;
                case "image":
                    convertido = "string";
                    break;
                case "smallint":
                    convertido = "number";
                    break;
                case "bit":
                    convertido = "boolean";
                    break;
                case "numeric":
                    convertido = "number";
                    break;
                case "bigint":
                    convertido = "number";
                    break;
                case "text":
                    convertido = "string";
                    break;
                case "varbinary":
                    convertido = "string";
                    break;
                case "date":
                    convertido = "string";
                    break;
                case "time":
                    convertido = "string";
                    break;
                case "nchar":
                    convertido = "string";
                    break;
                case "ntext":
                    convertido = "string";
                    break;
                case "geography":
                    convertido = "string";
                    break;
                case "decimal":
                    convertido = "number";
                    break;
                case "smalldatetime":
                    convertido = "string";
                    break;
                case "tinyint":
                    convertido = "number";
                    break;
            }
            return convertido;
        }
        public static String AsignarValorTipoReact(string tipo)
        {
            string convertido = "";

            switch (tipo)
            {
                case "char":
                    convertido = "''";
                    break;
                case "datetime":
                    convertido = "''";
                    break;
                case "float":
                    convertido = "true";
                    break;
                case "int":
                    convertido = "0";
                    break;
                case "varchar":
                    convertido = "''";
                    break;
                case "nvarchar":
                    convertido = "''";
                    break;
                case "uniqueidentifier":
                    convertido = "''";
                    break;
                case "image":
                    convertido = "0";
                    break;
                case "smallint":
                    convertido = "''";
                    break;
                case "bit":
                    convertido = "true";
                    break;
                case "numeric":
                    convertido = "0";
                    break;
                case "bigint":
                    convertido = "0";
                    break;
                case "text":
                    convertido = "''";
                    break;
                case "varbinary":
                    convertido = "0";
                    break;
                case "date":
                    convertido = "''";
                    break;
                case "nchar":
                    convertido = "''";
                    break;
                case "ntext":
                    convertido = "''";
                    break;
                case "decimal":
                    convertido = "0";
                    break;
                case "smalldatetime":
                    convertido = "''";
                    break;
                case "tinyint":
                    convertido = "1";
                    break;
            }
            return convertido;
        }

        public static string PascalACamel(string nombreEntidad)
        {
            string camel;
            camel = Char.ToLowerInvariant(nombreEntidad[0]) + nombreEntidad.Substring(1);
            return camel;
        }

        public static string CamelAPascal(string nombreEntidad)
        {
            string camel;
            camel = Char.ToUpperInvariant(nombreEntidad[0]) + nombreEntidad.Substring(1);
            return camel;
        }
    }
}
