Imports System
Imports System.Data
Imports System.IO
Imports System.Xml
Imports System.String
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports Microsoft.VisualBasic
Imports Telerik.QuickStart
Imports Telerik.Web.UI
Imports Quasar.Vigia.Ivc.Bll
Imports System.Text.RegularExpressions
Imports System.Diagnostics

Partial Class ETOZ_frmDatosVacAntirrabia
    Inherits System.Web.UI.Page

#Region "Declaración de Variables y Propiedades"

    Public oRutinas As New ClsRutinas
    Public oPropiedad As New RepVacunacion

#End Region

#Region "Ciclo de Vida de la Página"

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            InicializarFormulario()

            ' Lógica de edición por URL
            If Request.QueryString("opcion") = "Edit" AndAlso Request.QueryString("IdtblDatosVacuna") IsNot Nothing Then
                Dim id As Integer
                If Integer.TryParse(Request.QueryString("IdtblDatosVacuna"), id) Then
                    CargarDatos(id)
                End If
                btnInsertar.Visible = False
                btnActualizar.Visible = True
            Else
                btnInsertar.Visible = True
                btnActualizar.Visible = False
            End If
        Else
            ' ESTO SE EJECUTA CUANDO VIENE DEL POPUP (PostBack)
            Dim target As String = Request("__EVENTTARGET")
            If target.Contains("btnCargarCarnet") Or target.Contains("CargarCarnetPopup") Then
                Dim carnet As String = hdnCarnet.Value
                If Not String.IsNullOrEmpty(carnet) Then
                    CargarDatosPorCarnet(carnet)
                End If
            End If
        End If
    End Sub

    Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete
        If IsPostBack() Then
            Exit Sub
        End If

        If Session("IdUsuario") = 0 Then
            Response.Redirect("../Administrador/Seguridad/frmExpiroSession.aspx", True)
            Exit Sub
        End If
    End Sub

#End Region

#Region "Lógica de Inicialización y Modos (New/Edit/View)"

    Private Sub InicializarFormulario()
        Me.DataBind()
        CargarLEspecie()
        CargarLSexo()
        lbltxtOtroRaza.Visible = False
        txtOtroRaza.Enabled = False
        txtOtroRaza.Visible = False
        CargarLTipDoc()
        lblOtroTipDocProp.Visible = False
        txtOtroTipDocProp.Enabled = False
        txtOtroTipDocProp.Visible = False
        CargarLocalidades()
        CargarUPZ()
        CargarBarrio()
        InicializarDireccionInicio()
    End Sub

    Private Sub InicializarDireccionInicio()
        txtDireccionInicio.Enabled = False
        rcbLocalidad.Enabled = False
        rcbUpz.Enabled = False
        rcbBarrio.Enabled = False
        txtBarrioDigitado.Enabled = False
        aIngresarDireccionInicio.Style("display") = "none"
        chkAreaRuralInicio.Checked = False
    End Sub

    Private Sub InicializarCascadaDireccion()
        txtDireccionInicio.Text = ""
        ' Localidades
        rcbLocalidad.ClearSelection()
        rcbLocalidad.Items.Clear()
        CargarLocalidades()
        ' UPZ
        rcbUpz.ClearSelection()
        rcbUpz.Items.Clear()
        rcbUpz.Items.Insert(0, "Seleccione...")
        ' Barrio
        rcbBarrio.ClearSelection()
        rcbBarrio.Items.Clear()
        rcbBarrio.Items.Insert(0, "Seleccione...")
        txtBarrioDigitado.Text = ""
        txtBarrioDigitado.Enabled = False
    End Sub

    Private Sub LimpiarMunicipio()
        txtMunicipio.Text = ""
        txtDirMunicipio.Text = ""
    End Sub

    Private Sub LimpiarDireccion()
        txtDireccionInicio.Text = ""
        rcbLocalidad.ClearSelection()
        rcbLocalidad.Text = String.Empty
        rcbLocalidad.Items.Clear()
        rcbUpz.ClearSelection()
        rcbUpz.Text = String.Empty
        rcbUpz.Items.Clear()
        rcbBarrio.ClearSelection()
        rcbBarrio.Text = String.Empty
        rcbBarrio.Items.Clear()
        txtBarrioDigitado.Text = ""
        txtBarrioDigitado.Enabled = False
    End Sub

    Private Sub LimpiarComboRaza()
        rcbRaza.ClearSelection()
        rcbRaza.Items.Clear()
        rcbRaza.Text = ""
        rcbRaza.Items.Insert(0, New RadComboBoxItem("Seleccione tipo de raza...", ""))
    End Sub

    Private Sub LimpiarCampos()
        txtNombreAnimal.Text = String.Empty
        txtEdadAnios.Text = String.Empty
        txtEdadMes.Text = String.Empty
        rcbSexoAnimal.ClearSelection()
        rcbEspecie.ClearSelection()
        rcbRaza.ClearSelection()
        txtNomProp.Text = String.Empty
        txtApeProp.Text = String.Empty
        txtNumDocProp.Text = String.Empty
    End Sub

#End Region

#Region "Carga de Datos y Mapeo"

    Private Sub CargarDatos(id As Integer)
        Dim dr As DataRow = ObtenerDatosVacunaPorId(id)
        If dr Is Nothing Then Exit Sub
        hfIdRegistro.Value = id.ToString()
        Me.txtCarnet.Text = dr("NumeroCarnet").ToString
        Me.txtNombreAnimal.Text = dr("NombreAnimal").ToString
        ' Para Especie
        If Not IsDBNull(dr("IdEspecie")) AndAlso dr("IdEspecie").ToString() <> "0" Then
            Me.rcbEspecie.SelectedValue = dr("IdEspecie").ToString()
            Select Case dr("IdEspecie").ToString()
                Case "2006473" ' Canino
                    CargarRazaPorEspecie(rcbRaza, 5000196)
                Case "2006474" ' Felino
                    CargarRazaPorEspecie(rcbRaza, 5000195)
            End Select
        Else
            Dim item As RadComboBoxItem = rcbEspecie.FindItemByText(dr("Especie").ToString())
            If item IsNot Nothing Then item.Selected = True
        End If
        ' Para Raza
        If Not IsDBNull(dr("IdRaza")) Then
            Dim idRaza As String = dr("IdRaza").ToString()
            If rcbRaza.Items.FindItemByValue(idRaza) IsNot Nothing Then
                rcbRaza.SelectedValue = idRaza
            End If
        End If
        Me.txtOtroRaza.Text = dr("OtroRaza").ToString
        Me.txtEdadAnios.Text = dr("EdadAnios").ToString
        Me.txtEdadMes.Text = dr("EdadMes").ToString
        Me.rcbSexoAnimal.SelectedValue = dr("IdSexoAnimal")
        Me.txtNomProp.Text = dr("NombrePropietario").ToString
        Me.txtApeProp.Text = dr("ApellidoPropietario").ToString
        Me.rcbTipDocProp.SelectedValue = dr("IdTipDocPropietario")
        Me.txtOtroTipDocProp.Text = dr("OtroTipDocPropietario").ToString
        Me.txtNumDocProp.Text = dr("NumDocPropietario").ToString
        Me.chkReside.Checked = dr("Reside")
        Me.txtMunicipio.Text = dr("Municipio")
        Me.txtDirMunicipio.Text = dr("DireccionMun")
        'Me.chkAreaRuralInicio.Checked = dr("AreaRural")
        Me.txtDireccionInicio.Text = dr("Direccion")
        Me.rcbLocalidad.SelectedValue = dr("IdLocalidad")
        Me.rcbUpz.SelectedValue = dr("IdUpz")
        Me.rcbBarrio.SelectedValue = dr("IdBarrio")
        Me.txtBarrioDigitado.Text = dr("BarrioDigitado")
        Me.txtNumTel.Text = dr("Telefono")
        ViewState("IdtblDatosVacuna") = id
    End Sub

    ''' <summary></summary>
    ''' <param name="pIdRepJorVac"></param>
    ''' <returns>DataRow</returns>
    ''' <remarks></remarks>
    Private Function ObtenerDatosVacunaPorId(ByVal pIdRepJorVac As Integer) As DataRow
        Dim ObjParametros As New Collection
        Dim Parametro As New CmdParametro("@IdtblDatosVacuna", pIdRepJorVac, SqlDbType.Int, False)
        ObjParametros.Add(Parametro)
        Dim evento As Integer
        evento = 1204
        Dim dt As DataTable = clsBitacora.GetSelect("app.SpIVCSeleccionarDatosVacunaPorId", ObjParametros, HttpContext.Current.Session, evento, False).Tables(0)
        If dt.Rows.Count > 0 Then
            Return dt.Rows(0)
        Else
            Return Nothing
        End If
    End Function

    Private Function ValidarNumeroCarnet(ByVal pNumeroCarnet As String) As Boolean
        Dim ObjParametros As New Collection
        Dim Parametro As New CmdParametro("@NumeroCarnet", pNumeroCarnet, SqlDbType.VarChar, False)
        ObjParametros.Add(Parametro)
        Dim evento As Integer = 1205
        Dim dt As DataTable = clsBitacora.GetSelect("app.SpIvcValidarNumeroCarnet", ObjParametros, HttpContext.Current.Session, evento, False).Tables(0)
        If dt.Rows.Count > 0 Then
            Return Convert.ToInt32(dt.Rows(0)(0)) = 1
        Else
            Return False
        End If
    End Function

    Private Sub CargarDatosPorCarnet(carnet As String)
        Dim dr As DataRow = RepVacunacion.ObtenerDatosVacunaPorCarnet(carnet)
        If dr IsNot Nothing Then
            hfIdRegistro.Value = dr("IdtblDatosVacuna").ToString()
            txtCarnet.Text = dr("NumeroCarnet").ToString()
            txtNombreAnimal.Text = dr("NombreAnimal").ToString()
            CargarSeccionRazas(dr)
            txtEdadAnios.Text = dr("EdadAnios").ToString()
            txtEdadMes.Text = dr("EdadMes").ToString()
            rcbSexoAnimal.SelectedValue = dr("IdSexoAnimal").ToString()
            txtNomProp.Text = dr("NombrePropietario").ToString()
            txtApeProp.Text = dr("ApellidoPropietario").ToString()
            rcbTipDocProp.SelectedValue = dr("IdTipDocPropietario").ToString()
            txtNumDocProp.Text = dr("NumDocPropietario").ToString()
            txtOtroTipDocProp.Text = dr("OtroTipDocPropietario").ToString()
            chkReside.Checked = ToBool(dr("Reside"))
            txtMunicipio.Text = dr("Municipio").ToString()
            txtDirMunicipio.Text = dr("DireccionMun").ToString()
            chkAreaRuralInicio.Checked = dr("AreaRural").ToString()
            txtDireccionInicio.Text = dr("Direccion").ToString()
            rcbLocalidad.SelectedValue = dr("IdLocalidad").ToString()
            rcbUpz.SelectedValue = dr("IdUPZ").ToString()
            rcbBarrio.SelectedValue = dr("IdBarrio").ToString()
            txtBarrioDigitado.Text = dr("BarrioDigitado").ToString()
            txtNumTel.Text = dr("Telefono").ToString()
            btnInsertar.Visible = True
            btnActualizar.Visible = False
        End If
    End Sub

#End Region

#Region "Carga de Listas Desplegables (Combos)"

    Private Sub CargarLEspecie()
        CargarListaEspecie(rcbEspecie)
    End Sub

    Private Sub CargarLSexo()
        CargarListaSexo(rcbSexoAnimal)
    End Sub

    Private Sub CargarLTipDoc()
        CargarListaTipDoc(rcbTipDocProp)
    End Sub

    Private Sub CargarListaEspecie(ByRef rcb As RadComboBox)
        CargarCombo(rcb, 5000187, "Seleccione tipo de especie...")
    End Sub

    Private Sub CargarListaSexo(ByRef rcb As RadComboBox)
        CargarCombo(rcb, 5000189, "Seleccione tipo de sexo...")
    End Sub

    Private Sub CargarListaTipDoc(ByRef rcb As RadComboBox)
        CargarCombo(rcb, 5000186, "Seleccione tipo de documento...")
    End Sub

    Private Sub CargarRazaPorEspecie(ByRef rcb As RadComboBox, idLista As Integer)
        CargarCombo(rcb, idLista, "Seleccione tipo de raza...")
    End Sub

    Private Sub CargarCombo(ByRef rcb As RadComboBox, idLista As Integer, textoDefault As String)
        Dim parametros As New Collection
        parametros.Add(New CmdParametro("@IdTblListas", idLista, SqlDbType.Int, False))
        Dim ds = clsBitacora.GetSelect("SpIvcSeleccionarListadoOpcionesRepVac", parametros, Session, 2000037, False)
        rcb.Items.Clear()
        If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
            rcb.DataSource = numerarOpciones(ds.Tables(0))
            rcb.DataValueField = "idTblOpciones"
            rcb.DataTextField = "NombreOpcion"
            rcb.DataBind()
        End If
        rcb.Items.Insert(0, New RadComboBoxItem(textoDefault, ""))
    End Sub

    Private Sub CargarSeccionRazas(dr As DataRow)
        CargarListaEspecie(rcbEspecie)
        If IsDBNull(dr("IdEspecie")) Then Exit Sub
        Dim idEspecie As String = dr("IdEspecie").ToString()
        rcbEspecie.SelectedValue = idEspecie
        PoblarComboRazas(Convert.ToInt32(idEspecie))
        If Not IsDBNull(dr("IdRaza")) Then
            Dim idRazaBD As String = dr("IdRaza").ToString().Trim()
            EstablecerSeleccionCombo(rcbRaza, idRazaBD)
        End If
        txtOtroRaza.Text = dr("OtroRaza").ToString()
    End Sub

    Private Sub PoblarComboRazas(idEspecie As Integer)
        Dim parametros As New Collection
        parametros.Add(New CmdParametro("@IdEspecie", idEspecie, SqlDbType.Int, False))

        Dim ds = clsBitacora.GetSelect("SpIvcObtenerRazasFiltradas", parametros, Session, 2000037, False)

        rcbRaza.Items.Clear()
        If ds IsNot Nothing AndAlso ds.Tables(0).Rows.Count > 0 Then
            rcbRaza.DataSource = numerarOpciones(ds.Tables(0))
            rcbRaza.DataValueField = "idTblOpciones"
            rcbRaza.DataTextField = "NombreOpcion"
            rcbRaza.DataBind()
        End If
        rcbRaza.Items.Insert(0, New RadComboBoxItem("Seleccione tipo de raza...", ""))
    End Sub

    Private Sub CargarLocalidades()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblLocalidades", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbLocalidad.DataValueField = "idTblLocalidades"
        Me.rcbLocalidad.DataTextField = "nombreLocalidad"
        Me.rcbLocalidad.DataSource = dt
        Me.rcbLocalidad.DataBind()
        Me.rcbLocalidad.Items.Insert(0, "Seleccione...")
    End Sub

    Sub BindUpz()
        Dim listaUpz As New Data.DataTable
        If Me.rcbLocalidad.SelectedValue <> "" Then
            listaUpz = getUPZ(Me.rcbLocalidad.SelectedValue)
            Me.rcbUpz.DataValueField = "IdTblUpz"
            Me.rcbUpz.DataTextField = "NombreUPZ"
            Me.rcbUpz.DataSource = numerarOpciones(listaUpz)
            Me.rcbUpz.DataBind()
            Me.rcbUpz.Items.Insert(0, "Seleccione...")
        End If
    End Sub

    Private Sub CargarUPZ()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblUpz", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbUpz.DataValueField = "IdTblUpz"
        Me.rcbUpz.DataTextField = "NombreUPZ"
        Me.rcbUpz.DataSource = dt
        Me.rcbUpz.DataBind()
        Me.rcbUpz.Items.Insert(0, "Seleccione...")
    End Sub

    Private Sub CargarBarrio()
        Dim coleccionParametros As New Collection
        Dim dt As DataTable = clsBitacora.GetSelect("spGetTblBarrio", coleccionParametros, Session, 422, False).Tables(0)
        dt = numerarOpciones(dt)
        Me.rcbBarrio.DataValueField = "IdTblBarrios"
        Me.rcbBarrio.DataTextField = "NombreBarrio"
        Me.rcbBarrio.DataSource = dt
        Me.rcbBarrio.DataBind()
        Me.rcbBarrio.Items.Insert(0, "Seleccione...")
    End Sub

#End Region

#Region "Eventos de Controles UI"

    Protected Sub txtCarnet_TextChanged(sender As Object, e As EventArgs)
        If String.IsNullOrEmpty(txtCarnet.Text) Then Exit Sub

        Dim existe As Boolean = ValidarNumeroCarnet(txtCarnet.Text.Trim())

        If existe Then
            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "carnetExiste", "alert('⚠️ El número de carnet ya se encuentra registrado en el sistema.');", True)

            txtCarnet.Text = ""
            txtCarnet.Focus()
        End If
    End Sub

    Protected Sub rcbRaza_SelectedIndexChanged(sender As Object, e As Telerik.Web.UI.RadComboBoxSelectedIndexChangedEventArgs)

        ' Limpia siempre el campo
        lbltxtOtroRaza.Visible = False
        txtOtroRaza.Text = ""
        txtOtroRaza.Enabled = False
        txtOtroRaza.Visible = False

        ' Valida si seleccionó "Otro"
        If rcbRaza.SelectedItem IsNot Nothing Then
            If rcbRaza.SelectedItem.Text.ToUpper().Contains("OTRO") Then
                lbltxtOtroRaza.Visible = True
                txtOtroRaza.Enabled = True
                txtOtroRaza.Visible = True
                txtOtroRaza.Focus()
            End If
        End If

    End Sub

    Protected Sub rcbEspecie_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs) Handles rcbEspecie.SelectedIndexChanged
        Select Case rcbEspecie.SelectedValue
            Case "2006473" : CargarRazaPorEspecie(rcbRaza, 5000196)
            Case "2006474" : CargarRazaPorEspecie(rcbRaza, 5000195)
        End Select
    End Sub

    Protected Sub txtEdadAnios_TextChanged(sender As Object, e As EventArgs)
        If String.IsNullOrEmpty(txtEdadAnios.Text) OrElse Not IsNumeric(txtEdadAnios.Text) Then
            txtEdadAnios.Text = ""
            txtEdadMes.Enabled = True
            Return
        End If
        Dim meses As Integer = CInt(txtEdadAnios.Text)
        If meses < 0 Or meses > 11 Then
            txtEdadAnios.Text = ""
            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMeses", "alert('La edad en meses debe estar entre 0 y 11');", True)
            txtEdadMes.Enabled = True
        Else
            If meses = 0 Then
                txtEdadMes.Enabled = True
            Else
                txtEdadMes.Text = "0"
                txtEdadMes.Enabled = False
            End If
        End If
    End Sub

    Protected Sub txtEdadMes_TextChanged(sender As Object, e As EventArgs)
        If String.IsNullOrEmpty(txtEdadMes.Text) OrElse Not IsNumeric(txtEdadMes.Text) Then
            txtEdadMes.Text = ""
            txtEdadAnios.Enabled = True
            Return
        End If
        Dim meses As Integer = CInt(txtEdadMes.Text)
        If meses < 0 Or meses > 11 Then
            txtEdadMes.Text = ""
            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertMeses", "alert('La edad en meses debe estar entre 0 y 11');", True)
            txtEdadAnios.Enabled = True
        Else
            If meses = 0 Then
                txtEdadAnios.Enabled = True
            Else
                txtEdadAnios.Text = "0"
                txtEdadAnios.Enabled = False
            End If
        End If
    End Sub

    Protected Sub chkReside_CheckedChanged(sender As Object, e As EventArgs) Handles chkReside.CheckedChanged
        Dim resideBogota As Boolean = chkReside.Checked
        txtMunicipio.Enabled = Not resideBogota
        txtDirMunicipio.Enabled = Not resideBogota
        ' Sección dirección Bogotá
        txtDireccionInicio.Enabled = resideBogota
        aIngresarDireccionInicio.Style("display") = If(resideBogota, "inline", "none")
        If resideBogota Then
            LimpiarMunicipio()
            InicializarCascadaDireccion()
        Else
            LimpiarDireccion()
            InicializarDireccionInicio()
        End If

    End Sub

    Protected Sub chkAreaRuralInicio_CheckedChanged(sender As Object, e As EventArgs) _
        Handles chkAreaRuralInicio.CheckedChanged
        Dim esRural As Boolean = chkAreaRuralInicio.Checked
        txtDireccionInicio.Enabled = esRural
        rcbLocalidad.Enabled = esRural
        rcbUpz.Enabled = esRural
        rcbBarrio.Enabled = esRural
        aIngresarDireccionInicio.Style("display") = If(esRural, "none", "inline")
        If esRural Then
            InicializarCascadaDireccion()
        Else
            LimpiarDireccion()
        End If
    End Sub

    Protected Sub txtDireccion_TextChanged(sender As Object, e As EventArgs)
        If Me.txtDireccionInicio.Text.Trim.Length = 0 Then Exit Sub
        Dim oDir As New clsDireccion(Me.txtDireccionInicio.Text.Trim)
        If oDir.CodError <> 0 Then
            RadAjaxManager1.Alert(oDir.MsgError)
            Exit Sub
        End If
        CargarLocalidades()
        If Me.rcbLocalidad.Items.FindItemByValue(oDir.IdLocalidad) IsNot Nothing Then
            Me.rcbLocalidad.SelectedValue = oDir.IdLocalidad
        End If
        BindUpz()
        If Me.rcbUpz.Items.FindItemByValue(oDir.IdUpz) IsNot Nothing Then
            Me.rcbUpz.SelectedValue = oDir.IdUpz
        End If
        Me.rcbBarrio.DataSource = CargarBarriosLocalidad(oDir.IdLocalidad)
        Me.rcbBarrio.DataBind()
        Me.rcbBarrio.Items.Insert(0, "Seleccione...")
        If Me.rcbBarrio.Items.FindItemByValue(oDir.IdBarrio) IsNot Nothing Then
            Me.rcbBarrio.SelectedValue = oDir.IdBarrio
        End If
        RadAjaxManager1.ResponseScripts.Add("habilitarCombos();")
    End Sub

    Protected Sub rcbLocalidad_SelectedIndexChanged(sender As Object, e As EventArgs)
        BindUpz()
        Me.rcbBarrio.DataSource = CargarBarriosLocalidad(Me.rcbLocalidad.SelectedValue)
        Me.rcbBarrio.DataBind()
        Me.rcbBarrio.Items.Insert(0, "Seleccione...")
    End Sub

    Protected Sub rcbTipDocProp_SelectedIndexChanged(sender As Object, e As Telerik.Web.UI.RadComboBoxSelectedIndexChangedEventArgs)
        ' --- Reset OTRO ---
        lblOtroTipDocProp.Visible = False
        txtOtroTipDocProp.Text = String.Empty
        txtOtroTipDocProp.Visible = False

        ' --- Reset número documento ---
        txtNumDocProp.Text = ""
        txtNumDocProp.Enabled = True

        If rcbTipDocProp.SelectedItem Is Nothing Then Exit Sub

        ' Usamos SelectedValue directamente para la comparación
        Dim selectedVal As String = rcbTipDocProp.SelectedValue.Trim()

        ' --- OTRO (por texto) ---
        If rcbTipDocProp.SelectedItem.Text.ToUpper().Contains("OTRO") Then
            lblOtroTipDocProp.Visible = True
            txtOtroTipDocProp.Visible = True
            txtOtroTipDocProp.Enabled = True
            txtOtroTipDocProp.Focus()
        End If

        ' --- SIN DATO (por ID) ---
        ' Verifica que el ID sea EXACTAMENTE este, sin espacios.
        If selectedVal = "2006472" Then
            txtNumDocProp.Text = "9999"
            txtNumDocProp.Enabled = False
        End If
    End Sub

    Protected Sub txtNumTel_TextChanged(sender As Object, e As EventArgs)
        Dim telefono As String = txtNumTel.Text.Trim()
        If telefono = "9999" Then
            Exit Sub ' Es válido, no hacemos más validaciones
        End If
        If Not telefono.All(Function(c) Char.IsDigit(c)) Then
            txtNumTel.Text = ""
            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertTel", "alert('El teléfono solo debe contener números');", True)
            Exit Sub
        End If
        If telefono.Length <> 10 Then
            txtNumTel.Text = ""
            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "alertTel2", "alert('El número de teléfono debe tener exactamente 10 dígitos (o usar 9999)');", True)
            Exit Sub
        End If
    End Sub

#End Region

#Region "Funciones Auxiliares y Seguridad"

    Protected Function numerarOpciones(ByVal tablaANumerar As Data.DataTable) As Data.DataTable
        Dim i As Integer = 0
        Dim fila As Data.DataRow
        For Each fila In tablaANumerar.Rows
            i += 1
            fila.Item(1) = i & "-" & fila.Item(1).Trim
        Next
        Return tablaANumerar
    End Function

    Private Sub EstablecerSeleccionCombo(ByRef combo As RadComboBox, valor As String)
        combo.ClearSelection()
        Dim item = combo.FindItemByValue(valor)
        If item IsNot Nothing Then
            item.Selected = True
        Else
            combo.SelectedValue = valor
        End If
    End Sub

    ''' <summary>
    ''' Obtener lista de UPZ's por Localidad dada.
    ''' </summary>
    Function getUPZ(ByVal pIdLocalidad As Integer) As DataTable
        Dim dt As New DataTable
        Dim prmtIdEstab As New CmdParametro("@idLocalidad", pIdLocalidad, Data.SqlDbType.Int, False)
        Dim coleccionParametros As New Collection
        coleccionParametros.Add(prmtIdEstab)
        dt = clsBitacora.GetSelect("SpIVCSeleccionarUpzPorLocalidad", coleccionParametros, Session, 96, False).Tables(0)
        Return dt
    End Function

    ''' <summary>
    ''' Obtener lista de Barrios por Localidad.
    ''' </summary>
    Function CargarBarriosLocalidad(pIdLocalidad As Integer) As DataTable
        Dim dt As New DataTable
        Dim prmtIdEstab As New CmdParametro("@IdTblLocalidad", pIdLocalidad, Data.SqlDbType.Int, False)
        Dim coleccionParametros As New Collection
        coleccionParametros.Add(prmtIdEstab)
        dt = clsBitacora.GetSelect("spGetBarriosLocalidades", coleccionParametros, Session, 96, False).Tables(0)
        Dim Dr As DataRow = dt.NewRow
        Dr("idTblBarrios") = "9998"
        Dr("NombreBarrio") = "Otro barrio no estandar"
        dt.Rows.Add(Dr)
        Return dt
    End Function

    Public Function ToBool(value As Object) As Boolean
        If value Is Nothing OrElse IsDBNull(value) Then Return False
        Return Convert.ToBoolean(value)
    End Function

#End Region

#Region "Validaciones"

    ''' <summary>
    ''' Valida que el carnet cumpla con el formato: Prefijo(2) + 7 Números + Guion + Año Actual(2)
    ''' </summary>
    Private Function EsFormatoCarnetValido(ByVal carnet As String) As Boolean
        If String.IsNullOrEmpty(carnet) Then Return False
        Dim añoActual As String = DateTime.Now.ToString("yy")
        Dim patron As String = "^(VS|VN|VC|VO|VZ)\d{7}-" & añoActual & "$"
        Return Regex.IsMatch(carnet.Trim(), patron)
    End Function

    Private Function ValidarFormulario() As Boolean

        If String.IsNullOrEmpty(txtCarnet.Text) Then
            RadAjaxManager1.Alert("Debe digitar el número del carnet")
            Return False
        End If

        If Not EsFormatoCarnetValido(txtCarnet.Text) Then
            Dim añoMsg As String = DateTime.Now.ToString("yy")
            RadAjaxManager1.Alert("El formato del carnet es incorrecto. Ejemplo esperado: VS1234567-" & añoMsg)
            Return False
        End If

        If String.IsNullOrEmpty(txtNombreAnimal.Text) Then
            RadAjaxManager1.Alert("Debe digitar nombre del animal")
            Return False
        End If

        If rcbEspecie.SelectedItem Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar la especie del animal")
            Return False
        End If

        If rcbRaza.SelectedItem Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar la raza del animal")
            Return False
        End If

        If String.IsNullOrEmpty(txtEdadAnios.Text) Then
            RadAjaxManager1.Alert("Debe digitar el número de edad en años")
            Return False
        End If

        If String.IsNullOrEmpty(txtEdadMes.Text) Then
            RadAjaxManager1.Alert("Debe digitar el número de edad en meses")
            Return False
        End If

        If rcbSexoAnimal.SelectedItem Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar el sexo del animal")
            Return False
        End If

        If String.IsNullOrEmpty(txtNomProp.Text) Then
            RadAjaxManager1.Alert("Debe digitar el nombre del propietario")
            Return False
        End If

        If String.IsNullOrEmpty(txtApeProp.Text) Then
            RadAjaxManager1.Alert("Debe digitar el apellido del propietario")
            Return False
        End If

        If rcbTipDocProp.SelectedItem Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar el tipo de documento del propietario")
            Return False
        End If

        If String.IsNullOrEmpty(txtNumTel.Text) Then
            RadAjaxManager1.Alert("Debe digitar el número de teléfono del propitario (Debe conteener 10 dígitos)")
            Return False
        End If

        Return True

    End Function

#End Region

#Region "Persistencia de Datos (CRUD)"

    Protected Sub btnInsertar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnInsertar.Click

        If Not ValidarFormulario() Then
            Exit Sub
        End If

        Dim dt As DataTable
        If Session("dt") IsNot Nothing Then
            dt = CType(Session("dt"), DataTable)
        Else
            Dim obj As New RepVacunacion()
            dt = obj.Estructura()
        End If
        Dim row As DataRow = dt.NewRow()
        row("IdtblDatosVacuna") = dt.Rows.Count + 1
        row("NumeroCarnet") = txtCarnet.Text.ToUpper()
        row("NombreAnimal") = txtNombreAnimal.Text.ToUpper()

        Dim valorSeleccionado As Object = rcbEspecie.SelectedValue
        Dim idEspecie As Integer = 0
        Dim idSeleccionadoEspecie As String = rcbEspecie.SelectedValue
        If Not String.IsNullOrEmpty(idSeleccionadoEspecie) Then
            ' Si seleccionó algo de la lista cargada por CargarEspecie
            row("IdEspecie") = Convert.ToInt32(idSeleccionadoEspecie)
            row("Especie") = rcbEspecie.Text.Trim().ToUpper()
        ElseIf Not String.IsNullOrEmpty(rcbEspecie.Text) Then
            ' Si el usuario escribió algo manualmente que no está en la lista
            row("IdEspecie") = 0
            row("Especie") = rcbEspecie.Text.Trim().ToUpper()
        Else
            ' Si está vacío
            row("IdEspecie") = 0
            row("Especie") = "SIN ESPECIE"
        End If

        'Raza
        Dim valorSeleccionado1 As Object = rcbRaza.SelectedValue
        Dim idRaza As Integer = 0
        If rcbRaza.SelectedIndex <> -1 AndAlso valorSeleccionado1 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado1.ToString(), idRaza) Then
            row("IdRaza") = idRaza
            row("Raza") = rcbRaza.Text.Trim().ToUpper()
        ElseIf Not String.IsNullOrEmpty(rcbRaza.Text) Then
            row("IdRaza") = DBNull.Value
            row("Raza") = rcbRaza.Text.Trim().ToUpper()
        Else
            row("IdRaza") = DBNull.Value
            row("Raza") = "Sin Raza"
        End If

        row("OtroRaza") = txtOtroRaza.Text.ToUpper()
        row("EdadAnios") = txtEdadAnios.Text.ToUpper()
        row("EdadMes") = txtEdadMes.Text.ToUpper()

        'Sexo del animal
        Dim valorSeleccionado2 As Object = rcbSexoAnimal.SelectedValue
        Dim idSexoAnimal As Integer = 0
        If rcbSexoAnimal.SelectedIndex <> -1 AndAlso valorSeleccionado2 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado2.ToString(), idSexoAnimal) Then
            row("IdSexoAnimal") = idSexoAnimal
            row("SexoAnimal") = rcbSexoAnimal.Text.Trim().ToUpper()
        ElseIf Not String.IsNullOrEmpty(rcbSexoAnimal.Text) Then
            row("IdSexoAnimal") = DBNull.Value
            row("SexoAnimal") = rcbSexoAnimal.Text.Trim().ToUpper()
        Else
            row("IdSexoAnimal") = DBNull.Value
            row("SexoAnimal") = "Sin Sexo del animal"
        End If

        row("NombrePropietario") = txtNomProp.Text.ToUpper()
        row("ApellidoPropietario") = txtApeProp.Text.ToUpper()

        Dim valorSeleccionado3 As Object = rcbTipDocProp.SelectedValue
        Dim idTipDocPropietario As Integer = 0
        If rcbTipDocProp.SelectedIndex <> -1 AndAlso valorSeleccionado3 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado3.ToString(), idTipDocPropietario) Then
            row("IdTipDocPropietario") = idTipDocPropietario
            row("TipDocPropietario") = rcbTipDocProp.Text.Trim().ToUpper()
        ElseIf Not String.IsNullOrEmpty(rcbTipDocProp.Text) Then
            row("IdTipDocPropietario") = DBNull.Value
            row("TipDocPropietario") = rcbTipDocProp.Text.Trim().ToUpper()
        Else
            row("IdTipDocPropietario") = DBNull.Value
            row("TipDocPropietario") = "Sin Tipo de Documento del propietario"
        End If

        row("NumDocPropietario") = txtNumDocProp.Text.ToUpper()
        row("OtroTipDocPropietario") = txtOtroTipDocProp.Text.ToUpper()
        row("Reside") = chkReside.Checked
        row("Municipio") = txtMunicipio.Text.ToUpper()
        row("DireccionMun") = txtDirMunicipio.Text.ToUpper()
        row("AreaRural") = chkAreaRuralInicio.Checked
        row("Direccion") = txtDireccionInicio.Text.ToUpper()

        Dim valorSeleccionado4 As Object = rcbLocalidad.SelectedValue
        Dim idLocalidad As Integer = 0
        If valorSeleccionado4 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado4.ToString(), idLocalidad) Then
            row("IdLocalidad") = idLocalidad
            row("Localidad") = rcbLocalidad.Text.Trim().ToUpper()
        Else
            row("IdLocalidad") = DBNull.Value ' O un 0, dependiendo de tu base de datos
            row("Localidad") = "Sin Localidad"
        End If
        Dim valorSeleccionado5 As Object = rcbUpz.SelectedValue
        Dim idUPZ As Integer = 0
        If valorSeleccionado5 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado5.ToString(), idUPZ) Then
            row("IdUPZ") = idUPZ
            row("UPZ") = rcbUpz.Text.Trim().ToUpper()
        Else
            row("IdUPZ") = DBNull.Value ' O un 0, dependiendo de tu base de datos
            row("UPZ") = "Sin UPZ"
        End If
        Dim valorSeleccionado6 As Object = rcbBarrio.SelectedValue
        Dim idBarrio As Integer = 0
        If valorSeleccionado6 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado6.ToString(), idBarrio) Then
            row("IdBarrio") = idBarrio
            row("Barrio") = rcbBarrio.Text.Trim().ToUpper()
        Else
            row("IdBarrio") = DBNull.Value ' O un 0, dependiendo de tu base de datos
            row("Barrio") = "Sin Barrio"
        End If
        row("BarrioDigitado") = txtBarrioDigitado.Text.ToUpper()
        row("Telefono") = txtNumTel.Text.ToUpper()
        dt.Rows.Add(row)
        dt.AcceptChanges()
        Session("dt") = dt
        ClientScript.RegisterStartupScript(Page.GetType(), "mykey", "CloseAndRebind('navigateToInserted');", True)

    End Sub

    Protected Sub btnActualizar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnActualizar.Click

        If Not ValidarFormulario() Then
            Exit Sub
        End If

        Dim dt As DataTable = TryCast(Session("dt"), DataTable)
        If dt IsNot Nothing Then
            Dim idBusqueda As Integer
            If Not Integer.TryParse(hfIdRegistro.Value, idBusqueda) Then
                ' Aquí puedes mostrar mensaje o simplemente salir
                Exit Sub
            End If

            ' Buscamos la fila en el DataTable
            Dim row As DataRow = dt.AsEnumerable().FirstOrDefault(Function(r) r.Field(Of Integer)("IdtblDatosVacuna") = idBusqueda)
            If row IsNot Nothing Then
                ' 4. Asignar los nuevos valores a la fila encontrada
                row("NumeroCarnet") = txtCarnet.Text.ToUpper()
                row("NombreAnimal") = txtNombreAnimal.Text.ToUpper()

                ' --- Lógica de Especie ---
                Dim idSeleccionadoEspecie As String = rcbEspecie.SelectedValue
                If Not String.IsNullOrEmpty(idSeleccionadoEspecie) Then
                    row("IdEspecie") = Convert.ToInt32(idSeleccionadoEspecie)
                    row("Especie") = rcbEspecie.Text.Trim().ToUpper()
                ElseIf Not String.IsNullOrEmpty(rcbEspecie.Text) Then
                    row("IdEspecie") = 0
                    row("Especie") = rcbEspecie.Text.Trim().ToUpper()
                Else
                    row("IdEspecie") = 0
                    row("Especie") = "SIN ESPECIE"
                End If

                ' --- Raza ---
                Dim idRaza As Integer = 0
                If rcbRaza.SelectedIndex <> -1 AndAlso rcbRaza.SelectedValue IsNot Nothing AndAlso Integer.TryParse(rcbRaza.SelectedValue.ToString(), idRaza) Then
                    row("IdRaza") = idRaza
                    row("Raza") = rcbRaza.Text.Trim().ToUpper()
                Else
                    row("IdRaza") = DBNull.Value
                    row("Raza") = If(String.IsNullOrEmpty(rcbRaza.Text), "SIN RAZA", rcbRaza.Text.Trim().ToUpper())
                End If

                ' --- Datos Generales (Igual que en el insert) ---
                row("OtroRaza") = txtOtroRaza.Text.ToUpper()
                row("EdadAnios") = txtEdadAnios.Text.ToUpper()
                row("EdadMes") = txtEdadMes.Text.ToUpper()

                'Sexo del animal
                Dim valorSeleccionado2 As Object = rcbSexoAnimal.SelectedValue
                Dim idSexoAnimal As Integer = 0
                If rcbSexoAnimal.SelectedIndex <> -1 AndAlso valorSeleccionado2 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado2.ToString(), idSexoAnimal) Then
                    row("IdSexoAnimal") = idSexoAnimal
                    row("SexoAnimal") = rcbSexoAnimal.Text.Trim().ToUpper()
                ElseIf Not String.IsNullOrEmpty(rcbSexoAnimal.Text) Then
                    row("IdSexoAnimal") = DBNull.Value
                    row("SexoAnimal") = rcbSexoAnimal.Text.Trim().ToUpper()
                Else
                    row("IdSexoAnimal") = DBNull.Value
                    row("SexoAnimal") = "Sin Sexo del animal"
                End If

                row("NombrePropietario") = txtNomProp.Text.ToUpper()
                row("ApellidoPropietario") = txtApeProp.Text.ToUpper()

                'Tipo de documento
                Dim valorSeleccionado3 As Object = rcbTipDocProp.SelectedValue
                Dim idTipDocPropietario As Integer = 0
                If rcbTipDocProp.SelectedIndex <> -1 AndAlso valorSeleccionado3 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado3.ToString(), idTipDocPropietario) Then
                    row("IdTipDocPropietario") = idTipDocPropietario
                    row("TipDocPropietario") = rcbTipDocProp.Text.Trim().ToUpper()
                ElseIf Not String.IsNullOrEmpty(rcbTipDocProp.Text) Then
                    row("IdTipDocPropietario") = DBNull.Value
                    row("TipDocPropietario") = rcbTipDocProp.Text.Trim().ToUpper()
                Else
                    row("IdTipDocPropietario") = DBNull.Value
                    row("TipDocPropietario") = "Sin Tipo de Documento del propietario"
                End If

                row("NumDocPropietario") = txtNumDocProp.Text.ToUpper()
                row("OtroTipDocPropietario") = txtOtroTipDocProp.Text.ToUpper()
                row("Reside") = chkReside.Checked
                row("Municipio") = txtMunicipio.Text.ToUpper()
                row("DireccionMun") = txtDirMunicipio.Text.ToUpper()
                row("AreaRural") = chkAreaRuralInicio.Checked
                row("Direccion") = txtDireccionInicio.Text.ToUpper()

                Dim valorSeleccionado4 As Object = rcbLocalidad.SelectedValue
                Dim idLocalidad As Integer = 0
                If valorSeleccionado4 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado4.ToString(), idLocalidad) Then
                    row("IdLocalidad") = idLocalidad
                    row("Localidad") = rcbLocalidad.Text.Trim().ToUpper()
                Else
                    row("IdLocalidad") = DBNull.Value ' O un 0, dependiendo de tu base de datos
                    row("Localidad") = "Sin Localidad"
                End If
                Dim valorSeleccionado5 As Object = rcbUpz.SelectedValue
                Dim idUPZ As Integer = 0
                If valorSeleccionado5 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado5.ToString(), idUPZ) Then
                    row("IdUPZ") = idUPZ
                    row("UPZ") = rcbUpz.Text.Trim().ToUpper()
                Else
                    row("IdUPZ") = DBNull.Value ' O un 0, dependiendo de tu base de datos
                    row("UPZ") = "Sin UPZ"
                End If
                Dim valorSeleccionado6 As Object = rcbBarrio.SelectedValue
                Dim idBarrio As Integer = 0
                If valorSeleccionado6 IsNot Nothing AndAlso Integer.TryParse(valorSeleccionado6.ToString(), idBarrio) Then
                    row("IdBarrio") = idBarrio
                    row("Barrio") = rcbBarrio.Text.Trim().ToUpper()
                Else
                    row("IdBarrio") = DBNull.Value ' O un 0, dependiendo de tu base de datos
                    row("Barrio") = "Sin Barrio"
                End If
                row("BarrioDigitado") = txtBarrioDigitado.Text.ToUpper()
                row("Telefono") = txtNumTel.Text.ToUpper()

                ' 5. Guardar cambios
                dt.AcceptChanges()
                Session("dt") = dt

                ' 6. Cerrar ventana o refrescar
                ClientScript.RegisterStartupScript(Page.GetType(), "mykey", "CloseAndRebind('navigateToUpdated');", True)
            End If
        End If
    End Sub

#End Region



End Class


