////////////////////////////////////////////////////////////////////////////////
//
// Lightfeather project wizard
//
////////////////////////////////////////////////////////////////////////////////

// globals
LFPath <- _T("");
LFQuickProject <- false;

//options
LF_NVidiaCg <- GetConfigManager().Read(_T("/lf_project_wizard/options/cgshaders"), true);
LF_NGPlant <- GetConfigManager().Read(_T("/lf_project_wizard/options/ngplant"), true);
LF_Net <- GetConfigManager().Read(_T("/lf_project_wizard/options/net"), false);
LF_WxCanvas <- GetConfigManager().Read(_T("/lf_project_wizard/options/wxcanvas"), false);
LF_LocalConfig <- GetConfigManager().Read(_T("/lf_project_wizard/options/localconfig"), false);
// TODO: lf-static

function BeginWizard()
{
    // intro text
    local intro_msg = _T("Welcome to the new Lightfeather project wizard!\n\n" +
                        "This wizard will guide you to create a new project\n" +
                        "using the Lightfeather 3D rendering engine.\n\n" +
                        "When you 're ready to proceed, please click \"Next\"...");

    // "select LF path" text
    local lfpath_descr = _T("Please select the location of Lightfeather on your computer.\n" +
                              "This is the top-level folder where Lightfeather was installed\n(unpacked).\n");

    // "select LF project to generate" text
    local lfprjtype_descr = _T("Please select the type of project to generate.");
    local lfprj_choices = _T("Structured with C++ classes;Quick single-file testbed");

    Wizard.AddInfoPage(_T("LFIntro"), intro_msg);
    Wizard.AddProjectPathPage();
    Wizard.AddGenericSelectPathPage(_T("LFPath"), lfpath_descr, _T("Please select Lightfeather's location:"), _T(""));
    Wizard.AddGenericSingleChoiceListPage(_T("LFPrjType"), lfprjtype_descr, lfprj_choices, 0);
    Wizard.AddPage(_T("LfOptions"));
//    Wizard.AddCompilerPage(_T(""), _T("gcc*"), true, false); // no target selections
    Wizard.SetCompilerDefault(_T("gcc"));
    Wizard.SetDebugTargetDefaults(true, _T("Debug"), _T("Debug/"), _T("Debug/"));
    Wizard.SetReleaseTargetDefaults(false, _T(""), _T(""), _T(""));
}

////////////////////////////////////////////////////////////////////////////////
// Lightfeather's path page
////////////////////////////////////////////////////////////////////////////////

function OnLeave_LFPath(fwd)
{
    if (fwd)
    {
        // error string
        local error =_T("The path you entered seems valid, but this wizard " +
                        "can't locate Lightfeather's files in it...");

        local dir         = Wizard.GetTextControlValue(_T("txtFolder")); // txtFolder is the text control in GenericSelectPathPage
        local dir_nomacro = ReplaceMacros(dir, true);
        
        // check for include files
        if (!IO.FileExists(dir_nomacro + _T("/include/lf/Lightfeather.h")))
        {
            ShowError(error);
            return false;
        }

        LFPath = dir;
    }
    return true;
}

////////////////////////////////////////////////////////////////////////////////
// Project type to create
////////////////////////////////////////////////////////////////////////////////

function OnLeave_LFPrjType(fwd)
{
    if (fwd)
    {
        LFQuickProject = Wizard.GetListboxSelection(_T("GenericChoiceList")) == 1;
    }
    return true;
}

////////////////////////////////////////////////////////////////////////////////
// Lightfeather options
////////////////////////////////////////////////////////////////////////////////

function OnEnter_LfOptions(fwd)
{
	Wizard.CheckCheckbox(_T("chkCG"), LF_NVidiaCg);
	Wizard.CheckCheckbox(_T("chkNG"), LF_NGPlant);
	Wizard.CheckCheckbox(_T("chkNet"), LF_Net);
	Wizard.CheckCheckbox(_T("chkWx"), LF_WxCanvas);
	Wizard.CheckCheckbox(_T("chkLocalConfig"), LF_LocalConfig);
}

function OnLeave_LfOptions(fwd)
{
	LF_NVidiaCg = Wizard.IsCheckboxChecked(_T("chkCG"));
	LF_NGPlant = Wizard.IsCheckboxChecked(_T("chkNG"));
	LF_Net = Wizard.IsCheckboxChecked(_T("chkNet"));
	LF_WxCanvas = Wizard.IsCheckboxChecked(_T("chkWx"));
	LF_LocalConfig = Wizard.IsCheckboxChecked(_T("chkLocalConfig"));

	GetConfigManager().Write(_T("/lf_project_wizard/options/cgshaders"), LF_NVidiaCg);
	GetConfigManager().Write(_T("/lf_project_wizard/options/ngplant"), LF_NGPlant);
	GetConfigManager().Write(_T("/lf_project_wizard/options/net"), LF_Net);
	GetConfigManager().Write(_T("/lf_project_wizard/options/wxcanvas"), LF_WxCanvas);
	GetConfigManager().Write(_T("/lf_project_wizard/options/localconfig"), LF_LocalConfig);

    return true;
}

// return the files this project contains
function GetFilesDir()
{
    local ret = _T("lf/files/common;");
    if (LFQuickProject)
        ret = ret + _T("lf/files/quick");
    else
        ret = ret + _T("lf/files/structured");
    return ret;
}

// setup the already created project
function SetupProject(project)
{
    // set a variable to reference lf's dir
    project.SetVar(_T("lf"), LFPath, false);

	// set defaults for all targets
	if (PLATFORM != PLATFORM_MSW)
	{
	    project.AddCompilerOption(_T("-fPIC"));
	    project.AddCompilerOption(_T("-DPIC"));
	}
    project.AddCompilerOption(_T("-DPNG_NO_ASSEMBLER_CODE"));
    
    if (LF_NVidiaCg)
    {
    	if (PLATFORM == PLATFORM_MSW)
    	{
			project.AddIncludeDir(_T("$(lf)/ext/Cg/include"));
			project.AddLibDir(_T("$(lf)/ext/Cg/lib/windows"));
    	}
		project.AddCompilerOption(_T("-DHAVE_CG"));
    }
    if (LF_NGPlant)
    {
    	if (PLATFORM == PLATFORM_MSW)
			project.AddLibDir(_T("$(lf)/ext/ngplant/lib/devcpp"));
		else if (PLATFORM == PLATFORM_GTK)
		{
			project.AddLibDir(_T("$(lf)/ext/ngplant/lib/linux"));
			project.AddLibDir(_T("$(lf)/ext/ngplant/lib/linux64"));
		}
		else
			project.AddLibDir(_T("$(lf)/ext/ngplant/lib/mac"));
		project.AddIncludeDir(_T("$(lf)/ext/ngplant/include"));
		project.AddCompilerOption(_T("-DHAVE_NGPLANT"));
    }
    if (LF_Net)
		project.AddCompilerOption(_T("-DHAVE_NETWORK"));
    if (LF_WxCanvas)
    {
    	if (PLATFORM == PLATFORM_GTK)
    	{
			project.AddCompilerOption(_T("`wx-config --cxxflags`"));
			project.AddLinkerOption(_T("`wx-config --libs gl`"));
    	}
		project.AddCompilerOption(_T("-DLF_HAVE_WX"));
    }
	if (LF_LocalConfig)
		project.AddCompilerOption(_T("-DHAVE_LOCAL_LF_CONFIG"));
	
    project.AddIncludeDir(_T("$(lf)/include"));

    // first rename "default" target (index 0 - could do it by name too) to "Debug"
    project.RenameBuildTarget(0, _T("Debug"));

    local debugTarget = project.GetBuildTarget(0);
    debugTarget.SetTargetType(ttConsoleOnly);

    // and now duplicate it to create the rest of the targets
    // (easier than creating new targets and adding files manually)
    project.DuplicateBuildTarget(0, _T("Release"));
    project.DuplicateBuildTarget(0, _T("Standard"));

    local releaseTarget = project.GetBuildTarget(1);
    local standardTarget = project.GetBuildTarget(2);

    // Debug
    TargetFinalSetup(debugTarget, "Debug", true, false);

    // Release
    TargetFinalSetup(releaseTarget, "Release", false, false);

    // Standard
    TargetFinalSetup(standardTarget, "Standard", true, false);

    return true;
}

function TargetFinalSetup(target, dir, isDebug, isLib)
{
	// just setup the different things per-target
    target.SetOutputFilename(_T("bin/" + dir + "/") + Wizard.GetProjectTitle());
    target.SetObjectOutput(_T("bin/obj/" + dir));
    
    target.AddLibDir(_T("$(lf)/bin/" + dir));
    
    target.AddLinkLib(_T("Lightfeather"));
    
    if (isDebug)
    {
    	target.AddCompilerOption(_T("-g"));
    	target.AddCompilerOption(_T("-DDEBUG"));
    }
    else
    {
    	target.AddCompilerOption(_T("-O2"));
    	target.AddCompilerOption(_T("-s"));
    }
    
    if (isLib)
    {
		if (LF_NVidiaCg)
		{
			target.AddLinkLib(_T("Cg"));
			target.AddLinkLib(_T("CgGL"));
		}
    	target.AddLinkLib(_T("GL"));
    	target.AddLinkLib(_T("GLU"));
    	target.AddLinkLib(_T("Xxf86vm"));
    	target.AddLinkLib(_T("pthread"));
    }
}
