using System;
using System.Data;
using System.Data.SqlClient;

using Municipalidad.Utils;
using Seguridad.DataModel;
using Seguridad.SingleObjects;
using Seguridad.DataSetFT;

namespace Seguridad.DataAccess
{
	public abstract class ModuloWebCRUD
	{
		//Field para almacenar la conexión
		private SqlConnection _connection = null;
		private SqlTransaction _transaction = null;

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="connection"></param>
		public ModuloWebCRUD(SqlConnection connection)
		{
			_connection = connection;
		}

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="transaction"></param>
		public ModuloWebCRUD(SqlTransaction transaction)
		{
			_transaction = transaction;
		}

		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		public DSModuloWeb SelectAll()
		{
			//Almacena retorno del SqlCommand
			SqlDataReader dr;

			try
			{
				//Ejecuta el SqlCommand
				dr = UtilsDB.ExecuteDataReader(_connection, CommandType.StoredProcedure, Schema.ModuloWeb.SP_SELECT_ALL, null);
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return GetDSFT(dr);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idModuloWeb"></param>
		/// <returns></returns>
		public DSModuloWeb SelectByID(int idModuloWeb)
		{
			//Almacena retorno del SqlCommand
			SqlDataReader dr;

			try
			{
				//Ejecuta el SqlCommand
				dr = UtilsDB.ExecuteDataReader(_connection, CommandType.StoredProcedure, Schema.ModuloWeb.SP_SELECT_BY_PK, 
							UtilsDB.MP("@idModuloWeb", SqlDbType.Int, 0, (idModuloWeb == int.MinValue? (object)null: idModuloWeb)));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return GetDSFT(dr);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="moduloWeb"></param>
		/// <returns></returns>
		public int Insert(SglModuloWeb moduloWeb)
		{
			return Save(moduloWeb, false);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="moduloWeb"></param>
		public void Update(SglModuloWeb moduloWeb)
		{
			Save(moduloWeb, true);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idModuloWeb"></param>
		public void Delete(int idModuloWeb)
		{
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQueryReturn(_transaction, CommandType.StoredProcedure, Schema.ModuloWeb.SP_DELETE, 
							UtilsDB.MP("@idModuloWeb", SqlDbType.Int, 0, (idModuloWeb == int.MinValue? (object)null: idModuloWeb)));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="moduloWeb"></param>
		/// <param name="operation">true = actualizar, false = agregar</param>
		/// <returns></returns>
		private int Save(SglModuloWeb moduloWeb, bool operation)
		{
			//Almacena retorno del SqlCommand
			int retval;

			try
			{
				//Ejecuta el SqlCommand
				retval = UtilsDB.ExecuteNonQueryReturn(_transaction, CommandType.StoredProcedure, Schema.ModuloWeb.SP_INSERT, 
					(operation?UtilsDB.MP("@idModuloWeb", SqlDbType.Int, 0, (moduloWeb.idModuloWeb == int.MinValue? (object)null: moduloWeb.idModuloWeb)): null), 
					UtilsDB.MP("@idSistema", SqlDbType.Int, 0, (moduloWeb.idSistema == int.MinValue? (object)null: moduloWeb.idSistema)), 
					UtilsDB.MP("@Link", SqlDbType.VarChar, 200, moduloWeb.Link), 
					UtilsDB.MP("@NombreDisplay", SqlDbType.VarChar, 50, moduloWeb.NombreDisplay), 
					UtilsDB.MP("@Nivel", SqlDbType.Int, 0, (moduloWeb.Nivel == int.MinValue? (object)null: moduloWeb.Nivel)), 
					UtilsDB.MP("@idNivelAnterior", SqlDbType.Int, 0, (moduloWeb.idNivelAnterior == int.MinValue? (object)null: moduloWeb.idNivelAnterior)), 
					UtilsDB.MP("@EnableInAdmin", SqlDbType.Bit, 0, moduloWeb.EnableInAdmin), 
					UtilsDB.MP("@EnableInUser", SqlDbType.Bit, 0, moduloWeb.EnableInUser));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return retval;
		}

		/// <summary>
		/// Genera un DataSet fuertemente tipeado desde un DataReader
		/// </summary>
		/// <param name="dr">Objeto DataReader con datos para llenar el DataSet</param>
		/// <returns>DataSet fuertemente tipeado</returns>
		internal DSModuloWeb GetDSFT(SqlDataReader dr)
		{
			DSModuloWeb DSFTModuloWeb = new DSModuloWeb();
			DSModuloWeb.ModuloWebRow rowModuloWeb;

			while (dr.Read())
			{
				rowModuloWeb = DSFTModuloWeb.ModuloWeb.NewModuloWebRow();
				rowModuloWeb.idModuloWeb = dr.IsDBNull(dr.GetOrdinal("idModuloWeb")) ? int.MinValue: dr.GetInt32(dr.GetOrdinal("idModuloWeb"));
				rowModuloWeb.idSistema = dr.IsDBNull(dr.GetOrdinal("idSistema")) ? int.MinValue: dr.GetInt32(dr.GetOrdinal("idSistema"));
				rowModuloWeb.Link = dr.IsDBNull(dr.GetOrdinal("Link")) ? "": dr.GetString(dr.GetOrdinal("Link"));
				rowModuloWeb.NombreDisplay = dr.IsDBNull(dr.GetOrdinal("NombreDisplay")) ? "": dr.GetString(dr.GetOrdinal("NombreDisplay"));
				rowModuloWeb.Nivel = dr.IsDBNull(dr.GetOrdinal("Nivel")) ? int.MinValue: dr.GetInt32(dr.GetOrdinal("Nivel"));
				rowModuloWeb.idNivelAnterior = dr.IsDBNull(dr.GetOrdinal("idNivelAnterior")) ? int.MinValue: dr.GetInt32(dr.GetOrdinal("idNivelAnterior"));
				rowModuloWeb.EnableInAdmin = dr.IsDBNull(dr.GetOrdinal("EnableInAdmin")) ? false: dr.GetBoolean(dr.GetOrdinal("EnableInAdmin"));
				rowModuloWeb.EnableInUser = dr.IsDBNull(dr.GetOrdinal("EnableInUser")) ? false: dr.GetBoolean(dr.GetOrdinal("EnableInUser"));
				DSFTModuloWeb.ModuloWeb.AddModuloWebRow(rowModuloWeb);
			}

			dr.Close();

			return DSFTModuloWeb;
		}
	}
}