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

namespace Municipalidad.Utils
{
	public class Auditoria
	{
		//Field para almacenar la conexión
		private SqlConnection _connection = null;

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

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

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

			return GetDSFT(dr);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idAuditoria"></param>
		/// <returns></returns>
		public DSAuditoria SelectByID(long idAuditoria)
		{
			//Almacena retorno del SqlCommand
			SqlDataReader dr;

			try
			{
				//Ejecuta el SqlCommand
				dr = UtilsDB.ExecuteDataReader(_connection, CommandType.StoredProcedure, STDSchema.Auditoria.SP_SELECT_BY_PK, 
							UtilsDB.MP("@idAuditoria", SqlDbType.BigInt, 0, (idAuditoria == long.MinValue? (object)null: idAuditoria)));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return GetDSFT(dr);
		}

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

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

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idAuditoria"></param>
		public void Delete(long idAuditoria)
		{
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQueryReturn(_connection, CommandType.StoredProcedure, STDSchema.Auditoria.SP_DELETE, 
							UtilsDB.MP("@idAuditoria", SqlDbType.BigInt, 0, (idAuditoria == long.MinValue? (object)null: idAuditoria)));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="auditoria"></param>
		/// <param name="operation"></param>
		/// <returns></returns>
		private int Save(SglAuditoria auditoria, bool operation)
		{
			//Almacena retorno del SqlCommand
			int retval;

			try
			{
				//Ejecuta el SqlCommand
				retval = UtilsDB.ExecuteNonQueryReturn(_connection, CommandType.StoredProcedure, STDSchema.Auditoria.SP_INSERT, 
					(operation? UtilsDB.MP("@idAuditoria", SqlDbType.BigInt, 0, (auditoria.idAuditoria == long.MinValue? (object)null: auditoria.idAuditoria)): null), 
					UtilsDB.MP("@idSistema", SqlDbType.Int, 0, (auditoria.idSistema == int.MinValue? (object)null: auditoria.idSistema)), 
					UtilsDB.MP("@idUsuario", SqlDbType.Int, 0, (auditoria.idUsuario == int.MinValue? (object)null: auditoria.idUsuario)), 
					UtilsDB.MP("@Fecha", SqlDbType.DateTime, 0, (auditoria.Fecha == DateTime.MinValue? (object)null: auditoria.Fecha)), 
					UtilsDB.MP("@idRegistro", SqlDbType.BigInt, 0, (auditoria.idRegistro == long.MinValue? (object)null: auditoria.idRegistro)), 
					UtilsDB.MP("@Descripcion", SqlDbType.VarChar, 50, auditoria.Descripcion), 
					UtilsDB.MP("@Accion", SqlDbType.Char, 1, auditoria.Accion), 
					UtilsDB.MP("@CodigoRegistro", SqlDbType.VarChar, 50, auditoria.CodigoRegistro));
			}
			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 DSAuditoria GetDSFT(SqlDataReader dr)
		{
			DSAuditoria DSFTAuditoria = new DSAuditoria();
			DSAuditoria.AuditoriaRow rowAuditoria;

			while (dr.Read())
			{
				rowAuditoria = DSFTAuditoria.Auditoria.NewAuditoriaRow();
				rowAuditoria.idAuditoria = dr.IsDBNull(dr.GetOrdinal("idAuditoria")) ? long.MinValue: dr.GetInt64(dr.GetOrdinal("idAuditoria"));
				rowAuditoria.idSistema = dr.IsDBNull(dr.GetOrdinal("idSistema")) ? int.MinValue: dr.GetInt32(dr.GetOrdinal("idSistema"));
				rowAuditoria.idUsuario = dr.IsDBNull(dr.GetOrdinal("idUsuario")) ? int.MinValue: dr.GetInt32(dr.GetOrdinal("idUsuario"));
				rowAuditoria.Fecha = dr.IsDBNull(dr.GetOrdinal("Fecha")) ? DateTime.MinValue: dr.GetDateTime(dr.GetOrdinal("Fecha"));
				rowAuditoria.idRegistro = dr.IsDBNull(dr.GetOrdinal("idRegistro")) ? long.MinValue: dr.GetInt64(dr.GetOrdinal("idRegistro"));
				rowAuditoria.Descripcion = dr.IsDBNull(dr.GetOrdinal("Descripcion")) ? "": dr.GetString(dr.GetOrdinal("Descripcion"));
				rowAuditoria.Accion = dr.IsDBNull(dr.GetOrdinal("Accion")) ? "": dr.GetString(dr.GetOrdinal("Accion"));
				rowAuditoria.CodigoRegistro = dr.IsDBNull(dr.GetOrdinal("CodigoRegistro")) ? "": dr.GetString(dr.GetOrdinal("CodigoRegistro"));
				DSFTAuditoria.Auditoria.AddAuditoriaRow(rowAuditoria);
			}

			dr.Close();

			return DSFTAuditoria;
		}
	}
}