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 UsuarioWebCRUD
	{
		//Field para almacenar la conexión
		private SqlConnection _connection = null;
		private SqlTransaction _transaction = null;

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

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

		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		public DSUsuarioWeb SelectAll()
		{
			//Almacena retorno del SqlCommand
			DataSet ds;

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

			return GetDSFT(ds);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idUsuarioWeb"></param>
		/// <returns></returns>
		public DSUsuarioWeb SelectByID(int idUsuarioWeb)
		{
			//Almacena retorno del SqlCommand
			DataSet ds;

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

			return GetDSFT(ds);
		}

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

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

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

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

			try
			{
				//Ejecuta el SqlCommand
				retval = UtilsDB.ExecuteNonQueryReturn(_transaction, CommandType.StoredProcedure, Schema.Usuarios.SP_INSERT, 
					UtilsDB.MP("@idUsuarioWeb", SqlDbType.Int, 0, (usuarioWeb.idUsuarioWeb == int.MinValue? (object)null: usuarioWeb.idUsuarioWeb)), 
					UtilsDB.MP("@Rut", SqlDbType.VarChar, 8, usuarioWeb.Rut), 
					UtilsDB.MP("@DV", SqlDbType.Char, 1, usuarioWeb.DV), 
					UtilsDB.MP("@Nombre", SqlDbType.VarChar, 50, usuarioWeb.Nombre), 
					UtilsDB.MP("@Paterno", SqlDbType.VarChar, 50, usuarioWeb.Paterno), 
					UtilsDB.MP("@Materno", SqlDbType.VarChar, 50, usuarioWeb.Materno), 
					UtilsDB.MP("@Mail", SqlDbType.VarChar, 100, usuarioWeb.Mail), 
					UtilsDB.MP("@TipoUsuario", SqlDbType.Int, 0, (usuarioWeb.TipoUsuario == int.MinValue? (object)null: usuarioWeb.TipoUsuario)), 
					UtilsDB.MP("@Habilitada", SqlDbType.Bit, 0, usuarioWeb.Habilitada), 
					UtilsDB.MP("@CambiarPasswordInicio", SqlDbType.Bit, 0, usuarioWeb.CambiarPasswordInicio),
					UtilsDB.MP("@Contrasena", SqlDbType.VarChar, 40, usuarioWeb.Contrasena),
					UtilsDB.MP("@SaltHash", SqlDbType.VarChar, 40, usuarioWeb.SaltHash));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return retval;
		}

		/// <summary>
		/// Genera un DataSet fuertemente tipeado desde un DataReader
		/// </summary>
		/// <param name="ds">Objeto DataSet con datos para llenar el DataSet Tipeado</param>
		/// <returns>DataSet fuertemente tipeado</returns>
		internal DSUsuarioWeb GetDSFT(DataSet ds)
		{
			DSUsuarioWeb DSFT = new DSUsuarioWeb();
			DataRow rowDS;

			foreach(DataRow dr in ds.Tables[0].Rows)
			{
				rowDS = DSFT.Tables[0].NewRow();

				foreach(DataColumn dc in DSFT.Tables[0].Columns)
				{
					rowDS[dc.ColumnName] =  dr[dc.ColumnName];
				}
				DSFT.Tables[0].Rows.Add(rowDS);
			}

			return DSFT;
		}
	}
}