using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Exferia_Formularios
{
    public partial class PE_ValidacionUsuario : Form
    {
        #region Librerias Externas
        [DllImport("dwmapi.dll")]
        public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);

        [DllImport("dwmapi.dll")]
        public static extern int DwmIsCompositionEnabled(ref int pfEnabled);

        [DllImport("dwmapi.dll")]
        public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);

        #endregion

        #region Propiedad Publicas
        private bool g_bol_ValidacionCorrecta = false;
        public bool PE_ValidacionUsuario_ValidacionCorrecta
        {
            set
            {
                g_bol_ValidacionCorrecta = value;
            }
            get
            {
                return g_bol_ValidacionCorrecta;
            }
        }

        //Propiedad que define el color del titulo y los bordes de la pantalla 
        public Color PE_ValidacionUsuario_ColorTituloyBordes
        {
            set
            {
                lbl_Titulo.BackColor = value;
                pnl_Titulo.BackColor = value;
                pnl_BordeDerecho.BackColor = value;
                pnl_BordeInferior.BackColor = value;
                pnl_BordeIzquierdo.BackColor = value;
            }
            get
            {
                return lbl_Titulo.BackColor;
            }
        }
        #endregion

        public PE_ValidacionUsuario()
        {
            InitializeComponent();

            Repintar.Empezar(this);

            //Cargar datos guardados en XML ..................................................
            List<string> lst_DatosGuardados = Funciones_FicherosXML.CargarDatosXML_UsuarioClave();
            if (lst_DatosGuardados != null && lst_DatosGuardados.Count > 0)
            {
                ex_txt_Usuario.Text = lst_DatosGuardados[0];

                if (lst_DatosGuardados.Count > 1 && lst_DatosGuardados[1].Trim().Length > 0)
                {
                    ex_txt_Clave.Text = lst_DatosGuardados[1];
                    ex_chk_RecordarClave.Checked = true;
                }
            }

            ex_txt_Usuario.Exferia_TextBox_Foco();
        }

        private void ex_btn_Salir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void ex_btn_Aceptar_Click(object sender, EventArgs e)
        {
            Validar();
        }

        private void Validar()
        {
            if (Datos_Generales.USR_Usuarios_Validar(ex_txt_Usuario.Text, ex_txt_Clave.Text, ex_chk_RecordarClave.Checked))
            {
                //Grabar el Acceso
                try
                {
                    USR_Accesos mdl_USR_Accesos = new USR_Accesos();
                    mdl_USR_Accesos.id = -1;
                    mdl_USR_Accesos.fechaHora = DateTime.Now;
                    mdl_USR_Accesos.tipo =Variables.G_STR_TIPOACCESO_VALIDARUSUARIO_CORRECTO;
                    mdl_USR_Accesos.idUsuario = Variables.G_MDL_USUARIOVALIDADO_MODELO.id;
                    mdl_USR_Accesos.observaciones = "";
                    Datos_Generales.USR_Accesos_Insertar(mdl_USR_Accesos);
                }
                catch(Exception)
                {}

                 g_bol_ValidacionCorrecta = true;
                this.Close();
            }
            else
            {
                //Grabar el Acceso
                try
                {
                    USR_Accesos mdl_USR_Accesos = new USR_Accesos();
                    mdl_USR_Accesos.id = -1;
                    mdl_USR_Accesos.fechaHora = DateTime.Now;
                    mdl_USR_Accesos.tipo =  Variables.G_STR_TIPOACCESO_VALIDARUSUARIO_INCORRECTO;
                    mdl_USR_Accesos.idUsuario = null;
                    mdl_USR_Accesos.observaciones = "Usuario:" + ex_txt_Usuario.Text +  "|| Clave:" + ex_txt_Clave.Text;
                    Datos_Generales.USR_Accesos_Insertar(mdl_USR_Accesos);
                }
                catch (Exception)
                { }

                Mensajes.MostrarMensaje(Mensajes.G_STR_VALIDACIONUSUARIO_CLAVENOMBRE_INCORRECTOS());
            }
        }
        
        #region Control Grafico de la Pantalla

        protected override void WndProc(ref Message m)
        {
            //Sombra de la pantalla ..................................................
            if (m.Msg == WM_NCPAINT)// box shadow
            {
                if (g_bol_HabilitarSombra)
                {
                    var v = 2;
                    DwmSetWindowAttribute(Handle, 2, ref v, 4);
                    MARGINS margins = new MARGINS()
                    {
                        bottomHeight = 1,
                        leftWidth = 1,
                        rightWidth = 1,
                        topHeight = 1
                    };
                    DwmExtendFrameIntoClientArea(Handle, ref margins);
                }
            }

            base.WndProc(ref m);

            if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT)     // drag the form
                m.Result = (IntPtr)HTCAPTION;
        }

        private void PE_Mensajes_Resize(object sender, EventArgs e)
        {
            pnl_BordeDerecho.Location = new Point(Width - 3, pnl_BordeDerecho.Location.Y);
            pnl_BordeDerecho.Size = new Size(2, Height - 3);

            pnl_BordeInferior.Location = new Point(pnl_BordeInferior.Location.X, Height - 3);
            pnl_BordeInferior.Size = new Size(Width - 4, 2);

            pnl_Titulo.Size = new Size(Width - 4, pnl_Titulo.Height);
        }

        #endregion

        #region Crear Sombra de la pantalla 
        [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
        private static extern IntPtr CreateRoundRectRgn
        (
            int nLeftRect, // x-coordinate of upper-left corner
            int nTopRect, // y-coordinate of upper-left corner
            int nRightRect, // x-coordinate of lower-right corner
            int nBottomRect, // y-coordinate of lower-right corner
            int nWidthEllipse, // height of ellipse
            int nHeightEllipse // width of ellipse
         );

        private bool g_bol_HabilitarSombra;                     // variables for box shadow
        private const int CS_DROPSHADOW = 0x00020000;
        private const int WM_NCPAINT = 0x0085;
        private const int WM_ACTIVATEAPP = 0x001C;

        public struct MARGINS                           // struct for box shadow
        {
            public int leftWidth;
            public int rightWidth;
            public int topHeight;
            public int bottomHeight;
        }

        private const int WM_NCHITTEST = 0x84;          // variables for dragging the form
        private const int HTCLIENT = 0x1;
        private const int HTCAPTION = 0x2;

        protected override CreateParams CreateParams
        {
            get
            {
                g_bol_HabilitarSombra = CheckAeroEnabled();

                CreateParams cp = base.CreateParams;
                if (!g_bol_HabilitarSombra)
                    cp.ClassStyle |= CS_DROPSHADOW;

                return cp;
            }
        }

        private bool CheckAeroEnabled()
        {
            if (Environment.OSVersion.Version.Major >= 6)
            {
                int enabled = 0;
                DwmIsCompositionEnabled(ref enabled);
                return (enabled == 1) ? true : false;
            }
            return false;
        }
        #endregion

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == (Keys.Enter)) // Aceptar
            {
                Validar();
                return true;
            }
            else if (keyData == Keys.Escape) // Salir
            {
                Close();
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
}
