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

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

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

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

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

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

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

			return GetDSFT(dr);
		}

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

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

			return GetDSFT(dr);
		}
		
		/// <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 DSCosto GetDSFT(SqlDataReader dr)
		{
			DSCosto DSFTCosto = new DSCosto();
			DSCosto.CostoRow rowCosto;

			while (dr.Read())
			{
				rowCosto = DSFTCosto.Costo.NewCostoRow();

				rowCosto.IdNumero = dr.IsDBNull(dr.GetOrdinal("IdNumero")) ? "": dr.GetString(dr.GetOrdinal("IdNumero"));
				rowCosto.idCentro = dr.IsDBNull(dr.GetOrdinal("idCentro")) ? "": dr.GetString(dr.GetOrdinal("idCentro"));
				rowCosto.Nombre = dr.IsDBNull(dr.GetOrdinal("Nombre")) ? "": dr.GetString(dr.GetOrdinal("Nombre"));
				rowCosto.IdUser = dr.IsDBNull(dr.GetOrdinal("IdUser")) ? "": dr.GetString(dr.GetOrdinal("IdUser"));
				DSFTCosto.Costo.AddCostoRow(rowCosto);
			}

			dr.Close();

			return DSFTCosto;
		}
	}
}