using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Exferia_KairosPRO_EF;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Aplicacion.General;
using System.Globalization;
using Exferia_KairosPRO.General;

namespace Exferia_KairosPRO._4_Vistas.ControlesPersonalizados_DentroPaneles
{
    public partial class CTU_P_Fichajes_HorasExtras : UserControl
    {
        #region Variables privadas
        private int g_int_NumeroObjeto;
        #endregion

        #region Eventos publicos
        public event EventHandler<INTERNO_EventArgs> Boton_P_Fichajes_HorasExtrasDelete_Click;
        public event EventHandler Boton_P_Fichajes_HorasExtrasRecalcular;
        #endregion

        #region Propiedades Publicas
        public decimal CTU_P_Fichajes_HorasExtras_HorasReales
        {
            get
            {
                decimal dcm_valor = 0m;

                if (ex_txt_HoraExtraTotalesReal.Text.Trim().Length>0)
                {
                    dcm_valor= Convert.ToDecimal(ex_txt_HoraExtraTotalesReal.Text.Trim());
                }

                return dcm_valor;
            }
        }
        public decimal CTU_P_Fichajes_HorasExtras_Horas
        {
            get
            {
                decimal dcm_valor = 0m;

                if (ex_txt_HoraExtraTotalesReal.Text.Trim().Length > 0)
                {
                    dcm_valor = Convert.ToDecimal(ex_txt_HoraExtraTotalesReal.Text.Trim());
                }

                return dcm_valor;
            }
        }

        public decimal CTU_P_Fichajes_HorasExtras_HorasConvertidas
        {
            get
            {
                decimal dcm_valor = 0m;

                if (ex_txt_P_HoraExtraTotalesCalculada.Text.Trim().Length > 0)
                {
                    dcm_valor = Convert.ToDecimal(ex_txt_P_HoraExtraTotalesCalculada.Text.Trim());
                }

                return dcm_valor;
            }
        }

        #endregion

        #region Constructor
        public CTU_P_Fichajes_HorasExtras(int _int_NumeroObjeto, KRS_HorasExtrasCalculadasLineas _mdl_KRS_HorasExtrasCalculadasLineas)
        {
            InitializeComponent();

            Repintar.Empezar(this);

            g_int_NumeroObjeto = _int_NumeroObjeto;

            if (_mdl_KRS_HorasExtrasCalculadasLineas!=null)
            {
                Cargar(_mdl_KRS_HorasExtrasCalculadasLineas);
            }


        }
        #endregion

        #region Cargar
        private void Cargar(KRS_HorasExtrasCalculadasLineas _mdl_KRS_HorasExtrasCalculadasLineas)
        {
            try
            {
                //otroRangoHoras,horaInicio y horaFin
                if (_mdl_KRS_HorasExtrasCalculadasLineas.otroRangoHoras)
                {
                    ex_chk_Rango_Otro.Checked = true;
                }
                else
                {
                    ex_chk_Rango_Otro.Checked = false;
                    ex_txt_HoraInicio.Text = Funciones_KairosPRO.Convertir_TimeSpan_String(_mdl_KRS_HorasExtrasCalculadasLineas.horaInicio.Value);
                    ex_txt_HoraFin.Text = Funciones_KairosPRO.Convertir_TimeSpan_String(_mdl_KRS_HorasExtrasCalculadasLineas.horaFin.Value);
                }

                //horaReal
                ex_txt_HoraExtraReal.Text = _mdl_KRS_HorasExtrasCalculadasLineas.horaReal.ToString();

                //horaCalculada
                ex_txt_HoraExtraCalculada.Text = _mdl_KRS_HorasExtrasCalculadasLineas.horaCalculada.ToString();

                //horasTotalesReales
                ex_txt_HoraExtraTotalesReal.Text = _mdl_KRS_HorasExtrasCalculadasLineas.horasTotalesReales.ToString();

                //horasTotalesCalculadas
                ex_txt_P_HoraExtraTotalesCalculada.Text = _mdl_KRS_HorasExtrasCalculadasLineas.horasTotalesCalculadas.ToString();

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Fichajes_HorasExtras) + "/" + nameof(Cargar));
            }

        }
        #endregion

        #region Validar
        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                if (ex_chk_Rango_Otro.Checked==false)
                {
                    //La hora Inicio no puede estar vacia
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        int int_FechaHora_Respuesta = Funciones.Hora_Validacion(ex_txt_HoraInicio.Text);

                        if (int_FechaHora_Respuesta == 1)//Vacia
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO("Hora inicio");
                            mdl_ValorDevuelto_Modelo.Objeto = ex_txt_HoraInicio;
                        }
                        else if (int_FechaHora_Respuesta == 2)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA("Hora inicio");
                            mdl_ValorDevuelto_Modelo.Objeto = ex_txt_HoraInicio;
                        }
                    }

                    //La hora Fin no puede estar vacia
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        int int_FechaHora_Respuesta = Funciones.Hora_Validacion(ex_txt_HoraFin.Text);

                        if (int_FechaHora_Respuesta == 1)//Vacia
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO("Hora fin");
                            mdl_ValorDevuelto_Modelo.Objeto = ex_txt_HoraFin;
                        }
                        else if (int_FechaHora_Respuesta == 2)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA("Hora fin");
                            mdl_ValorDevuelto_Modelo.Objeto = ex_txt_HoraFin;
                        }
                    }

                    //La hora inicio no puede ser mayor que la de fin
                    TimeSpan? tms_HoraInicio = null;
                    TimeSpan? tms_HoraFin = null;
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        tms_HoraInicio = TimeSpan.ParseExact(ex_txt_HoraInicio.Text, "hh\\:mm", CultureInfo.InvariantCulture);
                        tms_HoraFin = TimeSpan.ParseExact(ex_txt_HoraFin.Text, "hh\\:mm", CultureInfo.InvariantCulture);

                        if (tms_HoraInicio > tms_HoraFin)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_KAIROSPROHORASEXTRAS_HORAINICIOMAYORHORAFIN("hora inicio", "hora fin");
                            mdl_ValorDevuelto_Modelo.Objeto = ex_txt_HoraInicio;
                        }
                    }
                }

                // La hora real no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && ex_txt_HoraExtraReal.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO("Hora");
                    mdl_ValorDevuelto_Modelo.Objeto = ex_txt_HoraExtraReal;
                }

                // La hora calculada no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && ex_txt_HoraExtraCalculada.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO("Hora");
                    mdl_ValorDevuelto_Modelo.Objeto = ex_txt_HoraExtraCalculada;
                }

                // La hora real total no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && ex_txt_HoraExtraTotalesReal.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(ex_lbl_HoraExtraTotalesReal.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = ex_txt_HoraExtraTotalesReal;
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Fichajes_HorasExtras) + "/" + nameof(ValidarDatos));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }


        #endregion

        #region Obtener para grabar
        public KRS_HorasExtrasCalculadasLineas Obtener(long _lng_idHorasExtrasCalculadasCabecera)
        {
            KRS_HorasExtrasCalculadasLineas mdl_KRS_HorasExtrasCalculadasLineas = new KRS_HorasExtrasCalculadasLineas();

            //id
            mdl_KRS_HorasExtrasCalculadasLineas.id = -1;

            //idHoraExtraAutorizadaCabecera
            mdl_KRS_HorasExtrasCalculadasLineas.idHoraExtraCalculadaCabecera = _lng_idHorasExtrasCalculadasCabecera;

            //horaReal
            mdl_KRS_HorasExtrasCalculadasLineas.horaReal = Convert.ToDecimal(ex_txt_HoraExtraReal.Text.Trim());

            //horaCalculada
            mdl_KRS_HorasExtrasCalculadasLineas.horaCalculada = Convert.ToDecimal(ex_txt_HoraExtraCalculada.Text.Trim());

            //otroRangoHoras, horaInicio y horaFin
            if (ex_chk_Rango_Otro.Checked)
            {
                mdl_KRS_HorasExtrasCalculadasLineas.otroRangoHoras = true;

                mdl_KRS_HorasExtrasCalculadasLineas.horaInicio = null;
                mdl_KRS_HorasExtrasCalculadasLineas.horaFin = null;
            }
            else
            {
                mdl_KRS_HorasExtrasCalculadasLineas.otroRangoHoras = false;

                mdl_KRS_HorasExtrasCalculadasLineas.horaInicio = TimeSpan.ParseExact(ex_txt_HoraInicio.Text, "hh\\:mm", CultureInfo.InvariantCulture);
                mdl_KRS_HorasExtrasCalculadasLineas.horaFin = TimeSpan.ParseExact(ex_txt_HoraFin.Text, "hh\\:mm", CultureInfo.InvariantCulture);
            }

            //horasTotalesReales
            mdl_KRS_HorasExtrasCalculadasLineas.horasTotalesReales = Convert.ToDecimal(ex_txt_HoraExtraTotalesReal.Text.Trim());

            //horasTotalesCalculadas
            mdl_KRS_HorasExtrasCalculadasLineas.horasTotalesCalculadas = Convert.ToDecimal(ex_txt_P_HoraExtraTotalesCalculada.Text.Trim());

            return mdl_KRS_HorasExtrasCalculadasLineas;
        }
        #endregion

        private void ex_chk_Rango_Otro_CheckedChanged(object sender, EventArgs e)
        {
            if (ex_chk_Rango_Otro.Checked)
            {
                pnl_Rango.Visible = false;
                ex_txt_HoraInicio.Text = "";
                ex_txt_HoraFin.Text = "";
            }
            else
            {
                pnl_Rango.Visible = true;
            }
        }

        #region Borrar
        private void ex_btn_Borrar_Click(object sender, EventArgs e)
        {
            //Para que salte el evento en el otro lado
            EventHandler<INTERNO_EventArgs> temp = Boton_P_Fichajes_HorasExtrasDelete_Click;
            if (temp != null)
                temp(sender, new INTERNO_EventArgs(g_int_NumeroObjeto));
        }
        #endregion

        #region Calculo
        //######################################################################################################
        string str_Valor_HoraExtraReal_Inicial = "";
        private void ex_txt_HoraExtraReal_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            str_Valor_HoraExtraReal_Inicial = ex_txt_HoraExtraReal.Text;
        }
        private void ex_txt_HoraExtraReal_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {

            CalCular_HorasExtrasFinales();

            if (!str_Valor_HoraExtraReal_Inicial.Equals(ex_txt_HoraExtraReal.Text))
            {
                EventHandler temp = Boton_P_Fichajes_HorasExtrasRecalcular;
                if (temp != null)
                    temp(sender,null);
            }
        }
        //######################################################################################################

        //######################################################################################################
        string str_Valor_HoraExtraCalculada_Inicial = "";
        private void ex_txt_HoraExtraCalculada_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            str_Valor_HoraExtraCalculada_Inicial = ex_txt_HoraExtraCalculada.Text;
        }
        private void ex_txt_HoraExtraCalculada_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            CalCular_HorasExtrasFinales();

            if (!str_Valor_HoraExtraCalculada_Inicial.Equals(ex_txt_HoraExtraCalculada.Text))
            {
                EventHandler temp = Boton_P_Fichajes_HorasExtrasRecalcular;
                if (temp != null)
                    temp(sender, null);
            }
        }
        //######################################################################################################

        //######################################################################################################
        string str_Valor_HoraExtraTotalReal_Inicial = "";
        private void ex_txt_HoraExtraTotalesReal_Exferia_TextBox_Evento_GotFocus(object sender, EventArgs e)
        {
            str_Valor_HoraExtraTotalReal_Inicial = ex_txt_HoraExtraTotalesReal.Text;
        }
        private void ex_txt_HoraExtraTotalesReal_Exferia_TextBox_Evento_LostFocus(object sender, EventArgs e)
        {
            CalCular_HorasExtrasFinales();

            if (!str_Valor_HoraExtraTotalReal_Inicial.Equals(ex_txt_HoraExtraTotalesReal.Text))
            {
                EventHandler temp = Boton_P_Fichajes_HorasExtrasRecalcular;
                if (temp != null)
                    temp(sender, null);
            }
        }
        //######################################################################################################

        private void CalCular_HorasExtrasFinales()
        {
            try
            {
                //HoraReal
                if (ex_txt_HoraExtraReal.Text.Trim().Length==0 ||
                    decimal.Parse(ex_txt_HoraExtraReal.Text.Trim())==0m)
                {
                    return;
                }

                //HoraCalculada
                if (ex_txt_HoraExtraCalculada.Text.Trim().Length == 0)
                {
                    return;
                }

                //HoraTotalesReal
                if (ex_txt_HoraExtraTotalesReal.Text.Trim().Length == 0)
                {
                    return;
                }


                //calculo
                decimal dcm_HoraExtraReal = decimal.Parse(ex_txt_HoraExtraReal.Text.Trim());
                decimal dcm_HoraExtraCalculada = decimal.Parse(ex_txt_HoraExtraCalculada.Text.Trim());
                decimal dcm_HoraExtraTotalReal = decimal.Parse(ex_txt_HoraExtraTotalesReal.Text.Trim());

                //calculo
                ex_txt_P_HoraExtraTotalesCalculada.Text = Funciones.RedondearDecimal(((dcm_HoraExtraTotalReal* dcm_HoraExtraCalculada)/ dcm_HoraExtraReal),2).ToString();

            }
            catch (Exception ex)
            {
                ex_txt_P_HoraExtraTotalesCalculada.Text = "";
                Control_Errores.Errores_Log("", ex, nameof(CTU_P_Fichajes_HorasExtras) + "/" + nameof(CalCular_HorasExtrasFinales));
            }
        }

        private void ex_chk_Autorizar_CheckedChanged(object sender, EventArgs e)
        {
            EventHandler temp = Boton_P_Fichajes_HorasExtrasRecalcular;
            if (temp != null)
                temp(sender, null);
            
        }
        #endregion


    }
}
