// Use the legacy main on Linux and assume UTF-8
int main(int argc, char** argv)
#endif

{
	String cmdLine = Process::GetCommandLine();

	ArgvParser ap(argc, argv);
	if( !ap.HasFlag("file") )
	{
		// Display usage
		String version = "PngOptimizerCL 2.4.1";
#if defined(_M_X64)
		version = version + String(" (x64)");
#elif defined(_M_IX86)  
		version = version + String(" (x86)");
#endif
		Console::WriteLine(version + " \xA9 2002/2014 Hadrien Nilsson - psydk.org");
		Console::WriteLine("Converts GIF, BMP and TGA files to optimized PNG files.");
		Console::WriteLine("Optimizes and cleans PNG files.");
		Console::WriteLine("");
		Console::WriteLine("Usage:  PngOptimizerCL -file:\"yourfile.png\" [-recurs]");
		POEngineSettings::WriteArgvUsage("  ");
		Console::WriteLine("");
		Console::WriteLine("Values enclosed with [] are optional.");
		Console::WriteLine("Chunk option meaning: R=Remove, K=Keep, F=Force. 0|1|2 can be used too.");
		Console::WriteLine("");
		Console::WriteLine("Input examples:");
		Console::WriteLine("Handle a specific file:");
		Console::WriteLine("  PngOptimizerCL -file:\"icon.png\"");
		Console::WriteLine("Handle specific file types in the current directory:");
		Console::WriteLine("  PngOptimizerCL -file:\"*.png|*.bmp\"");
		Console::WriteLine("Handle any supported file in the current directory:");
		Console::WriteLine("  PngOptimizerCL -file:\"*\"");
		Console::WriteLine("Handle specific file types in the current directory (recursive):");
		Console::WriteLine("  PngOptimizerCL -file:\".png|*.bmp\" -recurs");
		Console::WriteLine("Handle a specific directory (recursive):");
		Console::WriteLine("  PngOptimizerCL -file:\"gfx/\"");
		Console::WriteLine("");
	
		if( Console::IsOwned() )
		{
			Console::Write("Press any key to continue");
			Console::WaitForKey();
		}
		return 0;
	}

	POApplicationConsole app;

	// PngOptimizer.exe -file:"myfile.png"

	POEngine engine;
	if( !engine.WarmUp() )
	{
		Console::WriteLine("Warm-up failed");
		return 1;
	}
	engine.Progressing.Handle(&app, &POApplicationConsole::OnEngineProgressing);

	engine.m_settings.LoadFromArgv(ap);

	//////////////////////////////////////////////////////////////////
	String filePath = ap.GetFlagString("file");
	String dir, fileName;
	FilePath::Split(filePath, dir, fileName);
	StringArray filePaths;
	String joker;
	if( ap.HasFlag("recurs") )
	{
		filePaths.Add(dir);
		joker = fileName;
	}
	else
	{
		filePaths = Directory::GetFileNames(dir, fileName, true);
		if( filePaths.IsEmpty() )
		{
			// For PngOptimizerCL, it is an error if we have nothing to optimize
			Color32 col = POEngine::ColorFromTextType(POEngine::TT_ErrorMsg);
			Console::SetTextColor(col);
			Console::WriteLine("File not found: " + filePath);
			Console::ResetTextColor();
			return 1;
		}
	}

	if( !engine.OptimizeFiles(filePaths, joker) )
	{
		return 1;
	}
	return 0;
}