﻿B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=11
@EndOfDesignText@
Sub Class_Globals
	Private MapFieldType As Map
	Private DBSql As SQL
	Private TBaseObj As Object
	Private TABLE_INDEX As String
	Private TABLE_NAME As String
	Public item As Object
	Public items As List
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize(pSQl As SQL,pDataObj As Object,pTableName As String,pIndexField As String)
	DBSql = pSQl
	TABLE_NAME = pTableName
	TABLE_INDEX = pIndexField
	TBaseObj = pDataObj
	MapFieldType.Initialize
	setSelfItem
End Sub

Private Sub getClassNameFromObj(TBaseTemp As Object) As String
	Dim jref As Reflector
	jref.Target = TBaseTemp
	jref.Target = jref.RunMethod("getClass")
	Return jref.RunMethod("getName")
End Sub

Private Sub CheckClassInicialized(TObjClass As Object,force As Boolean)
	Dim joObjClass As JavaObject = TObjClass
	Dim IsInitialized As Boolean = joObjClass.GetField("IsInitialized")
	If (Not(IsInitialized)Or(force)) Then
		joObjClass.RunMethod("Initialize",Null)
	End If
End Sub

private Sub setMapFieldTypes(TObjClass As Object) As Map
	Dim ResultMap As Map
	ResultMap.Initialize
	Dim ref As Reflector
	ref.Target = TObjClass
	ref.Target = ref.RunMethod("getClass")
	Dim Fields() As Object = ref.RunMethod("getDeclaredFields")
	For Each Field As Object In Fields
		ref.Target=Field
		Dim FieldName As String = ref.RunMethod("getName")
		Dim FieldType As String = ref.RunMethod("getType")
		If (FieldName.ToLowerCase<>"isinitialized") Then
			ResultMap.Put(FieldName,FieldType)
		End If
	Next
	Return ResultMap
End Sub

'Private Sub AsingMap2Class(ObjClass As Object,FieldName As String, Value As Object, FieldType As Map)
Public Sub AsingMap2Class(ObjClass As Object, pMapValues As Map, pMapFieldType As Map)
	Try
		For Each k As String In pMapValues.Keys
			If (pMapFieldType.ContainsKey(k)) Then
				Dim joObject As JavaObject = ObjClass
				'Dim joField As JavaObject = joObject.GetFieldJO(k)
				Dim FieldType1 As String = pMapFieldType.Get(k)
				Select  FieldType1
					Case "boolean"
						Dim ValueBoolean As Boolean = pMapValues.GetDefault(k,False)
						joObject.SetField(k,ValueBoolean)
					Case "byte"
						Dim ValueByte As Byte = pMapValues.GetDefault(k,0)
						joObject.SetField(k,ValueByte)
					Case "short" 
						Dim ValueShort As Short = pMapValues.GetDefault(k,0)
						joObject.SetField(k,ValueShort)
					Case "int"
						Dim ValueInt As Int = pMapValues.GetDefault(k,0)
						joObject.SetField(k,ValueInt)
					Case "long"
						Dim ValueLong As Long = pMapValues.GetDefault(k,0)
						joObject.SetField(k,ValueLong)
					Case "float"
						Dim ValueFloat As Float = pMapValues.GetDefault(k,0.00)
						joObject.SetField(k,ValueFloat)
					Case "double"
						Dim ValueDouble As Double = pMapValues.GetDefault(k,0.00)
						joObject.SetField(k,ValueDouble)
					Case "char"
						Dim ValueChar As Char = pMapValues.GetDefault(k,"")
						joObject.SetField(k,ValueChar)
					Case "class java.lang.String"
						Dim ValueString As String = pMapValues.GetDefault(k,0)
						joObject.SetField(k,ValueString)
					Case "class anywheresoftware.b4a.objects.collections.Map"
						Dim ValueMap As Map
						ValueMap.Initialize
						ValueMap = pMapValues.GetDefault(k,ValueMap)
						joObject.SetField(k,ValueString)
					Case "class anywheresoftware.b4a.objects.collections.List"
						Dim Valuelist As List
						Valuelist.Initialize
						Valuelist = pMapValues.GetDefault(k,Valuelist)
						joObject.SetField(k,Valuelist)
				End Select
			End If
		Next
	Catch
		Log(LastException)
	End Try
End Sub

Private Sub getFieldValue(TObjItem As Object,FielName As String,Value As Object) As Object
	Dim Result As Object = Value
	Try
		Dim joObject As JavaObject = TObjItem
		Result = joObject.GetFieldJO(FielName)
	Catch
		Log(LastException)
	End Try
	Return Result
End Sub


Private Sub setSelfItem
	' Set Item ---------------------------------------------------------------
	Dim jBaseObj As JavaObject 	
	item = jBaseObj.InitializeNewInstance(getClassNameFromObj(TBaseObj),Null)
	CheckClassInicialized(item,True)
	MapFieldType = setMapFieldTypes(item)
	' ------------------------------------------------------------------------
	items.Initialize
End Sub



private Sub getLastInsert()
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		Dim CmdSQL  As String = $"SELECT * FROM ${TABLE_NAME} WHERE ${TABLE_INDEX} IN (SELECT MAX(${TABLE_INDEX}) FROM ${TABLE_NAME})"$
		Dim ItemMap As Map = DBUtils.ExecuteMap(DBSql,CmdSQL,Null)
		If ItemMap.IsInitialized Then
			AsingMap2Class(item,ItemMap,MapFieldType)
		End If
	End If
End Sub

'Borrar Tabla --------------------

Public Sub DeleteTable() As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized) Then
		DBSql.ExecNonQuery($"DELETE FROM ${TABLE_NAME}"$)
		setSelfItem
		Result = True
	End If
	Return  Result
End Sub

' Borrar Elemento ----------------

Public Sub Delete() As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False))And(getFieldValue(item,TABLE_INDEX,0)>0)  Then
		DBUtils.DeleteRecord(DBSql,TABLE_NAME,CreateMap(TABLE_INDEX:getFieldValue(item,TABLE_INDEX,0)))
		setSelfItem
		Result = True
	End If
	Return Result
End Sub

' Elemento mediante ID ----------

Public Sub getByID(Id As Int) As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		Dim CmdSQL  As String = $"SELECT * FROM ${TABLE_NAME} WHERE ${TABLE_INDEX}=${Id}"$
		Dim ItemMap As Map = DBUtils.ExecuteMap(DBSql,CmdSQL,Null)
		If ItemMap.IsInitialized Then
			AsingMap2Class(item,ItemMap,MapFieldType)
			Result = True
		End If
	End If
	Return Result
End Sub

public Sub AllDataTable() As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		items.Clear
		Dim CmdSQL  As String = $"SELECT * FROM ${TABLE_NAME}"$
		Dim cursor As ResultSet = DBSql.ExecQuery(CmdSQL)
		Do While cursor.NextRow
			Dim ItemMap As Map
			ItemMap.Initialize
			For i = 0 To cursor.ColumnCount - 1
				ItemMap.Put(cursor.GetColumnName(i),cursor.GetString2(i))
			Next
			If (ItemMap.Size > 0) Then
				Dim ref As JavaObject
				Dim ItemObj As Object = ref.InitializeNewInstance(getClassNameFromObj(TBaseObj),Null)
				CheckClassInicialized(ItemObj,True)
				AsingMap2Class(ItemObj,ItemMap,MapFieldType)
				items.Add(ItemObj)
			End If
		Loop
		Result = True
	End If
	Return Result
End Sub

public Sub AllDataTableWhere(pWhere As String) As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		items.Clear
		Dim CmdSQL  As String = $"SELECT * FROM ${TABLE_NAME} WHERE ${pWhere}"$
		Dim cursor As ResultSet = DBSql.ExecQuery(CmdSQL)
		Do While cursor.NextRow
			Dim ItemMap As Map
			ItemMap.Initialize
			For i = 0 To cursor.ColumnCount - 1
				ItemMap.Put(cursor.GetColumnName(i),cursor.GetString2(i))
			Next
			If (ItemMap.Size > 0) Then
				Dim ref As JavaObject
				Dim ItemObj As Object = ref.InitializeNewInstance(getClassNameFromObj(TBaseObj),Null)
				CheckClassInicialized(ItemObj,True)
				AsingMap2Class(ItemObj,ItemMap,MapFieldType)
				items.Add(ItemObj)
			End If
		Loop
		Result = True
	End If
	Return Result
End Sub

Public Sub getByWhere(WhereCond As String) As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		Dim CmdWhere As String = IIf(WhereCond.Length>0,$"WHERE ${WhereCond}"$,"")
		Dim CmdSQL  As String = $"SELECT * FROM ${TABLE_NAME} ${CmdWhere}"$
		Dim ItemMap As Map = DBUtils.ExecuteMap(DBSql,CmdSQL,Null)
		If ItemMap.IsInitialized Then
			AsingMap2Class(item,ItemMap,MapFieldType)
			Result = True
		End If
	End If
	Return Result
End Sub

public Sub getCount() As Int
	Dim Result As Int = 0
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		Dim CmdSQL  As String = $"SELECT count(*) as "nrows" FROM ${TABLE_NAME}"$
		Dim ItemMap As Map = DBUtils.ExecuteMap(DBSql,CmdSQL,Null)
		If ItemMap.IsInitialized Then
			Result = ItemMap.Get("nrows")
		End If
	End If
	Return Result
End Sub

Public Sub PutByID(Id As Int, Fields As Map) As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		Try
			DBUtils.UpdateRecord2(DBSql,TABLE_NAME,Fields,CreateMap(TABLE_INDEX:Id))
			Result = getByID(Id)
		Catch
			Log(LastException)
		End Try
	End If
	Return Result
End Sub

Public Sub PutOrPostByFieldExist(FieldExist As String,FieldData As Map) As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		Try
			If (FieldData.ContainsKey(FieldExist)) Then
				Dim CmdSQL As String = $"SELECT * FROM ${TABLE_NAME} WHERE ${FieldExist}=?"$
				Dim ItemMap As Map = DBUtils.ExecuteMap(DBSql,CmdSQL,Array As String(FieldData.Get(FieldExist)))
				If (ItemMap.IsInitialized) Then
					Result = PutByID(ItemMap.Get(TABLE_INDEX),FieldData)
				Else
					Result = PostSingle(FieldData)
				End If
			End If
		Catch
			Log(LastException)
		End Try
	End If
	Return Result
End Sub

Public Sub PostSingle(Fields As Map) As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		Dim ItemList As List
		ItemList.Initialize
		ItemList.Add(Fields)
		Try
			DBUtils.InsertMaps(DBSql,TABLE_NAME,ItemList)
			getLastInsert
			Result = True
		Catch
			Log(LastException)
		End Try
	End If
	Return Result
End Sub

Public Sub PostBatch(Data As List) As Boolean
	Dim Result As Boolean = False
	If(DBSql.IsInitialized)And(getFieldValue(item,"IsInitialized",False)) Then
		setSelfItem
		Try
			DBUtils.InsertMaps(DBSql,TABLE_NAME,Data)
			getLastInsert
			Result = True
		Catch
			Log(LastException)
		End Try
	End If
	Return Result
End Sub

