Imports System.Configuration
Imports fatd_faturamento.BLL.Repositorio
Imports fatd_faturamento.ENTIDADE

Public Class frmPesquisaSimples

    ''' <summary>
    ''' Tabela(s) onde a pesquisa será realizada. 
    ''' </summary>
    ''' <remarks></remarks>
    Dim vTabela As String

    ''' <summary>
    ''' Define as colunas que serão exibidas no resultado da busca. Exemplo de inicialização: f.p7ColunasLista = New String() {"m.id", "descricao", "almox", "preco_medio", "saldo_fisico", "saldo_financeiro"}
    ''' </summary>
    ''' <remarks></remarks>
    Dim vColumn As String

    ''' <summary>
    ''' Critério opcional para a busca. Ex: fixar filtro para determinado tipo de registro ou eliminar registros duplicados no plano cartesiano ("`material`.`id` = `material_detalhe`.`id`").
    ''' </summary>
    ''' <remarks></remarks>
    Dim vFilter As String

    ''' <summary>
    ''' Critério opcional para ordenação. Ex: "`descricao`, `codigo` DESC, `unidade` ASC"
    ''' </summary>
    ''' <remarks></remarks>
    Dim vOrderBy As String

    ''' <summary>
    ''' Define as os campos que serão agrupados.
    ''' </summary>
    ''' <remarks></remarks>
    Dim vGroupBy As String

    ''' <summary>
    ''' Define a quantidade de chave PK ou FK na tabela
    ''' </summary>
    ''' <remarks></remarks>
    Dim vtQtdKey As Short

    ''' <summary>
    ''' Define as os campos que serão agrupados.
    ''' </summary>
    ''' <remarks></remarks>
    Dim vColKey(10) As Short

    ''' <summary>
    ''' Objeto que controla a linha do listview
    ''' </summary>
    ''' <remarks></remarks>
    Private mItem As System.Windows.Forms.ListViewItem

    Dim vCodigo As String
    Dim vCodigo_1 As String
    Dim vCodigo_2 As String
    Dim vCodigo_3 As String
    Dim vCodigo_4 As String


#Region "Propriedades"

    Private Sub lvwDados_ColumnClick(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.ColumnClickEventArgs) Handles lvwDados.ColumnClick

        Dim ColumnHeader As System.Windows.Forms.ColumnHeader = lvwDados.Columns(eventArgs.Column)

        Try
            lvwDados.ListViewItemSorter = New ListViewItemComparer(eventArgs.Column)
            lvwDados.Sort()
        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: lvwDados_ColumnClick" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

    Private Sub lvwDados_DoubleClick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles lvwDados.DoubleClick

        Try

            If lvwDados.Items.Count > 0 Then


                Select Case vtQtdKey
                    Case Is = 1
                        lEditDados(lvwDados.FocusedItem.Text.Trim())
                    Case Is = 2
                        lEditDados(lvwDados.FocusedItem.Text.Trim(), lvwDados.FocusedItem.SubItems(1).Text)
                    Case Is = 3
                        lEditDados(lvwDados.FocusedItem.Text.Trim(), lvwDados.FocusedItem.SubItems(1).Text, lvwDados.FocusedItem.SubItems(2).Text)
                    Case Is = 4
                        lEditDados(lvwDados.FocusedItem.Text.Trim(), lvwDados.FocusedItem.SubItems(1).Text, lvwDados.FocusedItem.SubItems(2).Text, lvwDados.FocusedItem.SubItems(3).Text)
                End Select

            End If

        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: lvwDados_DoubleClick" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

    Private Sub btPesquisar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPesquisar.Click

        Try
            lSearch()
        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: btPesquisar_Click" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

    Private Sub btFechar_Click(sender As Object, e As EventArgs) Handles btFechar.Click

        Try

            lClose()

        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: btFechar_Click" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

#End Region

#Region "Métodos"

    Private Sub lSearch()


        '[Pega a data inicial para cálculo do tempo gasto na pesquisa]
        Dim tIni As Date = Now
        Dim tFim As Date = Nothing

        Dim vCount As Short
        Dim vSQL As String

        Dim vlist

        Dim dt As DataTable

        Dim objLocalizadorGeral As New entidadeLocalizadorGeral
        Dim repositorioLocalizadorGeral As New repositorioLocalizadorGeral

        Try
            vCount = 0


            If vTabela.ToUpper() = "USUARIOS" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_nss")
                objLocalizadorGeral.TABLE_NAME = vTabela
            ElseIf vTabela.ToUpper() = "PERMISSAO_MENU" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_nss")
                objLocalizadorGeral.TABLE_NAME = vTabela
            ElseIf vTabela.ToUpper() = "PLANO_CONTAS" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_ctb")
                objLocalizadorGeral.TABLE_NAME = vTabela
            Else
                objLocalizadorGeral.TABLE_SCHEMA = vMySqlDataBase
                objLocalizadorGeral.TABLE_NAME = vTabela
            End If

            vlist = repositorioLocalizadorGeral.Select(objLocalizadorGeral)

            For Each objLocalizadorGeralFor As entidadeLocalizadorGeral In vlist

                vCount = vCount + 1

                If objLocalizadorGeralFor.COLUMN_KEY = "PRI" Or objLocalizadorGeralFor.COLUMN_NAME = "id" Or objLocalizadorGeralFor.COLUMN_NAME = "num" Then
                    vtQtdKey = vCount
                    vColKey(vCount - 1) = Convert.ToInt32(vCount)
                End If

            Next


            Me.labelQtdeRegistros.Text = "Aguarde Pesquisando..."

            vCount = 0

            vSQL = lQueryDados()

            objLocalizadorGeral.QUERY_NAME = vSQL
            objLocalizadorGeral.TABLE_NAME = vTabela

            dt = repositorioLocalizadorGeral.Select_1(objLocalizadorGeral)

            '[Pega a data final para cálculo do tempo gasto na pesquisa]
            tFim = Now

            lvwDados.BeginUpdate()

            If lvwDados.Columns.Count <> dt.Columns.Count Then
                lvwDados.Columns.Clear()

                For Each column As DataColumn In dt.Columns
                    lvwDados.Columns.Add(column.ColumnName)
                Next
            End If

            lvwDados.Items.Clear()

            For Each row As DataRow In dt.Rows
                Dim item As ListViewItem = New ListViewItem(row(0).ToString())

                For i As Integer = 1 To dt.Columns.Count - 1
                    item.SubItems.Add(row(i).ToString())
                Next

                lvwDados.Items.Add(item)
                vCount = vCount + 1
            Next

            lvwDados.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent)
            lvwDados.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
            lvwDados.EndUpdate()


            '[Mostra o tempo total da pesquisa na barra de status]
            Me.labelTempoPesquisa.Text = "Tempo: " & Format((tFim.Ticks - tIni.Ticks) / 10000, "00:00:00:000")

            Me.labelQtdeRegistros.Text = vCount & " registro(s) encontrado(s)."


        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: lSearch" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

    Private Sub lLoadTable()

        Dim vCount As Short
        Dim vSQL As String

        Dim vlist

        Dim dt As DataTable

        Dim objLocalizadorGeral As New entidadeLocalizadorGeral
        Dim repositorioLocalizadorGeral As New repositorioLocalizadorGeral

        Try
            vCount = 0


            If vTabela.ToUpper() = "USUARIOS" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_nss")
                objLocalizadorGeral.TABLE_NAME = vTabela
            ElseIf vTabela.ToUpper() = "PERMISSAO_MENU" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_nss")
                objLocalizadorGeral.TABLE_NAME = vTabela
            ElseIf vTabela.ToUpper() = "PLANO_CONTAS" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_ctb")
                objLocalizadorGeral.TABLE_NAME = vTabela
            Else
                objLocalizadorGeral.TABLE_SCHEMA = vMySqlDataBase
                objLocalizadorGeral.TABLE_NAME = vTabela
            End If

            vlist = repositorioLocalizadorGeral.Select(objLocalizadorGeral)

            For Each objLocalizadorGeralFor As entidadeLocalizadorGeral In vlist

                vCount = vCount + 1

                If objLocalizadorGeralFor.COLUMN_KEY = "PRI" Or objLocalizadorGeralFor.COLUMN_NAME = "id" Or objLocalizadorGeralFor.COLUMN_NAME = "num" Then
                    vtQtdKey = vCount
                    vColKey(vCount - 1) = Convert.ToInt32(vCount)
                End If

            Next

            vCount = 0

            vSQL = lQueryDados()

            objLocalizadorGeral.QUERY_NAME = vSQL
            objLocalizadorGeral.TABLE_NAME = vTabela

            dt = repositorioLocalizadorGeral.Select_1(objLocalizadorGeral)

            lvwDados.BeginUpdate()

            If lvwDados.Columns.Count <> dt.Columns.Count Then
                lvwDados.Columns.Clear()

                For Each column As DataColumn In dt.Columns
                    lvwDados.Columns.Add(column.ColumnName)
                Next
            End If

            lvwDados.Items.Clear()

            lvwDados.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent)
            lvwDados.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
            lvwDados.EndUpdate()


        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: lLoadTable" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

    Private Sub lClose()

        Try

            vfrmOld.Enabled = True
            Me.Close()
            vfrmOld.BringToFront()

        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: lClose" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

    Private Sub lEditDados(ByRef Item_1 As String, Optional ByVal Item_2 As String = "", Optional ByVal Item_3 As String = "", Optional ByVal Item_4 As String = "")

        vCodigo_1 = Item_1
        vCodigo_2 = Item_2
        vCodigo_3 = Item_3
        vCodigo_4 = Item_4

        Try

            Select Case vtQtdKey
                Case Is = 1
                    PreencherValoresListDados(vCodigo_1)
                Case Is = 2
                    PreencherValoresListDados(vCodigo_1, vCodigo_2)
                Case Is = 3
                    PreencherValoresListDados(vCodigo_1, vCodigo_2, vCodigo_3)
                Case Is = 4
                    PreencherValoresListDados(vCodigo_1, vCodigo_2, vCodigo_3, vCodigo_4)
            End Select

        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: lEditDados" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

    Private Sub PreencherValoresListDados(ByRef Items_1 As String, Optional ByVal Items_2 As String = "", Optional ByVal Items_3 As String = "", Optional ByVal Items_4 As String = "")

        vCodigo_1 = Items_1
        vCodigo_2 = Items_2
        vCodigo_3 = Items_3
        vCodigo_4 = Items_4

        Dim Item As ListViewItem

        Dim vNumber_1 As Integer
        Dim vNumber_2 As Integer
        Dim vNumber_3 As Integer
        Dim vNumber_4 As Integer

        Try

            vNumber_1 = vColKey(0) - 1
            vNumber_2 = vColKey(1) - 1
            vNumber_3 = vColKey(2) - 1
            vNumber_4 = vColKey(3) - 1

            Select Case vtQtdKey
                Case Is = 1

                    For Each Item In lvwDados.Items

                        If Item.Text = vCodigo_1 Then

                            vfrmOld.Enabled = True

                            vfrmOld.SetaCodigo(vTabela, (Item.SubItems(vNumber_1).Text))

                            Me.Close()

                            vfrmOld.BringToFront()

                        End If

                    Next


                Case Is = 2

                    For Each Item In lvwDados.Items

                        If Item.Text = vCodigo_1 And Item.SubItems(1).Text = vCodigo_2 Then

                            vfrmOld.Enabled = True

                            vfrmOld.SetaCodigo(vTabela, (Item.SubItems(vNumber_1).Text), (Item.SubItems(vNumber_2).Text))

                            Me.Close()

                            vfrmOld.BringToFront()

                        End If

                    Next

                Case Is = 3

                    For Each Item In lvwDados.Items

                        If Item.Text = vCodigo_1 And Item.SubItems(1).Text = vCodigo_2 And Item.SubItems(2).Text = vCodigo_3 Then

                            vfrmOld.Enabled = True

                            vfrmOld.SetaCodigo(vTabela, (Item.SubItems(vNumber_1).Text), (Item.SubItems(vNumber_2).Text), (Item.SubItems(vNumber_3).Text))

                            Me.Close()

                            vfrmOld.BringToFront()

                        End If

                    Next

                Case Is = 4

                    For Each Item In lvwDados.Items

                        If Item.Text = vCodigo_1 And Item.SubItems(1).Text = vCodigo_2 And Item.SubItems(2).Text = vCodigo_3 And Item.SubItems(3).Text = vCodigo_4 Then

                            vfrmOld.Enabled = True

                            vfrmOld.SetaCodigo(vTabela, (Item.SubItems(vNumber_1).Text), (Item.SubItems(vNumber_2).Text), (Item.SubItems(vNumber_3).Text), (Item.SubItems(vNumber_4).Text))

                            Me.Close()

                            vfrmOld.BringToFront()

                        End If

                    Next

            End Select


            Item = Nothing

        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: PreencherValoresListDados" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub

    Private Function lQueryDados() As String

        Dim vSQL As String

        Dim vlist

        Dim objLocalizadorGeral As New entidadeLocalizadorGeral
        Dim repositorioLocalizadorGeral As New repositorioLocalizadorGeral

        Try

            vSQL = String.Empty
            vSQL = vSQL & "SELECT "

            If vTabela.ToUpper() = "USUARIOS" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_nss")
                objLocalizadorGeral.TABLE_NAME = vTabela
            ElseIf vTabela.ToUpper() = "PERMISSAO_MENU" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_nss")
                objLocalizadorGeral.TABLE_NAME = vTabela
            ElseIf vTabela.ToUpper() = "PLANO_CONTAS" Then
                objLocalizadorGeral.TABLE_SCHEMA = ConfigurationManager.AppSettings("table_ctb")
                objLocalizadorGeral.TABLE_NAME = vTabela
            Else
                objLocalizadorGeral.TABLE_SCHEMA = vMySqlDataBase
                objLocalizadorGeral.TABLE_NAME = vTabela
            End If

            If vColumn <> "" Then
                vSQL = vSQL & vColumn & vbCrLf
            Else

                vlist = repositorioLocalizadorGeral.Select(objLocalizadorGeral)

                For Each objLocalizadorGeralFor As entidadeLocalizadorGeral In vlist
                    vSQL = vSQL & "`" & vTabela & "`.`" & objLocalizadorGeralFor.COLUMN_NAME & "`, "
                Next

                vSQL = Microsoft.VisualBasic.Left(vSQL, Len(vSQL) - 2) & vbCrLf

            End If

            vSQL = vSQL & "  FROM `" & vTabela & "` " & vbCrLf

            vSQL = vSQL & " WHERE 1 = 1 "

            If txtCriterios.Text <> "" Then
                vSQL = vSQL & " AND " & txtCriterios.Text
            Else
                vSQL = vSQL & " "
            End If

            If vFilter <> "" Then
                vSQL = vSQL & " AND " & vFilter
            Else
                vSQL = vSQL & " "
            End If

            If vOrderBy <> "" Then
                vSQL = vSQL & " ORDER BY " & vOrderBy
            Else
                vSQL = vSQL & " ORDER BY 1 ASC "
            End If

            If vGroupBy <> "" Then
                vSQL = vSQL & vGroupBy
            Else
                vSQL = vSQL & " "
            End If

            Return vSQL

        Catch ex As Exception
            Exit Function
        End Try

    End Function

    Public Sub SetParametros(ByVal astrTabela As String, ByVal astrNomeTitulo As String, ByVal afrmQuemChama As System.Windows.Forms.Form, Optional ByVal astrColumn As String = "", Optional ByVal astrFilter As String = "", Optional ByVal astrOrderBy As String = "", Optional ByVal astrGroupBy As String = "")

        Try

            vTabela = astrTabela
            Me.Text = "Pesquisar: " & astrNomeTitulo
            vfrmOld = afrmQuemChama
            vfrmOld.Enabled = False
            vColumn = astrColumn
            vFilter = astrFilter
            vOrderBy = astrOrderBy
            vGroupBy = astrGroupBy
            lLoadTable()

        Catch ex As Exception
            MessageBox.Show("Ocorreu o Erro: " & Err.Description & " - Rotina: SetParametros" & "", "Aviso de Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

    End Sub




#End Region


End Class
