#ifndef _file

#define _file

#include "class.h"

#include "application.h"

#include "lexer.h"

#include "fileSystem.h"

#include "string.h"

#include "text.h"

#include "template.h"

#include "array.h"

#include "stdbool.h"

#include "include.h"



typedef struct application application;


struct file{

	char * filename;

	char * source;

	char * path;

	char * dirname;


	struct array * classes;

	struct array * functions;

	struct array * includes;

	struct array * macros;

	struct array * globals;

};

struct file * file_new();


void file_parseClassBody(	lexer * currentLexer,
							int fromKey, 
							int toIndex, 
							char * source, 
							struct file * fileInstance, 
							struct class * classInstance );

char * file_getFileNameFromIncludeFixed( char * include );

void file_parseMacros( struct file * fileInstance, struct array * files );

void file_composeFunctions( struct array * , struct array *, struct text * classHeader  );

void file_extendClasses( struct file * fileInstance );

void file_compose( struct file * fileInstance, application * applicationInstance );

void file_instanciateTemplates( struct file * fileInstance );

void file_composeHeaderMacros( struct file * fileInstance, struct text * classHeader );

void file_addIncludesToHeader( struct text * classHeader, struct file * currentFile );

void file_preventDoubleLoadingHeader( struct text * classHeader, char * filename );

struct text * file_composeHeaderIncludes( struct file * currentFile );

void file_extractMethodsAndProperties( struct file * fileInstance );

void file_extractFunctions( struct file * fileInstance );

void file_extractInnerClass( lexer * currentLexer, int i, int key, struct file * fileInstance, char * source, int bodyCloseIndex );

char * file_extractFunctionDecleration( lexer * currentLexer, int key, int i, char * source );

void file_extractFunction( lexer * currentLexer, int i, int key, struct file * fileInstance, char * source, int bodyCloseIndex, struct array * classesArray );

void file_removeComments( struct file * fileInstance );

void file_extractGlobalVariable( lexer * currentLexer, int key, int i, struct file * fileInstance, char * source );

void file_extractClasses( struct file * fileInstance );

void file_extractClass( lexer * currentLexer, int key, int i, struct array * classesArray, int depth, char * source );

void file_composeFunctionArguments( struct functionLayout * currentFunction, struct text * methodSource, struct text * classHeader );

void file_composeFunction( struct functionLayout * currentFunction, struct array * sourceArray, struct text * classHeader );

void file_extractTemplates( struct file * fileInstance );

void file_composeConfigInformation( struct array * files, struct application * applicationInstance );

char * file_composePath( char * path, char * filename, char * extension );

void file_composeNewPointerFunction( struct text * finalSourceCode, int hasConstructor, struct array * constructorArguments, struct class * classInstance );

void file_composeConstructorCall( struct text * finalSourceCode, char * className, struct array * constructorArguments, int usePointer );

void file_composePropertieInitiations( struct text * finalSourceCode,  int usePointers, struct class * classInstance );

void file_composeNewFunction( struct text * finalSourceCode, int hasConstructor, struct array * constructorArguments, struct class * classInstance );

void file_composeNewFunctions( struct text * finalSourceCode, struct class * classInstance, int hasConstructor, struct array * constructorArguments );

void file_composeNewHeaderDeclerations( struct text * classHeader, char * className, struct array * contructorArguments );

struct array * file_getConstructorArguments( struct class * classInstance, int * hasConstructor );

void file_composeClass( struct class * classInstance, struct text * classHeader, struct text * finalSourceCode );

void file_addLineBreaks( struct text * finalSourceCode, struct array * sourceArray );

void file_composeSourceHeader( struct text * finalSourceCode, char * filename );

void file_writeAll( struct array * sourceArray, struct text * classHeader, char * filename, array * classesArray, array * globals, char * relativePath, struct application * applicationInstance  );

void file_parseFunctions( struct file * fileInstance, array * files );

void file_parseMethods( struct file * fileInstance, array * files );

void file_addVariablesFromFile( struct file * fileInstance, struct array * variables );

struct file * file_getFileByFileName( struct array * files, char * includeFileName );

char * file_getFileNameFromInclude( char * include );

char * file_extractInclude( struct file * fileInstance, char * source, lexer * currentLexer, int key, int i );

char * file_eraseDefine( char * source, int key, int lineBreakIndex );

char * file_extractDefine( struct file * fileInstance, char * source, int key, int i );

void file_extractMacros( struct file * fileInstance );

char * file_getBaseNameFromFileName( char * filename );

char * file_getPathFrom( char * filename );

int file_isLibCFileName( char * baseName );

char * file_removeExtensionFromFileName( char * path );

int file_hasLoadedFileName( char * fileName, struct array * loadedFileNames );

void file_loadUnloadedFiles( struct array * unloadedFileNames, struct array * loadedFileNames, char * path );

char * file_getSource( char * filename );

#endif