using System;
using System.Data;
using System.Data.SqlClient;
using Seguridad.DataSetFT;
using Municipalidad.Utils;
using Seguridad.DataModel;

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

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="connection"></param>
		public UsuarioWeb(SqlConnection connection): base(connection)
		{
			_connection = connection;
		}
		
		/// <summary>
		/// Constructor
		/// </summary>
		public UsuarioWeb(SqlTransaction transaction): base(transaction)
		{
			_transaction = transaction;
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public void UsuarioPermisoSave(int idSucursal, int idModulo, int idUsuario)
		{
			//Almacena retorno del SqlCommand
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQuery(_transaction, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_PERMISO_SAVE, 
					UtilsDB.MP("@idSucursalWeb", SqlDbType.Int, 0, idSucursal),
					UtilsDB.MP("@idModuloWeb", SqlDbType.Int, 4, idModulo ),
					UtilsDB.MP("@idUsuarioWeb", SqlDbType.Int, 0, idUsuario ));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public void UsuarioEmpresaSave(int idUsuario, string idCodEmpresa, int idSistema)
		{
			//Almacena retorno del SqlCommand
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQuery(_transaction, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_EMPRESA_SAVE, 
					UtilsDB.MP("@idUsuarioWeb", SqlDbType.Int, 0, idUsuario),
					UtilsDB.MP("@idCodEmpresa", SqlDbType.VarChar, 4, idCodEmpresa ),
					UtilsDB.MP("@idSistema", SqlDbType.Int, 0, idSistema ));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public void UsuarioSucursalSave(int idUsuario, string idSucursal)
		{
			//Almacena retorno del SqlCommand
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQuery(_transaction, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_SUCURSAL_SAVE, 
					UtilsDB.MP("@idUsuarioWeb", SqlDbType.Int, 0, idUsuario),
					UtilsDB.MP("@idSucursalWeb", SqlDbType.Int, 0, idSucursal));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public void UsuarioEmpresaDelete(int idUsuario, int idSistema)
		{
			//Almacena retorno del SqlCommand
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQuery(_transaction, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_EMPRESA_DELETE, 
					UtilsDB.MP("@idUsuarioWeb", SqlDbType.Int, 0, idUsuario),
					UtilsDB.MP("@idSistema", SqlDbType.Int, 0, idSistema ));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public void UsuarioSucursalDelete(int idUsuario)
		{
			//Almacena retorno del SqlCommand
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQuery(_transaction, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_SUCURSAL_DELETE, 
					UtilsDB.MP("@idUsuarioWeb", SqlDbType.Int, 0, idUsuario));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public void UsuarioPermisosDelete(int idUsuario)
		{
			//Almacena retorno del SqlCommand
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQuery(_transaction, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_PERMISO_DELETE, 
					UtilsDB.MP("@idUsuarioWeb", SqlDbType.Int, 0, idUsuario));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public void ChangePassword(int idUsuario, string Password, string SaltHash)
		{
			//Almacena retorno del SqlCommand
			try
			{
				//Ejecuta el SqlCommand
				UtilsDB.ExecuteNonQueryReturn(_connection, CommandType.StoredProcedure, Schema.Usuarios.SP_CHANGE_PASS, 
					UtilsDB.MP("@idUsuarioWeb", SqlDbType.Int, 0, (idUsuario == int.MinValue?(object)null:idUsuario)),
					UtilsDB.MP("@Password", SqlDbType.VarChar, 40, (Password == ""?null:Password)),
					UtilsDB.MP("@SaltHash", SqlDbType.VarChar, 40, (SaltHash == ""?null:SaltHash)));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public DSUsuarioWeb Filter(string Rut, string Nombre, string Paterno, string Materno)
		{
			//Almacena retorno del SqlCommand
			DataSet ds;

			try
			{
				//Ejecuta el SqlCommand
				ds = UtilsDB.ExecuteDataset(_connection, CommandType.StoredProcedure, Schema.Usuarios.SP_SELECT_FILTER, 
					UtilsDB.MP("@Rut", SqlDbType.VarChar, 8, (Rut==""?null:Rut)),
					UtilsDB.MP("@Nombre", SqlDbType.VarChar, 50, (Nombre==""?null:Nombre)),
					UtilsDB.MP("@Paterno", SqlDbType.VarChar, 50, (Paterno==""?null:Paterno)),
					UtilsDB.MP("@Materno", SqlDbType.VarChar, 50, (Materno==""?null:Materno)));
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return GetDSFT(ds);
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public DSUsuarioWeb SelectUsuarioByTrabajador(string Rut)
		{
			//Almacena retorno del SqlCommand
			DataSet ds;

			try
			{
				//Ejecuta el SqlCommand
				ds = UtilsDB.ExecuteDataset(_connection, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_BY_TRABAJADOR, 
					UtilsDB.MP("@RutTrabajador", SqlDbType.VarChar, 8, (Rut==""?null:Rut)));
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return GetDSFT(ds);
		}


		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public DSUsuarioByEmpresaAndTrabajador SelectUsuarioByEmrpesaAndTrabajador(int RutEmpresa, string Usuario, int Sistema)
		{
			//Almacena retorno del SqlCommand
			DataSet ds;

			try
			{
				//Ejecuta el SqlCommand
				ds = UtilsDB.ExecuteDataset(_connection, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_BY_EMPRESA_TRABAJADOR, 
					UtilsDB.MP("@RutEmpresa", SqlDbType.Int, 0, RutEmpresa),
					UtilsDB.MP("@RutTrabajador", SqlDbType.VarChar, 8, Usuario ),
					UtilsDB.MP("@idSistema", SqlDbType.Int, 0, Sistema ));
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return GetDSFTUsuarioByEmpresaTrabajador(ds);
		}

		internal DSUsuarioByEmpresaAndTrabajador GetDSFTUsuarioByEmpresaTrabajador(DataSet ds)
		{
			DSUsuarioByEmpresaAndTrabajador DSFT = new DSUsuarioByEmpresaAndTrabajador();
			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;
		}

		/// <summary>
		/// Busca el usuario en si esta asociado a la empresa
		/// </summary>
		/// <returns>un conjunto de datos tipeado de tipo DSUsuarioByEmrpesaAndTrabajador</returns>
		public DSSucursal SelectUsuarioSucursal(string idEmpresa, int idUsuario, int idSistema)
		{
			//Almacena retorno del SqlCommand
			DataSet ds;

			try
			{
				//Ejecuta el SqlCommand
				ds = UtilsDB.ExecuteDataset(_connection, CommandType.StoredProcedure, Schema.Usuarios.SP_USUARIO_SUCURSAL, 
					UtilsDB.MP("@idCodEmpresa", SqlDbType.VarChar, 4, idEmpresa),
					UtilsDB.MP("@idUsuario", SqlDbType.Int, 0, idUsuario ),
					UtilsDB.MP("@idSistema", SqlDbType.Int, 0, idSistema ));
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return GetDSFTUsuarioSucursal(ds);
		}

		internal DSSucursal GetDSFTUsuarioSucursal(DataSet ds)
		{
			DSSucursal DSFT = new DSSucursal();
			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;
		}

	}
}
