﻿B4J=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=10.3
@EndOfDesignText@
'Original Code by Erel (B4X Founder)
'Reversed by Magma (Georgios Kantzas)
'v.0.1
'It has Problem at headers...

Sub Class_Globals
	Private fx As JFX
	'Private Version As Float = 1.0
	Type Parameter (Name As String, VarType As String)
	Type Member (MemberType As String, Name As String, Comment As String, ReturnType As String, Parameters As List)
	Type Class (Comment As String, Events As B4XSet, Members As Map)
	Type CodeModule (ModuleType As String, Code As String, Name As String, Headers As Map, Clazz As Class)
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
	
End Sub

public Sub ReverseBundle(BundleFile As String, OutputDir As String)
	Dim json As String = File.ReadString(BundleFile, "")
	Dim parser As JSONParser
	parser.Initialize(json)
	Dim data As Map = parser.NextObject
	
	Dim projectName As String = data.Get("project_name")
	Dim platform As String = data.Get("platform")
	Dim appType As String = data.GetDefault("b4j_app_type", "")
	
	Log($"Project: ${projectName}, Platform: ${platform}"$)
	
	' Create project directory
	Dim projectDir As String = File.Combine(OutputDir, projectName)
	If File.Exists(OutputDir,  projectName) = False Then
		File.MakeDir(OutputDir, projectName)
	End If
	
	' Create Files directory
	Dim filesDir As String = File.Combine(projectDir, "Files")
	If File.Exists(projectDir, "Files") = False Then
		File.MakeDir(projectDir,  "Files")
	End If
	
	' Process code modules
	Dim codeModules As List = data.Get("code_modules")
	Dim mainModule As Map = Null
	Dim otherModules As List
	otherModules.Initialize
	
	For Each module As Map In codeModules
		If module.Get("name") = "Main" Then
			mainModule = module
		Else
			otherModules.Add(module)
		End If
	Next
	
	' Write main project file
	If mainModule <> Null Then
		WriteMainProjectFile(projectDir, projectName, platform, appType, mainModule, otherModules, data)
	End If
	
	' Write other modules
	For Each module As Map In otherModules
		WriteCodeModule(projectDir, module)
	Next
	
	' Process files and layouts
	Dim projectFiles As List = data.Get("project_files")
	'If projectFiles <> Null Then
	If projectFiles.Size > 0 Then
		Dim bal As BalConverter
		bal.Initialize(True)
		For Each f As Map In projectFiles
			Dim fileName As String = f.Get("name")
			Dim layout As Object = f.GetDefault("layout", Null)
			
			If layout <> Null And layout Is Map Then
				' Write layout file
				'bal.ConvertJsonToBalInMemory(layout, filesDir, fileName.SubString2(0, fileName.LastIndexOf(".")))
				bal.ConvertJsonToBalInMemory(layout, filesDir, fileName) 'remove .SubString2(0, fileName.LastIndexOf("."))
				Log("Created layout: " & fileName)
			Else
				' Create placeholder file
				If Not(File.Exists(filesDir, fileName)) Then
					File.WriteString(filesDir, fileName, "")
					Log("Created file: " & fileName)
				End If
			End If
		Next
	End If
	
End Sub

Private Sub WriteMainProjectFile (projectDir As String, projectName As String, platform As String, appType As String, mainModule As Map, otherModules As List, data As Map)
	Dim code As String = mainModule.Get("code")
	Dim projectFileName As String = File.Combine(projectDir, projectName & "." & platform)
	
	' Build headers
	Dim headers As String = ""
	
	'aeric: (commented) Add header marker
	'aeric: (commented) headers = "AppType=Starter" & CRLF
	'aeric: (commented) headers = headers & "Title=" & projectName & CRLF
	If platform = "b4j" And appType <> "" Then
		'aeric: (commented) headers = headers & "AppType=" & appType & CRLF
		headers = "AppType=" & appType & CRLF
	End If
	' aeric: Hardcoded a Default Build
	headers = headers & "Build1=Default,b4j.example" & CRLF
	' aeric: Add Files
	Dim projectFiles As List = data.Get("project_files")
	For i = 0 To projectFiles.Size - 1
		Dim f As Map = projectFiles.Get(i)
		headers = headers & "File" & (i + 1) & "=" & f.Get("name") & CRLF
	Next
	' aeric: Hardcoded as New Group
	For i = 0 To projectFiles.Size - 1
		headers = headers & "FileGroup" & (i + 1) & "=New Group" & CRLF
	Next
	headers = headers & "Group=Default Group" & CRLF
	
	' Add libraries
	Dim libraries As List = data.Get("libraries")
	'aeric: Fixes
	For i = 0 To libraries.Size - 1
		Dim lib As Map = libraries.Get(i)
		headers = headers & "Library" & (i+1) & "=" & lib.Get("name") & CRLF
	Next
	
	' Add module references
	'aeric: Fixes
	For i = 0 To otherModules.Size - 1
		Dim module As Map = otherModules.Get(i)
		headers = headers & "Module" & (i+1) & "=" & module.Get("name") & CRLF
	Next
	
	' Add special headers for B4A
	If platform = "b4a" Then
		Dim manifest As String = data.GetDefault("android_manifest", "")
		If manifest <> "" Then
			manifest = manifest.Replace(CRLF, "~\n~")
			headers = headers & "ManifestCode=" & manifest & CRLF
		End If
	End If
	
	'aeric: Added more keys
	headers = headers & "NumberOfFiles=" & projectFiles.Size & CRLF
	headers = headers & "NumberOfLibraries=" & libraries.Size & CRLF
	headers = headers & "NumberOfModules=" & otherModules.Size & CRLF
	headers = headers & "Version=10.3" & CRLF

	'aeric: remove extra CRLF
	'headers = headers & "@EndOfDesignText@" & CRLF & CRLF
	headers = headers & "@EndOfDesignText@" & CRLF
	
	' Combine and write
	'aeric: fix bug missing # before Region
	'Dim fullContent As String = headers & "#" & code
	Dim fullContent As String = headers & code
	
	'Log("PPPP" & ": " & projectDir & " - " & projectFileName)
	
	File.WriteString(projectDir,  File.GetName(projectFileName), fullContent)
	Log("Created main file: " & projectFileName)
End Sub

Private Sub WriteCodeModule(projectDir As String, moduleData As Map)
	Dim moduleName As String = moduleData.Get("name")
	Dim code As String = moduleData.Get("code")
	Dim moduleType As String = moduleData.GetDefault("module_type", "")
	
	Dim moduleFileName As String = File.Combine(projectDir, moduleName & ".bas")
	
	' Build headers
	Dim headers As String = ""
	'aeric: Added more keys
	'If moduleType <> "" Then
	'	headers = "Type=" & moduleType & CRLF
	'End If
	headers = "B4A=True" & CRLF 'aeric: Hardcoded
	headers = headers & "Group=Default Group" & CRLF
	headers = headers & "ModulesStructureVersion=1" & CRLF
	headers = headers & "Type=" & moduleType & CRLF
	headers = headers & "Version=9.85" & CRLF
	headers = headers & "@EndOfDesignText@" & CRLF
	
	' Combine and write
	'aeric: fix bug missing # before Region
	'Dim fullContent As String = headers & "#" & code
	Dim fullContent As String = headers & code
	
	'File.WriteString(projectDir, moduleFileName, fullContent)
	File.WriteString(projectDir,  File.GetName(moduleFileName), fullContent)
	Log("Created module: " & moduleFileName)
End Sub