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

#Region "Declaración de Variables y Propiedades"

#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()
        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
        Me.hddIdEntidad.Value = Session("IdEntidad")
        Dim sMode As String = Request.QueryString("opcion")
        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()
        Me.btnActualizar.Visible = False
    End Sub

    ''' <summary>
    ''' Carga los datos de un acta existente para edición.
    ''' </summary>
    Private Sub ProcesarEditActa()
        If Request.QueryString("idTblOpciones") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerRazasPorId(Convert.ToInt32(Request.QueryString("idTblOpciones")))
            If drRep IsNot Nothing Then
                hfIdRegistro.Value = drRep("idTblOpciones").ToString()
                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("idTblOpciones") IsNot Nothing Then
            Dim drRep As DataRow = ObtenerRazasPorId(Request.QueryString("idTblOpciones"))
            If drRep IsNot Nothing Then
                Dim objRep As New Raza
                Session("objRep") = objRep
                Try
                    CargarDatosFormulario(drRep)
                    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

    Private Sub InicializarFormulario()
        Me.DataBind()
        CargarLEspecie()
    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.rcbEspecie.SelectedValue = drRep("IdEspecieCombo").ToString()
        Me.txtRaza.Text = drRep("NombreOpcion").ToString()
        Me.chkActivoRaza.Checked = drRep("Activo")
    End Sub

    Private Function ObtenerRazasPorId(ByVal pIdRazas As Integer) As DataRow

        Dim ObjParametros As New Collection
        Dim Parametro As New CmdParametro("@idTblOpciones", pIdRazas, SqlDbType.Int, False)
        ObjParametros.Add(Parametro)
        Dim evento As Integer
        evento = 1204
        Dim dt As DataTable = clsBitacora.GetSelect("app.SpIVCSeleccionarRazaById", 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 CargarLEspecie()
        CargarListaEspecie(rcbEspecie)
    End Sub

    Private Sub CargarListaEspecie(ByRef rcb As RadComboBox)
        CargarCombo(rcb, 5000187, "Seleccione tipo de especie...")
    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

#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>
    ''' 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>
    ''' 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
            If TypeOf ctrl Is CheckBox Then
                DirectCast(ctrl, CheckBox).Enabled = False
            End If
            If TypeOf ctrl Is TextBox Then
                DirectCast(ctrl, TextBox).ReadOnly = True
            End If
            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
            If ctrl.HasControls() Then
                BloquearControles(ctrl)
            End If
        Next
    End Sub

#End Region

#Region "Validaciones"

    Private Function ValidarFormulario() As Boolean

        If String.IsNullOrEmpty(rcbEspecie.SelectedValue) Then
            RadAjaxManager1.Alert("Debe seleccionar la especie del animal")
            Return False
        End If
        If String.IsNullOrEmpty(txtRaza.Text) Then
            RadAjaxManager1.Alert("Debe digitar nombre del animal")
            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 Raza
        Try
            If Session("IdUsuario") IsNot Nothing Then
                ObjRep.idTblUsuarioCreoRegistro = CInt(Session("IdUsuario"))
            End If
            ObjRep.Especie = Convert.ToInt32(rcbEspecie.SelectedValue)
            ObjRep.Raza = Me.txtRaza.Text.Trim()
            ObjRep.IdOpcionPadre = Convert.ToInt32(rcbEspecie.SelectedValue)
            ObjRep.Activo = chkActivoRaza.Checked
            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
        Catch ex As Exception
            RadAjaxManager1.Alert("Se presentó 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
            If String.IsNullOrEmpty(hfIdRegistro.Value) OrElse hfIdRegistro.Value = "0" Then
                RadAjaxManager1.Alert("Error: ID inválido para actualizar.")
                Exit Sub
            End If
            Dim ObjRep As New Raza
            ObjRep.IdOpcRaza = Convert.ToInt32(hfIdRegistro.Value)
            ObjRep.Especie = Convert.ToInt32(rcbEspecie.SelectedValue)
            ObjRep.IdOpcionPadre = Convert.ToInt32(rcbEspecie.SelectedValue)
            ObjRep.Raza = Me.txtRaza.Text.Trim()
            ObjRep.Activo = chkActivoRaza.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.IdOpcRaza))
            Else
                RadAjaxManager1.Alert("No se realizaron cambios. Verifique si el registro aún existe.")
            End If
        Catch ex As Exception
            RadAjaxManager1.Alert("Error técnico: " & ex.Message.Replace("'", ""))
        End Try
    End Sub

#End Region

End Class
