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

Partial Class Quimica_EducacionSP
    Inherits System.Web.UI.Page

#Region "Declaración de Variables y Propiedades"

    Public oRutinas As New ClsRutinas
    Public oPropiedad As New EducacionSP
    Private ds As New DataTable

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

    ''' <summary>
    ''' Evento inicial de carga de la página. Inicializa la sesión y carga listas básicas.
    ''' </summary>
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' Inicializa estructura de tabla en sesión si no existe
        If Session("dt") Is Nothing Then
            Dim objActa As New EducacionSP()
            Session("dt") = objActa.Estructura()
        End If

        If Not IsPostBack Then
            ' Manejo de argumentos de eventos específicos
            If Request("__EVENTTARGET") = "SetEntidadBuscarEmpleado" Then
                Session("IdEntidadBuscarEmpleado") = Request("__EVENTARGUMENT")
            End If
            Me.DataBind()

            ' Carga inicial de listas desplegables
            cargarLineaIntervencion()
            GestionarOtrosLugares(False)
            cargarModalidad()
            CargarLocalidades()
            CargarUPZ()
            CargarBarrio()

            ' Configuración inicial (ocultar campos 'Otro y Ubicacion')
            InicializarDireccionInicio()
            InicializarCampoTematica()
        End If
    End Sub

    Protected Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Unload
        ' Solo limpiar si no es postback
        If Not IsPostBack Then
            Session.Remove("PaginaAbierta")
        End If
    End Sub

    ''' <summary>
    ''' Se ejecuta al completar la carga. Maneja la lógica según el modo (Edit, New, View).
    ''' </summary>
    Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete

        If IsPostBack Then Exit Sub
        Me.hddIdEntidad.Value = Session("IdEntidad")
        Dim sMode As String = Request.QueryString("opcion")
        Ese_Load() ' Carga nombre de la entidad/ESE
        Select Case sMode
            Case "Edit"
                ProcesarEditActa()
            Case "New"
                ProcesarNuevaActa()
            Case "View"
                ProcesarVisualizar()
        End Select

    End Sub

    ''' <summary>
    ''' Manejo de PostBacks específicos del Grid de Telerik.
    ''' </summary>
    Protected Overrides Sub RaisePostBackEvent(ByVal sourceControl As IPostBackEventHandler, ByVal eventArgument As String)
        MyBase.RaisePostBackEvent(sourceControl, eventArgument)

        If TypeOf sourceControl Is RadGrid Then
            Dim grid = CType(sourceControl, RadGrid)
            Select Case grid.ID
                Case "RGDatos"
                    Select Case eventArgument
                        Case "Rebind"
                            RGDatos.MasterTableView.SortExpressions.Clear()
                            RGDatos.MasterTableView.GroupByExpressions.Clear()
                            RGDatos.Rebind()
                        Case "RebindAndNavigate"
                            RGDatos.MasterTableView.SortExpressions.Clear()
                            RGDatos.MasterTableView.GroupByExpressions.Clear()
                            RGDatos.MasterTableView.CurrentPageIndex = RGDatos.MasterTableView.PageCount - 1
                            RGDatos.Rebind()
                    End Select
            End Select
        End If
    End Sub

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

    ''' <summary>
    ''' Prepara el formulario para un nuevo registro.
    ''' </summary>
    Private Sub ProcesarNuevaActa()
        Session("idTblEntidades") = Session("IdEntidad")
        LimpiarFormularioNuevoRegistro()
        If Session("dt") Is Nothing Then
            Dim objActa As New EducacionSP()
            Session("dt") = objActa.Estructura()
        End If
        Me.RGDatos.Rebind()
        Me.txtObservacion.Links.Clear()
        Me.txtESE.Enabled = False
        Ese_Load()
        Me.btnActualizar.Visible = False
    End Sub

    ''' <summary>
    ''' Carga los datos de un acta existente para edición.
    ''' </summary>
    Private Sub ProcesarEditActa()
        If Request.QueryString("idFortaCapac") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerReporteEducacionPorId(Request.QueryString("idFortaCapac"))
            If drRep IsNot Nothing Then
                Dim objRep As New EducacionSP
                Session("objRep") = objRep
                Ese_Load()
                Try
                    CargarDatosFormulario(drRep)
                    Session("dt") = objRep.Estructura()
                    CargarDatosEnSession(Convert.ToInt32(Request.QueryString("idFortaCapac")))
                    RGDatos.DataSource = Session("dt")
                    RGDatos.Rebind()
                    Me.btnInsertar.Visible = False
                Catch ex As Exception
                    RadAjaxManager1.Alert("Se presentó un error al cargar para editar." & ex.Message)
                End Try
            Else
                ' Manejar caso de registro no encontrado si es necesario
            End If
        End If
    End Sub

    ''' <summary>
    ''' Carga los datos en modo solo lectura.
    ''' </summary>
    Private Sub ProcesarVisualizar()
        If Request.QueryString("idFortaCapac") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerReporteEducacionPorId(Request.QueryString("idFortaCapac"))
            If drRep IsNot Nothing Then
                Dim objRep As New EducacionSP
                Session("objRep") = objRep
                Ese_Load()
                Try
                    CargarDatosFormulario(drRep)
                    BloquearControles(Me)
                    RGDatos.Enabled = False
                    RGDatos.MasterTableView.CommandItemDisplay = GridCommandItemDisplay.None
                    Me.txtObservacion.EditModes = Telerik.Web.UI.EditModes.Preview
                    Session("dt") = objRep.Estructura()
                    CargarDatosEnSession(Convert.ToInt32(Request.QueryString("idFortaCapac")))
                    RGDatos.DataSource = Session("dt")
                    RGDatos.Rebind()
                    Me.btnInsertar.Visible = False
                    Me.btnActualizar.Visible = False
                Catch ex As Exception
                    RadAjaxManager1.Alert("Error al cargar la visualización: " & ex.Message)
                End Try
            Else
                RadAjaxManager1.Alert("No se encontraron datos para el ID proporcionado.")
            End If
        End If
    End Sub

    Private Sub LimpiarFormularioNuevoRegistro()
        Dim objActa As New EducacionSP()
        Session("dt") = objActa.Estructura()
        RGDatos.DataSource = Session("dt")
        RGDatos.Rebind()
    End Sub

    Protected Sub Ese_Load()
        Dim coleccionParametros As New Collection
        Dim prmt_IdUsuario As New CmdParametro("@IdTblUsuarios", Session("IdUsuario"), Data.SqlDbType.Int, True)
        coleccionParametros.Add(prmt_IdUsuario)
        Dim nombreEntidad As String = clsBitacora.GetEscalar("SPIVCSeleccionarNombreInstitucionPorUsuario", coleccionParametros, Session, 1000015, False)
        txtESE.Text = nombreEntidad
    End Sub

    Private Sub ActualizarVisibilidadOtro()
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbTematica.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtraTem.Visible = mostrarOtro
        txtOtraTem.Enabled = mostrarOtro
    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 LimpiarDireccion()
        txtDireccionInicio.Text = ""
        rcbLocalidad.ClearSelection()
        rcbUpz.ClearSelection()
        rcbBarrio.ClearSelection()
        rcbLocalidad.SelectedIndex = -1
        rcbUpz.SelectedIndex = -1
        rcbBarrio.SelectedIndex = -1
        txtBarrioDigitado.Text = ""
        txtBarrioDigitado.Enabled = False
    End Sub

#End Region

#Region "Carga de Datos y Mapeo"

    ''' <summary>
    ''' Mapea los datos de un DataRow a los controles del formulario.
    ''' </summary>
    Private Sub CargarDatosFormulario(drRep As DataRow)
        Me.hddIdEntidad.Value = drRep("IdTblEntidad")
        Me.txtESE.Text = drRep("ESEFortCap")
        Me.rcbLineaInt.SelectedValue = drRep("LineaFortcap").ToString()
        cargarTipoActividadLinea(Me.rcbLineaInt.SelectedValue)
        Me.rcbTipAct.SelectedValue = drRep("TipFort").ToString()
        Me.txtFechaAct.SelectedDate = drRep("FechaFortCap")
        Me.txtHoraInicio.SelectedDate = drRep("HoraFortCap")
        Me.txtHoraFinal.SelectedDate = drRep("HoraFinal")
        Me.txtLugarActP.Text = drRep("LugarFortCap")
        Me.chkOtroLugar.Checked = Convert.ToBoolean(drRep("OtroLugar"))
        GestionarOtrosLugares(Me.chkOtroLugar.Checked)
        Me.txtLugarAct2.Text = drRep("LugarAct2")
        Me.txtLugarAct3.Text = drRep("LugarAct3")
        Me.txtLugarAct4.Text = drRep("LugarAct4")
        Me.txtLugarAct5.Text = drRep("LugarAct5")
        Me.chkAreaRuralInicio.Checked = Convert.ToBoolean(drRep("AreaRuralInicio"))
        ConfigurarAreaRural(Me.chkAreaRuralInicio.Checked)
        Me.txtDireccionInicio.Text = drRep("DireccionInicio")
        Me.rcbLocalidad.SelectedValue = drRep("LocalidadFortCap")
        Me.rcbUpz.SelectedValue = drRep("UPZFortCap")
        Me.rcbBarrio.SelectedValue = drRep("IdBarrio")
        Me.txtBarrioDigitado.Text = drRep("BarrioDigitado")
        ActualizarVisibilidadOtro()
        cargarTipoActTematica(Me.rcbTipAct.SelectedValue)
        Dim tematicas As String = drRep("TematicaFortCap").ToString()
        Dim valores() As String = tematicas.Split(","c)
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbTematica.Items
            If valores.Contains(item.Value) Then
                item.Checked = True
                If item.Text.ToUpper().Contains("OTRO") Then
                    mostrarOtro = True
                End If
            End If
        Next
        txtOtraTem.Visible = mostrarOtro
        txtOtraTem.Enabled = mostrarOtro
        lblOtraTem.Visible = mostrarOtro
        Me.txtOtraTem.Text = drRep("OtroTematica")
        Me.hddIdFuncionario1.Value = drRep("Id_FuncionarioSalud1")
        Me.txtNombreColaborador1.Text = drRep("NombreFuncionario")
        Me.hddIdFuncionario2.Value = drRep("IdFuncionario2")
        Me.txtNombreColaborador2.Text = ValorSeguro(drRep, "NombreColaborador2")
        Me.txtPobObj.Text = drRep("PobObjFortCap")
        Me.txtTotalAsis.Text = drRep("TotAsistFortCap")
        Me.rcbModalidad.SelectedValue = drRep("ModalidadFortCap")
        Me.txtObservacion.Content = drRep("ObservacionFortCap").ToString()
    End Sub

    Private Sub GestionarOtrosLugares(activar As Boolean)
        For i As Integer = 2 To 5
            Dim div As Control = FindControl("divLugarAct" & i)
            Dim txt As Telerik.Web.UI.RadTextBox = CType(FindControl("txtLugarAct" & i), Telerik.Web.UI.RadTextBox)
            If div IsNot Nothing Then
                div.Visible = activar
            End If
            If txt IsNot Nothing Then
                txt.ReadOnly = Not activar

                If Not activar Then
                    txt.Text = ""
                End If
            End If
        Next
    End Sub

    Private Function ObtenerReporteEducacionPorId(ByVal pIdRepEduc As Integer) As DataRow
        Dim ObjParametros As New Collection
        Dim Parametro As New CmdParametro("@idFortaCapac", pIdRepEduc, SqlDbType.Int, False)
        ObjParametros.Add(Parametro)
        Dim evento As Integer = 1204
        Dim dt As DataTable = clsBitacora.GetSelect("app.SpIVCSeleccionarRepEducacionPorId", 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 Sub CargarDatosEnSession(ByVal pId As Integer)
        Dim ObjParametros As New Collection
        Dim Parametro As New CmdParametro("@Id", pId, SqlDbType.Int, False)
        ObjParametros.Add(Parametro)
        Dim evento As Integer = 5000138
        Dim ds As DataSet = clsBitacora.GetSelect("app.spIVCSeleccionarDatosEducacionSP", ObjParametros, HttpContext.Current.Session, evento, False)
        If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
            Dim datos As DataTable = ds.Tables(0)
            Dim dtSession As DataTable = DirectCast(Session("dt"), DataTable)
            dtSession.Merge(datos)
            Session("dt") = dtSession
        End If
    End Sub

#End Region

#Region "Carga de Listas Desplegables (Combos)"

    Private Sub cargarLineaIntervencion()
        rcbLineaInt.Items.Clear()
        Dim parametros As New Collection
        Dim evento As Integer = 1205
        Dim ds As DataSet = clsBitacora.GetSelect("app.SpIVCSeleccionarLineaIntervencion", parametros, Session, evento, False)
        Dim dt As DataTable = ds.Tables(0)
        If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
            For Each row As DataRow In dt.Rows
                Dim item As New RadComboBoxItem()
                item.Text = row("NombreLinea").ToString()
                item.Value = row("IdTblSPPLineas").ToString()
                rcbLineaInt.Items.Add(item)
            Next
        End If
        ' Eliminar item especifico si existe
        Dim itemEliminar As RadComboBoxItem = rcbLineaInt.FindItemByValue("9999")
        If itemEliminar IsNot Nothing Then itemEliminar.Remove()
    End Sub

    Private Sub cargarTipoActividadLinea(idLinea As String)

        rcbTipAct.Items.Clear()
        Dim parametros As New Collection
        Dim prmt_IdLinea As New CmdParametro("@IdTblSPPLineas", idLinea, Data.SqlDbType.Int, True)
        parametros.Add(prmt_IdLinea)
        Dim evento As Integer = 1205
        Dim ds As DataSet = clsBitacora.GetSelect("app.SpIVCSeleccionarTipoActividadPorLinea", parametros, Session, evento, False)
        If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
            Dim dt As DataTable = ds.Tables(0)
            For Each row As DataRow In dt.Rows
                Dim item As New RadComboBoxItem()
                item.Text = row("NombreOpcion").ToString()
                item.Value = row("idTblFortalecimiento").ToString()
                rcbTipAct.Items.Add(item)
            Next
        End If

    End Sub

    Private Sub cargarTipoActTematica(idTipAct As String)

        rcbTematica.Items.Clear()
        Dim parametros As New Collection
        Dim prmt_IdTipAct As New CmdParametro("@IdFortalecimiento", idTipAct, Data.SqlDbType.Int, True)
        parametros.Add(prmt_IdTipAct)
        Dim evento As Integer = 1205
        Dim ds As DataSet = clsBitacora.GetSelect("app.SpIVCSeleccionarTipoActividadPorTematica", parametros, Session, evento, False)
        If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
            Dim dt As DataTable = ds.Tables(0)
            For Each row As DataRow In dt.Rows
                Dim item As New RadComboBoxItem()
                item.Text = row("NombreOpcion").ToString()
                item.Value = row("idTblTematica").ToString()
                rcbTematica.Items.Add(item)
            Next
        End If

    End Sub

    Private Sub cargarModalidad()

        rcbModalidad.Items.Clear()
        Dim parametros As New Collection ' ← vacío porque el SP ya no recibe parámetros
        Dim evento As Integer = 1205
        Dim ds As DataSet = clsBitacora.GetSelect("app.SpIVCSeleccionarModalidadById", parametros, Session, evento, False)
        If ds IsNot Nothing AndAlso ds.Tables.Count > 0 Then
            Dim dt As DataTable = ds.Tables(0)
            If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
                For Each row As DataRow In dt.Rows
                    Dim item As New RadComboBoxItem()
                    item.Text = row("NombreOpcion").ToString()
                    item.Value = row("idTblOpciones").ToString()
                    rcbModalidad.Items.Add(item)
                Next
            End If
        End If
        rcbModalidad.Items.Insert(0, New RadComboBoxItem("Seleccione Modalidad...", ""))

    End Sub

    ''' <summary>
    ''' Inicializa los controles de Tematica (ocultando 'Otro').
    ''' </summary>
    Private Sub InicializarCampoTematica()
        txtOtraTem.Enabled = False : txtOtraTem.Visible = False : CargarOtroTem()
    End Sub

    ' Método genérico para cargar Tematicas (Para simplificar, mantengo tus funciones separadas pero agrupadas)
    Private Sub CargarOtroTem()
        If Not String.IsNullOrEmpty(rcbTematica.SelectedValue) Then
            cargarTipoActTematica(rcbTematica.SelectedValue)
        End If
    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

    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

    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 ConfigurarAreaRural(esRural As Boolean)

        txtDireccionInicio.Enabled = esRural
        rcbLocalidad.Enabled = esRural
        rcbUpz.Enabled = esRural
        rcbBarrio.Enabled = esRural

        aIngresarDireccionInicio.Style("display") = If(esRural, "none", "inline")

    End Sub

#End Region
#Region "Eventos de Controles UI"

    Protected Sub rcbLineaInt_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs)

        If Not String.IsNullOrEmpty(rcbLineaInt.SelectedValue) Then
            cargarTipoActividadLinea(rcbLineaInt.SelectedValue)
        Else
            rcbTipAct.Items.Clear()
        End If

    End Sub

    Protected Sub rcbTipAct_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs)

        If Not String.IsNullOrEmpty(rcbTipAct.SelectedValue) Then
            cargarTipoActTematica(rcbTipAct.SelectedValue)
        Else
            rcbTematica.Items.Clear()
        End If

    End Sub

    Protected Sub chkOtroLugar_CheckedChanged(sender As Object, e As EventArgs)
        GestionarOtrosLugares(chkOtroLugar.Checked)
    End Sub

    ' --- Eventos de selección de Roles (Mostrar/Ocultar 'Otro') ---
    Protected Sub rcbOtroTemat_SelectedIndexChanged(sender As Object, e As RadComboBoxSelectedIndexChangedEventArgs)
        Dim mostrarOtro As Boolean = False
        For Each item As RadComboBoxItem In rcbTematica.CheckedItems
            If item.Text.ToUpper().Contains("OTRO") Then
                mostrarOtro = True
                Exit For
            End If
        Next
        txtOtraTem.Visible = mostrarOtro
        txtOtraTem.Enabled = mostrarOtro
        lblOtraTem.Visible = mostrarOtro
        If mostrarOtro Then
            txtOtraTem.Focus()
        Else
            txtOtraTem.Text = ""
        End If
    End Sub

    Protected Sub chkAreaRuralInicio_CheckedChanged(sender As Object, e As EventArgs) Handles chkAreaRuralInicio.CheckedChanged
        ConfigurarAreaRural(chkAreaRuralInicio.Checked)

        If chkAreaRuralInicio.Checked Then
            InicializarCascadaDireccion()
        Else
            LimpiarDireccion()
        End If
    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 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

#End Region
#Region "Lógica del Grid (RadGrid)"

    Protected Sub RGDatos_ItemCreated(ByVal sender As Object, ByVal e As Telerik.Web.UI.GridItemEventArgs) Handles RGDatos.ItemCreated
        If TypeOf e.Item Is GridDataItem Then
            Dim btnEdit As LinkButton = DirectCast(e.Item.FindControl("BtnEdit"), LinkButton)
            If btnEdit IsNot Nothing Then
                Dim idVacuna As String = e.Item.OwnerTableView.DataKeyValues(e.Item.ItemIndex)("IdtblResultadosFC").ToString()
                Dim index As String = e.Item.ItemIndex.ToString()
                ' Configuramos JS para abrir popup de edición
                btnEdit.Attributes("onclick") = String.Format("return ShowEditFormRes('{0}','{1}');", idVacuna, index)
            End If
        End If
    End Sub

    Protected Sub RGDatos_NeedDataSource(ByVal source As Object, ByVal e As Telerik.Web.UI.GridNeedDataSourceEventArgs) Handles RGDatos.NeedDataSource
        Dim dt As DataTable
        If Session("dt") IsNot Nothing Then
            dt = CType(Session("dt"), DataTable)
        Else
            Dim objActa As New EducacionSP()
            dt = objActa.Estructura()
        End If
        RGDatos.DataSource = dt

    End Sub

    Protected Sub RGDatos_ItemDataBound(sender As Object, e As Telerik.Web.UI.GridItemEventArgs) Handles RGDatos.ItemDataBound
        If TypeOf e.Item Is Telerik.Web.UI.GridDataItem Then
            Dim item As Telerik.Web.UI.GridDataItem = CType(e.Item, Telerik.Web.UI.GridDataItem)
            Dim btnEdit As LinkButton = CType(item.FindControl("BtnEdit"), LinkButton)
            Dim btnDelete As LinkButton = CType(item.FindControl("BtnDelete"), LinkButton)
            If btnEdit IsNot Nothing AndAlso Request.QueryString("opcion") = "View" Then
                btnEdit.Visible = False
                btnDelete.Visible = False
            End If
        End If
    End Sub

    Protected Sub RGDatos_DeleteCommand(ByVal source As Object, ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles RGDatos.DeleteCommand
        If Not IsNothing(Session("dt")) Then
            ds = Session("dt")
            ds.Rows(e.Item.ItemIndex).Delete()
            ds.AcceptChanges()
            Session("dt") = ds
        End If
    End Sub

#End Region
#Region "Cálculos y Resúmenes Estadísticos"
#End Region
#Region "Funciones Auxiliares y Seguridad"

    ''' <summary>
    ''' Agrega un índice numérico al principio del texto de las opciones.
    ''' </summary>
    Protected Function numerarOpciones(ByVal tablaANumerar As Data.DataTable) As Data.DataTable
        Dim i As Integer = 0
        For Each fila As Data.DataRow In tablaANumerar.Rows
            i += 1
            fila.Item(1) = i & "-" & fila.Item(1).Trim
        Next
        Return tablaANumerar
    End Function

    ''' <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

    ''' <summary>
    ''' Bloquea recursivamente todos los controles de entrada del formulario.
    ''' </summary>
    Private Sub BloquearControles(ByVal contenedor As Control)
        For Each ctrl As Control In contenedor.Controls
            ' 1. CheckBox estándar
            If TypeOf ctrl Is CheckBox Then
                DirectCast(ctrl, CheckBox).Enabled = False
            End If

            ' 2. TextBox estándar
            If TypeOf ctrl Is TextBox Then
                DirectCast(ctrl, TextBox).ReadOnly = True
            End If

            ' 3. Controles Telerik (por reflexión para cubrir varios tipos)
            If ctrl.ID IsNot Nothing Then
                If ctrl.ID.StartsWith("rcb") Or ctrl.ID.StartsWith("txt") Or ctrl.ID.StartsWith("date") Or ctrl.ID.StartsWith("chk") Then
                    Try
                        If ctrl.GetType().GetProperty("ReadOnly") IsNot Nothing Then
                            ctrl.GetType().GetProperty("ReadOnly").SetValue(ctrl, True, Nothing)
                        End If
                        If ctrl.GetType().GetProperty("Enabled") IsNot Nothing Then
                            ctrl.GetType().GetProperty("Enabled").SetValue(ctrl, False, Nothing)
                        End If
                    Catch
                    End Try
                End If
            End If

            ' 4. Recursividad para contenedores hijos
            If ctrl.HasControls() Then
                BloquearControles(ctrl)
            End If
        Next

        ' Ocultar botones de acción específicos
        aIngresarDireccionInicio.Visible = False
        btnLookupFuncionario1.Visible = False
        btnLookupFuncionario2.Visible = False
        btnClearFuncionario2.Visible = False
    End Sub

    Private Sub InicializarDireccionInicio()
        ' Bloquear controles al iniciar
        txtDireccionInicio.Enabled = False
        rcbLocalidad.Enabled = False
        rcbUpz.Enabled = False
        rcbBarrio.Enabled = False

        aIngresarDireccionInicio.Style("visibility") = "visible"
        chkAreaRuralInicio.Checked = False
    End Sub

    Function ValorSeguro(dr As DataRow, columna As String) As String
        If IsDBNull(dr(columna)) Then
            Return String.Empty
        End If
        Return dr(columna).ToString()
    End Function

#End Region
#Region "Validaciones"

    ' VALIDACIÓN GENERAL
    Private Function ValidarFormulario() As Boolean
        If Not ValidarTextos() Then Return False
        If Not ValidarDesplegables() Then Return False
        'If Not ValidarCheck() Then Return False
        If Not ValidarDate() Then Return False
        If Not ValidarDireccion() Then Return False
        If Not ValidarColaboradores() Then Return False
        If Not ValidarTablas() Then Return False
        Return True
    End Function

    Private Function ValidarTextos() As Boolean
        If String.IsNullOrEmpty(txtLugarActP.Text) Then
            RadAjaxManager1.Alert("Debe digitar el lugar donde se realizó la actividad principal")
            Return False
        End If
        If String.IsNullOrEmpty(txtPobObj.Text) Then
            RadAjaxManager1.Alert("Debe digitar la población objeto")
            Return False
        End If
        If String.IsNullOrEmpty(txtTotalAsis.Text) Then
            RadAjaxManager1.Alert("Debe digitar el total de asistentes")
            Return False
        End If


        Return True
    End Function

    Private Function ValidarDesplegables() As Boolean
        If rcbLineaInt.SelectedItem Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar la línea de intervención")
            Return False
        End If
        If rcbTipAct.SelectedItem Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar el tipo de actividad")
            Return False
        End If
        If rcbTematica.SelectedItem Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar el tipo de temática")
            Return False
        End If
        If rcbModalidad.SelectedItem Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar el tipo de modalidad")
            Return False
        End If

        Return True
    End Function

    Private Function ValidarDate() As Boolean
        If Not txtFechaAct.SelectedDate.HasValue Then
            RadAjaxManager1.Alert("Debe ingresar la fecha de aplicación de la actividad")
            Return False
        End If
        If txtFechaAct.SelectedDate.Value.Date > Date.Today Then
            RadAjaxManager1.Alert("La fecha de aplicación no puede ser superior a hoy")
            Return False
        End If
        If txtHoraInicio.SelectedDate Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar la hora de inicio")
            Return False
        End If
        If txtHoraFinal.SelectedDate Is Nothing Then
            RadAjaxManager1.Alert("Debe seleccionar la hora final")
            Return False
        End If
        Dim horaInicio As DateTime = txtHoraInicio.SelectedDate.Value
        Dim horaFinal As DateTime = txtHoraFinal.SelectedDate.Value
        If horaFinal <= horaInicio Then
            RadAjaxManager1.Alert("La hora final debe ser mayor que la hora de inicio")
            Return False
        End If
        Return True
    End Function

    ' VALIDACIÓN DIRECCIÓN
    Private Function ValidarDireccion() As Boolean
        If String.IsNullOrEmpty(txtDireccionInicio.Text) Then
            RadAjaxManager1.Alert("Debe existir dirección del punto de de la actividad realizada")
            Return False
        End If
        Return True
    End Function

    Private Function ValidarColaboradores() As Boolean
        If String.IsNullOrEmpty(txtNombreColaborador1.Text) Then
            RadAjaxManager1.Alert("Debe seleccionar un colaborador (Nombre completo)")
            Return False
        End If

        Return True
    End Function

    Private Function ValidarTablas() As Boolean
        If Session("dt") Is Nothing Then
            RadAjaxManager1.Alert("Debe ingresar al menos un registro en la tabla de Resultados.")
            Return False
        End If

        Dim dt As DataTable = CType(Session("dt"), DataTable)

        If dt.Rows.Count = 0 Then
            RadAjaxManager1.Alert("Debe ingresar al menos un registro en la tabla de Resultados.")
            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

        Dim ObjRep As New EducacionSP
        Try
            ' Mapeo de controles a objeto de negocio
            If Session("IdUsuario") IsNot Nothing Then
                ObjRep.idTblUsuarioCreoRegistro = CInt(Session("IdUsuario"))
            End If
            ObjRep.IdEntidad = Me.hddIdEntidad.Value
            ObjRep.ESE = Me.txtESE.Text
            ObjRep.LineaInt = Me.rcbLineaInt.SelectedValue
            ObjRep.TipAct = Me.rcbTipAct.SelectedValue
            ObjRep.FechaAct = Me.txtFechaAct.SelectedDate
            ObjRep.HoraInicio = Me.txtHoraInicio.SelectedTime
            ObjRep.HoraFinal = Me.txtHoraFinal.SelectedTime
            ObjRep.LugarActP = Me.txtLugarActP.Text
            ObjRep.OtroLugar = Me.chkOtroLugar.Checked
            ObjRep.LugarAct2 = Me.txtLugarAct2.Text
            ObjRep.LugarAct3 = Me.txtLugarAct3.Text
            ObjRep.LugarAct4 = Me.txtLugarAct4.Text
            ObjRep.LugarAct5 = Me.txtLugarAct5.Text
            ObjRep.AreaRuralInicio = Me.chkAreaRuralInicio.Checked
            ObjRep.DireccionInicio = Me.txtDireccionInicio.Text
            ObjRep.IdLocalidad = Me.rcbLocalidad.SelectedValue
            ObjRep.IdUpz = Me.rcbUpz.SelectedValue
            ObjRep.IdBarrio = Me.rcbBarrio.SelectedValue
            ObjRep.BarrioDigitado = Me.txtBarrioDigitado.Text
            Dim valores As New List(Of String)

            For Each item As Telerik.Web.UI.RadComboBoxItem In rcbTematica.CheckedItems
                valores.Add(item.Value)
            Next

            ObjRep.Tematica = String.Join(",", valores.ToArray())
            ObjRep.OtraTem = Me.txtOtraTem.Text
            ObjRep.IdFuncionario1 = Me.hddIdFuncionario1.Value
            ObjRep.NombreColaborador1 = Me.txtNombreColaborador1.Text
            ' COLABORADOR 2
            If hddIdFuncionario2.Value <> "0" Then
                ObjRep.IdFuncionario2 = Me.hddIdFuncionario2.Value
                ObjRep.NombreColaborador2 = Me.txtNombreColaborador2.Text
            Else
                ObjRep.IdFuncionario2 = 0
                ObjRep.NombreColaborador2 = Nothing
            End If
            ObjRep.PobObj = Me.txtPobObj.Text
            ObjRep.TotalAsis = Me.txtTotalAsis.Text
            ObjRep.Modalidad = Me.rcbModalidad.SelectedValue
            ObjRep.Observacion = Me.txtObservacion.Text

            ObjRep.DatosResultados = Session("dt")

            ' Acción Insertar
            If Request.QueryString("opcion") = "New" Then
                Dim idRegistro As Integer = ObjRep.Insertar()
                If idRegistro > 0 Then
                    RadAjaxManager1.ResponseScripts.Add("CloseAndRebindInsert(" & idRegistro & ");")
                    RadAjaxManager1.Alert("Formulario ingresado correctamente")
                Else
                    Me.RadAjaxManager1.Alert("Se produjo un error al guardar.")
                End If
            Else
                ' Lógica de actualización (Si se habilita en el futuro)
            End If

        Catch ex As Exception
            RadAjaxManager1.Alert("Se presento un error al guardar." & ex.Message)
        End Try
    End Sub

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

        If Not ValidarFormulario() Then Exit Sub
        Dim ObjRep As New EducacionSP
        Try
            If Request.QueryString("idFortaCapac") IsNot Nothing Then
                Dim idAEditar As Integer = Convert.ToInt32(Request.QueryString("idFortaCapac"))
                ObjRep.idFortaCapac = CInt(Request.QueryString("idFortaCapac")) ' Ajusta según cómo guardes tu ID
                ObjRep.IdEntidad = Me.hddIdEntidad.Value
                ObjRep.ESE = Me.txtESE.Text
                ObjRep.LineaInt = Me.rcbLineaInt.SelectedValue
                ObjRep.TipAct = Me.rcbTipAct.SelectedValue
                ObjRep.FechaAct = Me.txtFechaAct.SelectedDate
                ObjRep.HoraInicio = Me.txtHoraInicio.SelectedTime
                ObjRep.HoraFinal = Me.txtHoraFinal.SelectedTime
                ObjRep.LugarActP = Me.txtLugarActP.Text
                ObjRep.OtroLugar = Me.chkOtroLugar.Checked
                ObjRep.LugarAct2 = Me.txtLugarAct2.Text
                ObjRep.LugarAct3 = Me.txtLugarAct3.Text
                ObjRep.LugarAct4 = Me.txtLugarAct4.Text
                ObjRep.LugarAct5 = Me.txtLugarAct5.Text
                ObjRep.AreaRuralInicio = Me.chkAreaRuralInicio.Checked
                ObjRep.DireccionInicio = Me.txtDireccionInicio.Text
                ObjRep.IdLocalidad = Me.rcbLocalidad.SelectedValue
                ObjRep.IdUpz = Me.rcbUpz.SelectedValue
                ObjRep.IdBarrio = Me.rcbBarrio.SelectedValue
                ObjRep.BarrioDigitado = Me.txtBarrioDigitado.Text
                Dim valores As New List(Of String)

                For Each item As Telerik.Web.UI.RadComboBoxItem In rcbTematica.CheckedItems
                    valores.Add(item.Value)
                Next
                ObjRep.Tematica = String.Join(",", valores.ToArray())
                ObjRep.OtraTem = Me.txtOtraTem.Text
                ObjRep.IdFuncionario1 = Me.hddIdFuncionario1.Value
                ObjRep.NombreColaborador1 = Me.txtNombreColaborador1.Text
                ' COLABORADOR 2
                If hddIdFuncionario2.Value <> "0" Then
                    ObjRep.IdFuncionario2 = Me.hddIdFuncionario2.Value
                    ObjRep.NombreColaborador2 = Me.txtNombreColaborador2.Text
                Else
                    ObjRep.IdFuncionario2 = 0
                    ObjRep.NombreColaborador2 = Nothing
                End If
                ObjRep.PobObj = Me.txtPobObj.Text
                ObjRep.TotalAsis = Me.txtTotalAsis.Text
                ObjRep.Modalidad = Me.rcbModalidad.SelectedValue
                ObjRep.Observacion = Me.txtObservacion.Text
                If Session("IdUsuario") IsNot Nothing Then
                    ObjRep.idTblUsuarioCreoRegistro = CInt(Session("IdUsuario"))
                End If

                ' Datos de la Grilla/Detalle
                ObjRep.DatosResultados = Session("dt")
                Dim exito As Boolean = ObjRep.Actualizar()
                If exito Then
                    RadAjaxManager1.ResponseScripts.Add("CloseAndRebindUpdate();")
                    RadAjaxManager1.Alert("Registro actualizado correctamente")
                Else
                    RadAjaxManager1.Alert("Error interno al actualizar en la base de datos.")
                End If
            Else
                RadAjaxManager1.Alert("No se encontró un ID válido para actualizar.")
            End If
            Return
        Catch ex As Exception
            RadAjaxManager1.Alert("Error al actualizar: " & ex.Message)
            Return
        End Try
    End Sub


#End Region

End Class
