<%@ Page Language="C#" %>
<%@ Import Namespace="System.Net.Mail" %>
<%@ Import Namespace="System.Configuration" %>
<%@ Import Namespace="System.Web" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title>Formulario de Contacto Seguro</title>
</head>
<script src="https://www.google.com/recaptcha/api.js"></script>
<body>
    <form id="form1" runat="server">
        <div style="width:300px; margin:auto;">
            <h2>Formulario de Contacto</h2>

            <asp:Label ID="lblNombre" runat="server" Text="Nombre:"></asp:Label><br />
            <asp:TextBox ID="txtNombre" runat="server" Width="100%"></asp:TextBox>
            <asp:RequiredFieldValidator ID="rfvNombre" runat="server" ControlToValidate="txtNombre" ErrorMessage="El nombre es obligatorio." ForeColor="Red" Display="Dynamic" /><br /><br />

            <asp:Label ID="lblEmail" runat="server" Text="Email:"></asp:Label><br />
            <asp:TextBox ID="txtEmail" runat="server" Width="100%" TextMode="Email"></asp:TextBox>
            <asp:RequiredFieldValidator ID="rfvEmail" runat="server" ControlToValidate="txtEmail" ErrorMessage="El email es obligatorio." ForeColor="Red" Display="Dynamic" />
            <asp:RegularExpressionValidator ID="revEmail" runat="server" ControlToValidate="txtEmail" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ErrorMessage="Formato de email inválido." ForeColor="Red" Display="Dynamic" /><br /><br />

            <asp:Label ID="lblMensaje" runat="server" Text="Mensaje:"></asp:Label><br />
            <asp:TextBox ID="txtMensaje" runat="server" TextMode="MultiLine" Rows="5" Width="100%"></asp:TextBox>
            <asp:RequiredFieldValidator ID="rfvMensaje" runat="server" ControlToValidate="txtMensaje" ErrorMessage="El mensaje es obligatorio." ForeColor="Red" Display="Dynamic" /><br /><br />
			<div class="g-recaptcha" data-sitekey="TU_SITE_KEY"></div>
			
            <asp:Button ID="btnEnviar" runat="server" Text="Enviar" OnClick="btnEnviar_Click" /><br /><br />
            <asp:Label ID="lblResultado" runat="server" EnableViewState="false"></asp:Label>
        </div>
    </form>

    <script runat="server">
        protected void btnEnviar_Click(object sender, EventArgs e)
        {
			
			using (var client = new System.Net.WebClient())
			{
				var response = client.DownloadString("https://www.google.com/recaptcha/api/siteverify?secret=" + ConfigurationManager.AppSettings["RecaptchaSecret"] + "&response=" + Request.Form["g-recaptcha-response"]);

				if (!response.Contains("\"success\": true"))
				{
					lblResultado.Text = "Captcha inválido";
					return;
				}
			}

			// Si las validaciones del formulario fallan, no se ejecuta el envío
            if (!Page.IsValid)
            {
                return;
            }

            try
            {
                // 1. Sanitización de entradas para prevenir XSS
                string nombre = HttpUtility.HtmlEncode(txtNombre.Text.Trim());
                string email = HttpUtility.HtmlEncode(txtEmail.Text.Trim());
                string mensaje = HttpUtility.HtmlEncode(txtMensaje.Text.Trim());

                // 2. Lectura segura desde Web.config
                string emailTo = ConfigurationManager.AppSettings["EmailTo"];
                
                var correo = new MailMessage
                {
                    From = new MailAddress(ConfigurationManager.AppSettings["SmtpUser"], nombre),
                    Subject = "Nuevo mensaje de contacto de: " + nombre,
                    Body = "Nombre: " + nombre + "\nEmail: " + email + "\nMensaje:\n" + mensaje,
                    IsBodyHtml = false
                };
                correo.To.Add(emailTo);

                // 3. SmtpClient toma la configuración segura de Web.config (incluyendo SSL)
                var smtp = new SmtpClient();
                smtp.Send(correo);

                lblResultado.Text = "Mensaje enviado exitosamente.";
                lblResultado.ForeColor = System.Drawing.Color.Green;
            }
            catch (Exception)
            {
                // 4. Mensaje de error genérico para no filtrar información
                lblResultado.Text = "Ocurrió un error al enviar el mensaje. Inténtelo más tarde.";
                lblResultado.ForeColor = System.Drawing.Color.Red;
                // Internamente, el error real debería ser registrado en un log del servidor.
            }
        }
    </script>
</body>
</html>