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 Administrador_frmTipoEducacion
    Inherits System.Web.UI.Page

#Region "Declaración de Variables y Propiedades"

    Public oPropiedad As New ClsFortalecimiento

#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
            cargarLineaIntervencion()
        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

#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")
        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("idTblFortalecimiento") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerTipEducacion(Convert.ToInt32(Request.QueryString("idTblFortalecimiento")))
            If drRep IsNot Nothing Then
                CargarDatosFormulario(drRep)
                Me.btnInsertar.Visible = False
                Me.btnActualizar.Visible = True
            Else
                RadAjaxManager1.Alert("No se encontró el registro.")
            End If
        End If

    End Sub

    ''' <summary>
    ''' Carga los datos en modo solo lectura.
    ''' </summary>
    Private Sub ProcesarVisualizar()
        If Request.QueryString("idTblFortalecimiento") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerTipEducacion(Request.QueryString("idTblFortalecimiento"))
            If drRep IsNot Nothing Then
                Dim objRep As New ClsFortalecimiento
                Session("objRep") = objRep
                Ese_Load()
                Try
                    CargarDatosFormulario(drRep)

                    ' Bloqueo de controles para evitar edición
                    BloquearControles(Me)
                    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

    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

#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)

        If Not IsDBNull(drRep("IdTblSubred")) Then
            Me.hddIdEntidad.Value = drRep("IdTblSubred").ToString()
        Else
            Me.hddIdEntidad.Value = ""
        End If

        If Not IsDBNull(drRep("ESE")) Then
            Me.txtESE.Text = drRep("ESE").ToString()
        Else
            Me.txtESE.Text = ""
        End If

        If Not IsDBNull(drRep("NombreLinea")) Then
            Me.rcbLinInter.SelectedValue = drRep("NombreLinea").ToString()
        End If

        If Not IsDBNull(drRep("NombreOpcion")) Then
            Me.txtNomEduc.Text = drRep("NombreOpcion").ToString()
        Else
            Me.txtNomEduc.Text = ""
        End If

        If Not IsDBNull(drRep("Activo")) Then
            Me.chkActivoEducacion.Checked = Convert.ToBoolean(drRep("Activo"))
        Else
            Me.chkActivoEducacion.Checked = False
        End If

    End Sub

    Private Function ObtenerTipEducacion(ByVal pIdTipEduc As Integer) As DataRow

        Dim ObjParametros As New Collection
        Dim Parametro As New CmdParametro("@idTblFortalecimiento", pIdTipEduc, SqlDbType.Int, False)
        ObjParametros.Add(Parametro)
        Dim evento As Integer
        evento = 1204
        Dim dt As DataTable = clsBitacora.GetSelect("app.SpIVCSeleccionarTipEducacionById", 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

#End Region
#Region "Carga de Listas Desplegables (Combos)"

    Private Sub cargarLineaIntervencion()
        rcbLinInter.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()
                rcbLinInter.Items.Add(item)
            Next
        End If
        ' Eliminar item especifico si existe
        Dim itemEliminar As RadComboBoxItem = rcbLinInter.FindItemByValue("9999")
        If itemEliminar IsNot Nothing Then itemEliminar.Remove()
    End Sub

#End Region
#Region "Eventos de Controles UI"
#End Region
#Region "Lógica del Grid (RadGrid)"
#End Region
#Region "Cálculos y Resúmenes Estadísticos"
#End Region
#Region "Funciones Auxiliares y Seguridad"

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

    End Sub

#End Region
#Region "Validaciones"

    ' VALIDACIÓN GENERAL
    Private Function ValidarFormulario() As Boolean
        If Not ValidarNomEduc() Then Return False

        Return True
    End Function

    ' VALIDACIÓN NOMBRE PUNTO FIJO
    Private Function ValidarNomEduc() As Boolean
        Dim nomNomEdu As String = txtNomEduc.Text.Trim()
        If String.IsNullOrEmpty(nomNomEdu) Then
            RadAjaxManager1.Alert("Debe ingresar el Nombre de la Educación de SP")
            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 ClsFortalecimiento
        Try
            ' Mapeo de controles a objeto de negocio
            If Session("IdUsuario") IsNot Nothing Then
                ObjRep.idTblUsuarioCreoRegistro = CInt(Session("IdUsuario"))
            End If
            ObjRep.IdEntidad = Convert.ToInt32(Me.hddIdEntidad.Value)
            ObjRep.ESE = Me.txtESE.Text
            ObjRep.NombreLinea = If(String.IsNullOrEmpty(Me.rcbLinInter.SelectedValue), 0, Convert.ToInt32(Me.rcbLinInter.SelectedValue))
            ObjRep.NombreOpcion = Me.txtNomEduc.Text
            ObjRep.Activo = Me.chkActivoEducacion.Checked

            ' Acción Insertar
            If Request.QueryString("opcion") = "New" Then
                Dim idRegistro As Integer = ObjRep.Insertar()
                If idRegistro > 0 Then
                    RadAjaxManager1.ResponseScripts.Add("alert('Formulario ingresado correctamente'); CloseAndRebindInsert(" & idRegistro & ");")
                Else
                    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

        Try
            Dim idTipEdu As String = Request.QueryString("idTblFortalecimiento")
            If Not String.IsNullOrEmpty(idTipEdu) Then
                Dim ObjRep As New ClsFortalecimiento
                ObjRep.idTblFortalecimiento = Convert.ToInt32(idTipEdu)
                ObjRep.IdEntidad = Convert.ToInt32(Me.hddIdEntidad.Value)
                ObjRep.ESE = Me.txtESE.Text.Trim()
                ObjRep.NombreLinea = If(String.IsNullOrEmpty(Me.rcbLinInter.SelectedValue), 0, Convert.ToInt32(Me.rcbLinInter.SelectedValue))
                ObjRep.NombreOpcion = Me.txtNomEduc.Text
                ObjRep.Activo = Me.chkActivoEducacion.Checked

                If Session("IdUsuario") IsNot Nothing Then
                    ObjRep.idTblUsuarioCreoRegistro = Convert.ToInt32(Session("IdUsuario"))
                End If
                If ObjRep.Actualizar() Then
                    RadAjaxManager1.ResponseScripts.Add(String.Format("CloseAndRebindUpdate({0});", ObjRep.idTblFortalecimiento))
                Else
                    RadAjaxManager1.Alert("No se realizaron cambios. Verifique si el registro aún existe.")
                End If
            Else
                RadAjaxManager1.Alert("Error: El ID del registro se perdió durante la sesión.")
            End If

        Catch ex As Exception
            RadAjaxManager1.Alert("Error técnico: " & ex.Message.Replace("'", ""))
        End Try
    End Sub

#End Region

End Class
