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

#Region "Declaración de Variables y Propiedades"
    Public oPropiedad As New MarBiologico
#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()
        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("IdBiologicoVacuna") IsNot Nothing Then
        Dim drRep As DataRow = ObtenerBiologicoPorId(Convert.ToInt32(Request.QueryString("IdBiologicoVacuna")))
            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("IdBiologicoVacuna") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerBiologicoPorId(Request.QueryString("IdBiologicoVacuna"))
            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

#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("IdTblSubred")
        If Not IsDBNull(drRep("ESE")) Then
            Me.txtESE.Text = drRep("ESE").ToString()
        Else
            Me.txtESE.Text = ""
        End If
        Me.txtMarcaBiologico.Text = drRep("MarcaBiologico")
        Me.txtLoteVacuna.Text = drRep("LoteVacuna")
        Me.txtFechaVacuna.SelectedDate = CDate(drRep("FechaVacuna"))
        Me.chkActivoBiologico.Checked = drRep("Activo")
    End Sub

    Private Function ObtenerBiologicoPorId(ByVal pIdMarBiologico As Integer) As DataRow

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

#End Region

#Region "Eventos de Controles UI"

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

    Private Function ValidarFormulario() As Boolean
        If Not ValidarActa() Then Return False
        If Not ValidarFechaVacuna() Then Return False

        Return True
    End Function

    Private Function ValidarActa() As Boolean
        Dim marbio As String = txtMarcaBiologico.Text.Trim()
        If String.IsNullOrEmpty(marbio) Then
            RadAjaxManager1.Alert("Debe ingresar la marca del biológico")
            Return False
        End If
        Dim lotvac As String = txtLoteVacuna.Text.Trim()
        If String.IsNullOrEmpty(lotvac) Then
            RadAjaxManager1.Alert("Debe ingresar el lote de la vacuna")
            Return False
        End If

        Return True
    End Function

    Private Function ValidarFechaVacuna() As Boolean
        If Not txtFechaVacuna.SelectedDate.HasValue Then
            RadAjaxManager1.Alert("Debe ingresar la fecha de aplicación de la vacuna")
            Return False
        End If
        If txtFechaVacuna.SelectedDate.HasValue Then
            If txtFechaVacuna.SelectedDate.Value.Date < Date.Today Then
                RadAjaxManager1.ResponseScripts.Add("alert('La fecha no puede ser anterior al día de hoy');")
                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 MarBiologico
        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.MarcaBiologico = Me.txtMarcaBiologico.Text
            ObjRep.LoteVacuna = Me.txtLoteVacuna.Text
            ObjRep.FechaVacuna = Me.txtFechaVacuna.SelectedDate
            ObjRep.Activo = Me.chkActivoBiologico.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("IdBiologicoVacuna")
            If Not String.IsNullOrEmpty(idBio) Then
                Dim ObjRep As New MarBiologico
                ObjRep.IdBiologicoVacuna = Convert.ToInt32(idBio)
                ObjRep.IdEntidad = Convert.ToInt32(Me.hddIdEntidad.Value)
                ObjRep.ESE = Me.txtESE.Text.Trim()
                ObjRep.MarcaBiologico = Me.txtMarcaBiologico.Text.Trim()
                ObjRep.LoteVacuna = Me.txtLoteVacuna.Text.Trim()

                If Me.txtFechaVacuna.SelectedDate.HasValue Then
                    ObjRep.FechaVacuna = Me.txtFechaVacuna.SelectedDate.Value
                End If

                ObjRep.Activo = Me.chkActivoBiologico.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.IdBiologicoVacuna))
                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
