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

''' <summary>
''' Formulario Web para Puntos fijos de vacunacion
''' </summary>
''' <remarks>
''' 2025-12-01 - jjrodriguez: Desarrollo del formulario
''' </remarks>

Partial Class Administrador_frmPuntoVacunacion
    Inherits System.Web.UI.Page

#Region "Declaración de Variables y Propiedades"
    Public oPropiedad As New PunVacunacion
#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
            Me.DataBind()
            CargarLocalidades()
            CargarUPZ()
            CargarBarrio()
            InicializarDireccion()
        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("IdTblPuntosFijosVacunacion") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerPuntoFijoPorId(Convert.ToInt32(Request.QueryString("IdTblPuntosFijosVacunacion")))
            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("IdTblPuntosFijosVacunacion") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerPuntoFijoPorId(Request.QueryString("IdTblPuntosFijosVacunacion"))
            If drRep IsNot Nothing Then
                Dim objRep As New MarBiologico
                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

    Private Sub InicializarCascadaDireccion()
        txtDireccion.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()
        txtDireccion.Text = ""
        rcbLocalidad.ClearSelection()
        rcbLocalidad.Items.Clear()
        rcbUpz.Items.Clear()
        rcbBarrio.Items.Clear()
        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)
        If drRep.Table.Columns.Contains("IdTblSubred") Then
            Me.hddIdEntidad.Value = drRep("IdTblSubred").ToString()
        End If
        Me.txtESE.Text = drRep("ESE").ToString()
        If drRep.Table.Columns.Contains("ESE") AndAlso Not IsDBNull(drRep("ESE")) Then
            Me.txtESE.Text = drRep("ESE").ToString()
        Else
            Me.txtESE.Text = ""
        End If
        If drRep.Table.Columns.Contains("NombrePuntoFijo") Then
            Me.txtNombrePuntoFijo.Text = drRep("NombrePuntoFijo").ToString()
        End If
        If drRep.Table.Columns.Contains("AreaRural") AndAlso Not IsDBNull(drRep("AreaRural")) Then
            Me.chkAreaRural.Checked = Convert.ToBoolean(drRep("AreaRural"))
        End If
        If drRep.Table.Columns.Contains("Direccion") Then
            Me.txtDireccion.Text = drRep("Direccion").ToString()
        End If
        If drRep.Table.Columns.Contains("IdTblLocalidad") AndAlso Not IsDBNull(drRep("IdTblLocalidad")) Then
            rcbLocalidad.SelectedValue = drRep("IdTblLocalidad").ToString()
        End If
        If drRep.Table.Columns.Contains("IdTblUPZ") AndAlso Not IsDBNull(drRep("IdTblUPZ")) Then
            rcbUpz.SelectedValue = drRep("IdTblUPZ").ToString()
        End If
        If drRep.Table.Columns.Contains("IdTblBarrio") AndAlso Not IsDBNull(drRep("IdTblBarrio")) Then
            rcbBarrio.SelectedValue = drRep("IdTblBarrio").ToString()
        End If
        If drRep.Table.Columns.Contains("Activo") AndAlso Not IsDBNull(drRep("Activo")) Then
            chkActivoPuntoFijo.Checked = Convert.ToBoolean(drRep("Activo"))
        Else
            chkActivoPuntoFijo.Checked = False
        End If

    End Sub

    Private Function ObtenerPuntoFijoPorId(ByVal pIdPuntoFijo As Integer) As DataRow

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

#End Region

#Region "Eventos de Controles UI"

    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.txtDireccion.Text.Trim.Length = 0 Then Exit Sub
        Dim oDir As New clsDireccion(Me.txtDireccion.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 chkAreaRural_CheckedChanged(sender As Object, e As EventArgs) Handles chkAreaRural.CheckedChanged
        Dim esRural As Boolean = chkAreaRural.Checked
        txtDireccion.Enabled = esRural
        rcbLocalidad.Enabled = esRural
        rcbUpz.Enabled = esRural
        rcbBarrio.Enabled = esRural
        btnIngresarDireccion.Style("display") = If(esRural, "none", "inline")
        If esRural Then
            InicializarCascadaDireccion()
        Else
            LimpiarDireccion()
        End If
    End Sub

#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

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

        btnIngresarDireccion.Style("visibility") = "visible"
        chkAreaRural.Checked = False
    End Sub

    ''' <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 ValidarPuntoFijo() Then Return False
        If Not ValidarDireccion() Then Return False

        Return True
    End Function

    ' VALIDACIÓN NOMBRE PUNTO FIJO
    Private Function ValidarPuntoFijo() As Boolean
        Dim nomPunFij As String = txtNombrePuntoFijo.Text.Trim()
        If String.IsNullOrEmpty(nomPunFij) Then
            RadAjaxManager1.Alert("Debe ingresar el punto fijo")
            Return False
        End If
        Return True
    End Function

    ' VALIDACIÓN DIRECCIÓN
    Private Function ValidarDireccion() As Boolean
        If Not chkAreaRural.Checked Then
            If String.IsNullOrEmpty(txtDireccion.Text) Then
                RadAjaxManager1.Alert("Debe existir dirección del punto fijo")
                Return False
            End If
        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 PunVacunacion
        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.NombrePuntoFijo = Me.txtNombrePuntoFijo.Text
            ObjRep.AreaRural = Me.chkAreaRural.Checked
            ObjRep.Direccion = Me.txtDireccion.Text
            ObjRep.IdLocalidad = If(String.IsNullOrEmpty(Me.rcbLocalidad.SelectedValue), 0, Convert.ToInt32(Me.rcbLocalidad.SelectedValue))
            ObjRep.IdUpz = If(String.IsNullOrEmpty(Me.rcbUpz.SelectedValue), 0, Convert.ToInt32(Me.rcbUpz.SelectedValue))
            ObjRep.IdBarrio = If(String.IsNullOrEmpty(Me.rcbBarrio.SelectedValue), 0, Convert.ToInt32(Me.rcbBarrio.SelectedValue))
            ObjRep.BarrioDigitado = Me.txtBarrioDigitado.Text
            ObjRep.Activo = Me.chkActivoPuntoFijo.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 idBio As String = Request.QueryString("IdTblPuntosFijosVacunacion")
            If Not String.IsNullOrEmpty(idBio) Then
                Dim ObjRep As New PunVacunacion
                ObjRep.IdTblPuntosFijosVacunacion = Convert.ToInt32(idBio)
                ObjRep.IdEntidad = Convert.ToInt32(Me.hddIdEntidad.Value)
                ObjRep.ESE = Me.txtESE.Text.Trim()
                ObjRep.NombrePuntoFijo = Me.txtNombrePuntoFijo.Text
                ObjRep.AreaRural = Me.chkAreaRural.Checked
                ObjRep.Direccion = Me.txtDireccion.Text
                ObjRep.IdLocalidad = If(String.IsNullOrEmpty(Me.rcbLocalidad.SelectedValue), 0, Convert.ToInt32(Me.rcbLocalidad.SelectedValue))
                ObjRep.IdUpz = If(String.IsNullOrEmpty(Me.rcbUpz.SelectedValue), 0, Convert.ToInt32(Me.rcbUpz.SelectedValue))
                ObjRep.IdBarrio = If(String.IsNullOrEmpty(Me.rcbBarrio.SelectedValue), 0, Convert.ToInt32(Me.rcbBarrio.SelectedValue))
                ObjRep.BarrioDigitado = Me.txtBarrioDigitado.Text
                ObjRep.Activo = Me.chkActivoPuntoFijo.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.IdTblPuntosFijosVacunacion))
                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
