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

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

namespace Seguridad.BusinessObjects
{
	public abstract class RlsModuloWebCRUD
	{
		private SglAuditoria _sglAuditoria;

		/// <summary>
		/// Constructor
		/// <summary>
		public RlsModuloWebCRUD()
		{
		}

		/// <summary>
		/// Constructor
		/// <summary>
		public RlsModuloWebCRUD(SglAuditoria sglAuditoria)
		{
			_sglAuditoria = sglAuditoria;
		}

		/// <summary>
		/// 
		/// </summary>
		public DSModuloWeb LoadAll()
		{
			//SqlConnection utilizado para ejecutar el SqlCommand
			SqlConnection connection = null;

			//Almacena retorno del DataAccess
			DSModuloWeb ds;

			try
			{
				//Abre la conexion
				connection = UtilsDB.GetConnection(UtilsConnectionManager.GetConnection(eConnectionString.Empresa));

				ModuloWeb da = new ModuloWeb(connection);
				ds = da.SelectAll();
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				if (connection != null)
					connection.Dispose();
			}

			return ds;
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idModuloWeb"></param>
		/// <returns></returns>
		public DSModuloWeb LoadByID(int idModuloWeb)
		{
			//SqlConnection utilizado para ejecutar el SqlCommand
			SqlConnection connection = null;

			//Almacena retorno del DataAccess
			DSModuloWeb ds;

			try
			{
				//Abre la conexion
				connection = UtilsDB.GetConnection(UtilsConnectionManager.GetConnection(eConnectionString.Empresa));

				ModuloWeb da = new ModuloWeb(connection);
				ds = da.SelectByID(idModuloWeb);
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				if (connection != null)
					connection.Dispose();
			}

			return ds;
		}

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

		}

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

		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idModuloWeb"></param>
		public void Delete(int idModuloWeb)
		{
			// SqlConnection utilizado para ejecutar el SqlCommand
			SqlConnection empresa = null;
			SqlConnection seguridad = null;

			try
			{
				// Abre la conexion
				empresa = UtilsDB.GetConnection(UtilsConnectionManager.GetConnection(eConnectionString.Empresa));
				seguridad = UtilsDB.GetConnection(UtilsConnectionManager.GetConnection(eConnectionString.Seguridad));

				using (SqlTransaction transaction = empresa.BeginTransaction())
				{
					try
					{
						ModuloWeb da = new ModuloWeb(transaction);
						da.Delete(idModuloWeb);

						// Registra la transacción realizada
						//(new Auditoria(seguridad)).Insert(_sglAuditoria);

						transaction.Commit();
					}
					catch(Exception ex)
					{
						transaction.Rollback();
						throw ex;
					}
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				if (empresa != null)
					empresa.Dispose();

				if (seguridad != null)
					seguridad.Dispose();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="sglModuloWeb"></param>
		/// <param name="operation">true = actualizar, false = agregar</param>
		/// <returns></returns>
		private int Save(SglModuloWeb sglModuloWeb, bool operation)
		{
			// SqlConnection utilizado para ejecutar el SqlCommand
			SqlConnection empresa = null;
			SqlConnection seguridad = null;

			// Almacena retorno del DataAccess
			int newId;

			try
			{
				// Abre la conexion
				empresa = UtilsDB.GetConnection(UtilsConnectionManager.GetConnection(eConnectionString.Empresa));
				seguridad = UtilsDB.GetConnection(UtilsConnectionManager.GetConnection(eConnectionString.Seguridad));

				using (SqlTransaction transaction = empresa.BeginTransaction())
				{
					try
					{
						ModuloWeb da = new ModuloWeb(transaction);

						if (operation)
						{
							da.Update(sglModuloWeb);
							newId = int.MinValue;
						}
						else
						{
							newId = da.Insert(sglModuloWeb);
							//_sglAuditoria.idRegistro = newId;
						}

						// Registra la transacción realizada
						//(new Auditoria(seguridad)).Insert(_sglAuditoria);

						transaction.Commit();
					}
					catch(Exception ex)
					{
						transaction.Rollback();
						throw ex;
					}
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				if (empresa != null)
					empresa.Dispose();

				if (seguridad != null)
					seguridad.Dispose();
			}

			return newId;
		}
	}
}