#include "nwnx_area"
#include "nwnx_tests"

void main()
{
    WriteTimestampedLogEntry("NWNX_Area unit test begin..");

    object oArea = GetAreaFromLocation(GetStartingLocation());

    if (GetIsObjectValid(oArea))
    {
        WriteTimestampedLogEntry("Using starting area: " + GetName(oArea));

        object oPC = GetFirstPC();

        if (GetIsObjectValid(oPC) && GetArea(oPC) == oArea)
        {
            NWNX_Tests_Report("NWNX_Area", "GetNumberOfPlayersInArea", NWNX_Area_GetNumberOfPlayersInArea(oArea) == 1);
        }
        else
        {
            WriteTimestampedLogEntry("No player in area, skipping 'GetNumberOfPlayersInArea' test");
        }

        NWNX_Area_SetPVPSetting(oArea, NWNX_AREA_PVP_SETTING_PARTY_PVP);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}PVPSetting", NWNX_Area_GetPVPSetting(oArea) == NWNX_AREA_PVP_SETTING_PARTY_PVP);

        NWNX_Area_SetAreaSpotModifier(oArea, 25);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}AreaSpotModifier", NWNX_Area_GetAreaSpotModifier(oArea) == 25);

        NWNX_Area_SetAreaListenModifier(oArea, 25);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}AreaListenModifier", NWNX_Area_GetAreaListenModifier(oArea) == 25);

        NWNX_Area_SetNoRestingAllowed(oArea, TRUE);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}NoRestingAllowed", NWNX_Area_GetNoRestingAllowed(oArea));

        NWNX_Area_SetWindPower(oArea, 2);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}WindPower", NWNX_Area_GetWindPower(oArea) == 2);

        NWNX_Area_SetWeatherChance(oArea, NWNX_AREA_WEATHER_CHANCE_LIGHTNING, 50);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}WeatherChance", NWNX_Area_GetWeatherChance(oArea, NWNX_AREA_WEATHER_CHANCE_LIGHTNING) == 50);

        NWNX_Area_SetFogClipDistance(oArea, 12.5f);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}FogClipDistance", NWNX_Area_GetFogClipDistance(oArea) == 12.5f);

        NWNX_Area_SetShadowOpacity(oArea, 75);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}ShadowOpacity", NWNX_Area_GetShadowOpacity(oArea) == 75);

        NWNX_Area_SetDayNightCycle(oArea, NWNX_AREA_DAYNIGHTCYCLE_ALWAYS_DARK);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}DayNightCycle", NWNX_Area_GetDayNightCycle(oArea) == NWNX_AREA_DAYNIGHTCYCLE_ALWAYS_DARK);

        NWNX_Area_SetSunMoonColors(oArea, NWNX_AREA_COLOR_TYPE_MOON_DIFFUSE, FOG_COLOR_GREEN);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}SunMoonColors", NWNX_Area_GetSunMoonColors(oArea, NWNX_AREA_COLOR_TYPE_MOON_DIFFUSE) == FOG_COLOR_GREEN);

        vector vLoc = GetPositionFromLocation(GetStartingLocation());
        object oWP = CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", GetStartingLocation());
        object oAT = NWNX_Area_CreateTransition(oArea, oWP, vLoc.x, vLoc.y, vLoc.z);
        NWNX_Tests_Report("NWNX_Area", "CreateTransition", oAT != OBJECT_INVALID);

        string sResult = NWNX_Area_GetTileModelResRef(oArea, vLoc.x, vLoc.y);
        NWNX_Tests_Report("NWNX_Area", "GetTileModelResRef", sResult != "");

        NWNX_Area_SetTileAnimationLoop(oArea, vLoc.x, vLoc.y, 1, FALSE);
        NWNX_Tests_Report("NWNX_Area", "{Set/Get}TileAnimationLoop", NWNX_Area_GetTileAnimationLoop(oArea, vLoc.x, vLoc.y, 1) == FALSE);
    }
    else
    {
        WriteTimestampedLogEntry("No valid area found, aborting.");
    }


    WriteTimestampedLogEntry("NWNX_Area unit test end.");
}