using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

//Se incluyen las referencias necesarias, ademas de las de acceso a 
//datos y Sql, los namespaces “using System.Collections.Generic” y
//“using System.Text” serán utilizados para poder utilizar una lista 
//generica para la devolucion de datos y un contructor de cadenas para
//crear la cadena de consultas.

using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;

namespace Departamentos
{

    /// <summary>
    /// Esta clase simula la capa de datos, 
    /// para acceder a la capa de datos utiliza la 
    /// cadena de conexion ubicada en el archivo 
    /// de configuracion.
    /// Los metodos desarrollados en esta clase utilizan 
    /// ADO.Net, y el namespace "System.Data.SQLClient"
    /// dado que nos conectaremos con un motor SQL.
    /// Tambien se incluyen los namespaces "System.Collection.Generics"
    /// para utilizar la lista "generica" de departamentos, y 
    /// "System.Text" para utilizar la clase StringBuilder para armar
    /// las cadenas de consultas.
    /// </summary>
    public class AccesoDatos
    {
        public AccesoDatos()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        /// <summary>
        /// Este metodo obtiene los departamentos por grupos.
        /// </summary>
        /// <param name="grupo">El grupo seleccionado del combo</param>
        /// <returns>Una lista de departamentos.</returns>
        public List<Departamento> ObtenerDepartamentos(string grupo)
        {
            List<Departamento> departamentos = new List<Departamento>();
            
            StringBuilder query = new StringBuilder();
            query.Append("SELECT ");
            query.Append("DepartmentID, ");
            query.Append("Name, ");
            query.Append("ModifiedDate ");
            query.Append("FROM [HumanResources].[Department] ");
            query.AppendFormat("WHERE GroupName = '{0}' ", grupo);
            query.Append("Order By Name");

            SqlCommand command = new SqlCommand();
            command.CommandText = query.ToString();

            SqlConnection conn = null;

            try
            {
                conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ADVENTUREWORKSConnectionString"].ConnectionString);
                command.Connection = conn;
                conn.Open();

                using (SqlDataReader dr = command.ExecuteReader())
                {
                    if (dr.HasRows)
                    {
                        while(dr.Read())
                        {
                            Departamento dep = new Departamento(Convert.ToInt32( dr[0]), dr[1].ToString(), grupo , Convert.ToDateTime( dr[2] ) );
                            departamentos.Add(dep);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
               throw ex;
            }
            finally 
            {
                conn.Close();
            }
            return departamentos;
        }

        /// <summary>
        /// Este metodo obtiene los grupos para poder llenar 
        /// el combo y permitir la seleccion de departamentos por 
        /// grupos.
        /// </summary>
        /// <returns>Lista de grupos</returns>
        public List<string> ObtenerGrupos()
        {
            List<string> grupos = new List<string>();

            StringBuilder query = new StringBuilder();
            query.Append("Select ");
            query.Append("GroupName ");
            query.Append("FROM [HumanResources].[Department] ");
            query.Append("Group By GroupName");


            SqlCommand command = new SqlCommand();
            command.CommandText = query.ToString();

            SqlConnection conn = null;

            try
            {
                conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ADVENTUREWORKSConnectionString"].ConnectionString);
                command.Connection = conn;
                conn.Open();

                using (SqlDataReader dr = command.ExecuteReader())
                {
                    if (dr.HasRows)
                    {
                        while( dr.Read() )
                        {                            
                            grupos.Add(dr[0].ToString());
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
            return grupos;

        }

    }
}