using System;
using System.Data.SqlClient;
using Municipalidad.Utils;
using Remuneraciones.DataAccess;
using Remuneraciones.DataSetFT;
using Remuneraciones.SingleObjects;

namespace Remuneraciones.BusinessObjects
{
	public abstract class RlsTrabajadorCRUD
	{
		private SglAuditoria _sglAuditoria;

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

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

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

			//Almacena retorno del DataAccess
			DSTrabajador ds;

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

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

			return ds;
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idNumero"></param>
		/// <param name="mes"></param>
		/// <param name="idTrabajador"></param>
		/// <returns></returns>
		public DSTrabajador LoadByID(string idNumero, short mes, string idTrabajador, int Ano)
		{
			//SqlConnection utilizado para ejecutar el SqlCommand
			SqlConnection connection = null;

			//Almacena retorno del DataAccess
			DSTrabajador ds;

			try
			{
				//Abre la conexion
				connection = UtilsDB.GetConnection(Utils.GetAnoConnection(Ano));

				Trabajador da = new Trabajador(connection);
				ds = da.SelectByID(idNumero, mes, idTrabajador);
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				if (connection != null)
					connection.Dispose();
			}

			return ds;
		}

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

		}

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

		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idNumero"></param>
		/// <param name="mes"></param>
		/// <param name="idTrabajador"></param>
		public void Delete(string idNumero, short mes, string idTrabajador)
		{
			// SqlConnection utilizado para ejecutar el SqlCommand
			SqlConnection remuneraciones = null;
			SqlConnection seguridad = null;

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

				using (SqlTransaction transaction = remuneraciones.BeginTransaction())
				{
					try
					{
						Trabajador da = new Trabajador(transaction);
						da.Delete(idNumero, mes, idTrabajador);

						// 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 (remuneraciones != null)
					remuneraciones.Dispose();

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

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

			// Almacena retorno del DataAccess
			int newId;

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

				using (SqlTransaction transaction = remuneraciones.BeginTransaction())
				{
					try
					{
						Trabajador da = new Trabajador(transaction);

						if (operation)
						{
							da.Update(sglTrabajador);
							newId = int.MinValue;
						}
						else
						{
							newId = da.Insert(sglTrabajador);
							_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 (remuneraciones != null)
					remuneraciones.Dispose();

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

			return newId;
		}
	}
}