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

using Remuneraciones.DataSetFT;
using Remuneraciones.DataModel;
using Municipalidad.Utils;

namespace Remuneraciones.DataAccess
{
	public class Trabajador: TrabajadorCRUD
	{
		//Field para almacenar la conexión
		private SqlConnection _connection = null;
		private SqlTransaction _transaction = null;

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

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

		/// </summary>
		/// <param name="idNumero"></param>
		/// <returns></returns>
		public DSTrabajadorBrowse SelectBrowse(string idNumero, int Mes, string idSucursalIni, string idSucursalFin)
		{
			//Almacena retorno del SqlCommand
			SqlDataReader dr;

			try
			{
				//Ejecuta el SqlCommand
				dr = UtilsDB.ExecuteDataReader(_connection, CommandType.StoredProcedure, Schema.Trabajador.SP_SELECT_BROWSE, 
					UtilsDB.MP("@OrderBy", SqlDbType.Int, 0, 1),
					UtilsDB.MP("@IdNumero", SqlDbType.Char, 3, idNumero),
					UtilsDB.MP("@Mes", SqlDbType.Int, 0, Mes),
					UtilsDB.MP("@idSucursalIni", SqlDbType.VarChar, 3, (idSucursalIni==""?null:idSucursalIni)),
					UtilsDB.MP("@idSucursalFin", SqlDbType.VarChar, 3, (idSucursalFin==""?null:idSucursalFin)));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return GetDSFTBrowse(dr);
		}

		/// </summary>
		/// <param name="idNumero"></param>
		/// <returns></returns>
		public DSTrabajadorBrowse SelectBrowse(string idNumero, int Mes, string idSucursalIni, string idSucursalFin, int Orden)
		{
			//Almacena retorno del SqlCommand
			SqlDataReader dr;

			try
			{
				//Ejecuta el SqlCommand
				dr = UtilsDB.ExecuteDataReader(_connection, CommandType.StoredProcedure, Schema.Trabajador.SP_SELECT_BROWSE, 
					UtilsDB.MP("@OrderBy", SqlDbType.Int, 0, Orden),
					UtilsDB.MP("@IdNumero", SqlDbType.Char, 3, idNumero),
					UtilsDB.MP("@Mes", SqlDbType.Int, 0, Mes),
					UtilsDB.MP("@idSucursalIni", SqlDbType.VarChar, 3, (idSucursalIni==""?null:idSucursalIni)),
					UtilsDB.MP("@idSucursalFin", SqlDbType.VarChar, 3, (idSucursalFin==""?null:idSucursalFin)));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return GetDSFTBrowse(dr);
		}

		/// </summary>
		/// <param name="idNumero"></param>
		/// <returns></returns>
		public DSTrabajadorCtaCte SelectCtasCtes(string idNumero, int Mes, string idTrabajador)
		{
			//Almacena retorno del SqlCommand
			DataSet dr;

			try
			{
				//Ejecuta el SqlCommand
				dr = UtilsDB.ExecuteDataset(_connection, CommandType.StoredProcedure, Schema.Trabajador.SP_SELECT_CTA_CTE, 
					UtilsDB.MP("@IdNumero", SqlDbType.Char, 3, idNumero),
					UtilsDB.MP("@Mes", SqlDbType.Int, 0, Mes),
					UtilsDB.MP("@idTrabajador", SqlDbType.Char, 8, (idTrabajador==""?null:idTrabajador)));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return GetDSFTTrabajadorCtaCte(dr);
		}

		internal DSTrabajadorCtaCte GetDSFTTrabajadorCtaCte(DataSet ds)
		{
			DSTrabajadorCtaCte DSFT = new DSTrabajadorCtaCte();
			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>
		/// <param name="idNumero"></param>
		/// <returns></returns>
		public DSTrabajadorAPV SelectApv(string idNumero, int Mes, string idTrabajador)
		{
			//Almacena retorno del SqlCommand
			DataSet dr;

			try
			{
				//Ejecuta el SqlCommand
				dr = UtilsDB.ExecuteDataset(_connection, CommandType.StoredProcedure, Schema.Trabajador.SP_SELECT_APV, 
					UtilsDB.MP("@IdNumero", SqlDbType.Char, 3, idNumero),
					UtilsDB.MP("@Mes", SqlDbType.Int, 0, Mes),
					UtilsDB.MP("@idTrabajador", SqlDbType.Char, 8, (idTrabajador==""?null:idTrabajador)));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return GetDSFTTrabajadorApv(dr);
		}

		internal DSTrabajadorAPV GetDSFTTrabajadorApv(DataSet ds)
		{
			DSTrabajadorAPV DSFT = new DSTrabajadorAPV();
			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>
		/// 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 DSTrabajadorBrowse GetDSFTBrowse(SqlDataReader dr)
		{
			DSTrabajadorBrowse DSFTTrabajador = new DSTrabajadorBrowse();
			DSTrabajadorBrowse.TrabajadorBrowseRow rowTrabajador;

			while (dr.Read())
			{
				rowTrabajador = DSFTTrabajador.TrabajadorBrowse.NewTrabajadorBrowseRow();
				
				rowTrabajador.idTrabajador = dr.IsDBNull(dr.GetOrdinal("IdTrabajador")) ? "": dr.GetString(dr.GetOrdinal("IdTrabajador"));
				rowTrabajador.Rutt = dr.IsDBNull(dr.GetOrdinal("Rutt")) ? int.MinValue: dr.GetInt32(dr.GetOrdinal("Rutt"));
				rowTrabajador.Nombre = dr.IsDBNull(dr.GetOrdinal("Nombre")) ? "": dr.GetString(dr.GetOrdinal("Nombre"));
				rowTrabajador.Paterno = dr.IsDBNull(dr.GetOrdinal("Paterno")) ? "": dr.GetString(dr.GetOrdinal("Paterno"));
				rowTrabajador.Materno = dr.IsDBNull(dr.GetOrdinal("Materno")) ? "": dr.GetString(dr.GetOrdinal("Materno"));
				rowTrabajador.Rut = dr.IsDBNull(dr.GetOrdinal("Rut")) ? "": dr.GetString(dr.GetOrdinal("Rut"));
				rowTrabajador.Activo = dr.IsDBNull(dr.GetOrdinal("Activo")) ? "": dr.GetString(dr.GetOrdinal("Activo"));
				rowTrabajador.Error = dr.IsDBNull(dr.GetOrdinal("Error")) ? short.MinValue: dr.GetByte(dr.GetOrdinal("Error"));
				
				DSFTTrabajador.TrabajadorBrowse.AddTrabajadorBrowseRow(rowTrabajador);
			}

			dr.Close();

			return DSFTTrabajador;
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idNumero"></param>
		/// <param name="mes"></param>
		/// <param name="Rut"></param>
		/// <returns></returns>
		public string SelectByRut(string idNumero, short mes, int Rut)
		{
			//Almacena retorno del SqlCommand
			DataSet ds;

			try
			{
				//Ejecuta el SqlCommand
				ds = UtilsDB.ExecuteDataset(_connection, CommandType.StoredProcedure, Schema.Trabajador.SP_SELECT_BY_RUT, 
					UtilsDB.MP("@IdNumero", SqlDbType.Char, 3, idNumero),
					UtilsDB.MP("@mes", SqlDbType.SmallInt, 0, mes),
					UtilsDB.MP("@Rut", SqlDbType.Int, 0, Rut));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			if(ds.Tables[0].Rows.Count > 0)
				return ds.Tables[0].Rows[0]["idTrabajador"].ToString();
			else
				return "";
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="idNumero"></param>
		/// <param name="mes"></param>
		/// <param name="Rut"></param>
		/// <returns></returns>
		public DSTrabajador SelectTrabajadorByRut(string idNumero, short mes, int Rut)
		{
			//Almacena retorno del SqlCommand
			DataSet ds;

			try
			{
				//Ejecuta el SqlCommand
				ds = UtilsDB.ExecuteDataset(_connection, CommandType.StoredProcedure, Schema.Trabajador.SP_SELECT_BY_RUT_DS, 
					UtilsDB.MP("@IdNumero", SqlDbType.Char, 3, idNumero),
					UtilsDB.MP("@mes", SqlDbType.SmallInt, 0, mes),
					UtilsDB.MP("@Rut", SqlDbType.Int, 0, Rut));
			}
			catch (Exception ex)
			{
				throw ex;
			}

			return GetDSFTTrabajador(ds);
		}

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