#include "File.h"
#include <stdio.h>

#ifdef WINDOWS
File::File(STRING filePath, bool read)
#else
File::File(STRING filePath, const char* mode)
#endif
{
	_closed = false;
	STRING fileFolder = Path::GetFileFolder(filePath);
#ifdef WINDOWS
	
	SHCreateDirectoryExA (0, fileFolder, 0);
	//must return ERROR_SUCCESS
#else
	STRING str = (STRING)System::SafeAllocMemory(strlen(fileFolder) + 20);
	strcpy(str,"mkdir -p ");
	strcat(str, fileFolder);
	system(str);
	System::SafeFreeMemory(str);
#endif

	System::SafeFreeMemory(fileFolder);
#ifdef WINDOWS
	if (read)
		_file = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); 
	else
		_file = CreateFileA(filePath, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
#else
	_file = fopen(filePath, mode);
#endif
	
}

File::~File(void)
{
	if ( ! _closed)
	#ifdef WINDOWS
		CloseHandle(_file);
	#else
		fclose(_file);
	#endif
		
}

File* File::Open(STRING filePath)
{
	if ( 0 == filePath)
		return 0;
	bool _closed = false;
	//STRING fileFolder = Path::GetFileFolder(filePath);
	File* file = (File*) System::SafeAllocMemory(sizeof(File));
#ifdef WINDOWS
	//File* file = new File(filePath, false);
	//SHCreateDirectoryExA (0, fileFolder, 0);
	file->_closed = false;
	file->_file = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
#else
	file->_closed = false;
	file->_file = fopen(filePath, "rb");
#endif
	if ( 0 >= file->_file)
		return 0;

	return file;
}

bool File::Seek(File* file,long position, int origin)
{
	if ( 0 >= _file || _closed )
		return false;
#ifdef WINDOWS
	return INVALID_SET_FILE_POINTER != SetFilePointer(file->_file, position, 0, origin);
#else
	int seek = (origin == SEEK__BEGIN ? SEEK_SET : (origin == SEEK__CURRENT ? SEEK_CUR : SEEK_END));
	int result = fseek(_file, position, seek);
	return ! result;
#endif
}

bool File::Write(File* file,BYTE* buffer, UINT bytesToWrite)
{
	if ( 0 >= _file || _closed )
		return false;
#ifdef WINDOWS
	DWORD dwWritten = 0;
	WriteFile(file->_file, buffer, bytesToWrite,&dwWritten, 0);
	return dwWritten == bytesToWrite;
#else
	 return bytesToWrite == fwrite(buffer, 1, bytesToWrite, _file);
#endif
}
bool File::Close(File* file)
{
	if ( true == file->_closed )
		return false;
#ifdef WINDOWS
	bool result = CloseHandle(file->_file);
	file->_file = 0;
	file->_closed = true;
	return result;
#else
	if ( EOF != fclose(_file) )
	{
		_closed = true;
		_file = 0;
		return true;
	}
	else
		return false;
#endif
}
UINT File::Read(File* file, BYTE* buffer, UINT bytesToRead)
{
	if ( 0 == bytesToRead )
		return 0;
	if ( 0 == buffer )
		return bytesToRead + 1;
	if ( 0 >= file->_file ||  file->_closed )
		return bytesToRead + 2;
#ifdef WINDOWS
	DWORD dwRead = 0;
	ReadFile(file->_file,buffer, bytesToRead, &dwRead, 0);
	return dwRead;
#else
	return (UINT)fread(buffer, 1, bytesToRead, _file);
#endif
}

File* File::Create(STRING filePath)
{
	if ( 0 == filePath)
		return 0;
	bool _closed = false;
	STRING fileFolder = Path::GetFileFolder(filePath);
	File* file = (File*) System::SafeAllocMemory(sizeof(File));
	file->_closed = false;
	File::CreateDirectory(fileFolder);
#ifdef WINDOWS
	file->_file = CreateFileA(filePath, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
#else
	file->_file = fopen(filePath, "wb");
#endif
	if ( 0 >= file->_file)
	{
		file->_closed = true;
		return 0;
	}

	return file;
}


// return current position in file
UINT File::GetCurentPos(File* file)
{
	if ( 0 >= _file || _closed )
		return (UINT)-1;
#ifdef WINDOWS
	return SetFilePointer(file->_file, 0, 0,FILE_CURRENT);
#else
	return ftell(_file);
#endif
}

UINT File::ReadUINT(File* file)
{
	if ( 0 == _file || _closed )
		return (UINT)-1;
	BYTE buffer[4];
	Read(file,buffer,4);
	return MAKE_UINT(buffer[0],buffer[1],buffer[2],buffer[3]);
}

bool File::Skip(File* file,long bytesToSkip)
{
	return Seek(file,bytesToSkip,SEEK__CURRENT);
}

bool File::CreateDirectory(STRING name)
{
#ifdef WINDOWS
	int result = SHCreateDirectoryExA (0, name, 0);
	//ignore already exitant folders
	return  ( result == ERROR_SUCCESS || result == ERROR_ALREADY_EXISTS || result == ERROR_FILE_EXISTS);
#else
	STRING str = (STRING)System::SafeAllocMemory(strlen(name) + 20);
	strcpy(str,"mkdir -p ");
	strcat(str, name);
	system(str);
	System::SafeFreeMemory(str);
	return true;
#endif
}
