using Generator_Class_BD.Clases.Consultas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Generator_Class_BD
{
    public partial class FrmCamposTabla : Form
    {
        private string _cadenaTablas;
        private string _cadenaConexion;
        private string _baseDatos;
        private string _NombreObjeto;
        private FormSelector _form2;

        public string cadenaTablas
        {
            get { return _cadenaTablas; }
            set { _cadenaTablas = value; }
        }

        public string cadenaConexion
        {
            get { return _cadenaConexion; }
            set { _cadenaConexion = value; }
        }

        public string baseDatos
        {
            get { return _baseDatos; }
            set { _baseDatos = value; }
        }

        public string NombreObjeto
        {
            get { return _NombreObjeto; }
            set { _NombreObjeto = value; }
        }

        public List<Consulta> Objeto { get; set; }

        public FrmCamposTabla(FormSelector form2)
        {
            InitializeComponent();
            _form2 = form2;
        }

        private DataSet CargarCamposTablas()
        {
            SqlCommand cmd = new SqlCommand();
            SqlDataAdapter da = new SqlDataAdapter();
            DataSet ds = new DataSet();

            try
            {
                SqlConnection con = new SqlConnection(_cadenaConexion);
                con.Open();
                cmd.Connection = con;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = $"Use { _baseDatos} {string.Format(Recursos.RecursosBD.QueryCamposPorTablas, _cadenaTablas)}";
                da.SelectCommand = cmd;
                da.Fill(ds);
            }
            catch (SqlException x)
            {
                MessageBox.Show("Error de SQL :" + x.Message);
            }
            catch (Exception y)
            {
                MessageBox.Show("Error :" + y.Message);
            }
            return ds;
        }

        private void FrmCamposTabla_Load(object sender, EventArgs e)
        {
            dgvCamposTabla.DataSource = CargarCamposTablas().Tables[0];
        }

        private void cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            Consulta objetoConsultaEditar = Objeto.Where(x => x.NombreObjeto == _NombreObjeto).FirstOrDefault();

            foreach (DataGridViewRow fila in dgvCamposTabla.Rows)
            {
                bool filaSeleccionada = dgvCamposTabla.Rows[fila.Index].Cells["colCamposSelect"].Value == null ? false : (bool)dgvCamposTabla.Rows[fila.Index].Cells["colCamposSelect"].Value;

                if (filaSeleccionada)
                {
                    TablaRelacionada tablaRelacionada = objetoConsultaEditar.ListaTablasRelacionadas.Where(x => x.TablaNombre == fila.Cells["colCamposTabla"].Value.ToString() && x.IdFK == fila.Cells["colCamposFKId"].Value.ToString()).FirstOrDefault();

                    if (tablaRelacionada != null)
                    {
                        tablaRelacionada.ListaCampos.Add(new Campo
                        {
                            Nombre = fila.Cells["colCamposColumna"].Value.ToString(),
                            Alias = fila.Cells["colCamposTabla"].Value.ToString() + fila.Cells["colCamposColumna"].Value.ToString(),
                            TipoDato = fila.Cells["colCamposTipoDato"].Value.ToString(),
                            Nullable = fila.Cells["colCamposNullable"].Value.ToString()
                        });
                    }
                    else
                    {
                        objetoConsultaEditar.ListaTablasRelacionadas.Add(new TablaRelacionada
                        {
                            TablaNombre = fila.Cells["colCamposTabla"].Value.ToString(),
                            IdFK = fila.Cells["colCamposFKId"].Value.ToString(),
                            ListaCampos = new List<Campo>() {
                                new Campo
                                {
                                    Nombre = fila.Cells["colCamposColumna"].Value.ToString(),
                                    Alias = fila.Cells["colCamposTabla"].Value.ToString() + fila.Cells["colCamposColumna"].Value.ToString(),
                                    TipoDato = fila.Cells["colCamposTipoDato"].Value.ToString(),
                                    Nullable = fila.Cells["colCamposNullable"].Value.ToString()
                                }
                            }
                        });
                    }
                }
            }
            objetoConsultaEditar.ScriptLINQ = Relaciones.GenerarConsultaLINQ(objetoConsultaEditar);
            Objeto.Where(x => x.NombreObjeto == _NombreObjeto).ToList().ForEach(x => x = objetoConsultaEditar);
            _form2.listaConsultas = Objeto;
            this.Close();
        }

        private void dgvCamposTabla_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                if (dgvCamposTabla.Rows[e.RowIndex].Cells["colCamposSelect"].Value == null)
                    dgvCamposTabla.Rows[e.RowIndex].Cells["colCamposSelect"].Value = true;
                else if (bool.Parse(dgvCamposTabla.Rows[e.RowIndex].Cells["colCamposSelect"].Value.ToString()) == true)
                    dgvCamposTabla.Rows[e.RowIndex].Cells["colCamposSelect"].Value = false;
                else if (bool.Parse(dgvCamposTabla.Rows[e.RowIndex].Cells["colCamposSelect"].Value.ToString()) == false)
                    dgvCamposTabla.Rows[e.RowIndex].Cells["colCamposSelect"].Value = true;
            }
        }

        private void chkTodos_CheckedChanged(object sender, EventArgs e)
        {
            if (chkTodos.Checked)
            {
                foreach (DataGridViewRow row in dgvCamposTabla.Rows)
                {
                    row.Cells["colCamposSelect"].Value = true;
                }
            }
            else
            {
                foreach (DataGridViewRow row in dgvCamposTabla.Rows)
                {
                    row.Cells["colCamposSelect"].Value = false;
                }
            }
        }
    }
}
