/*
	Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/


/*--------------------------------------------------------------------*\
    Pro/TOOLKIT includes
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProMenu.h>
#include <ProUtil.h>
#include <ProMessage.h>
#include <ProMdl.h>
#include <ProArray.h>

/*--------------------------------------------------------------------*\
    Application includes
\*--------------------------------------------------------------------*/
#include "TestError.h"
#include "TestConfig.h"
#include "UtilMessage.h"
#include "PTApplsUnicodeUtils.h"

/*--------------------------------------------------------------------*\
    Macros
\*--------------------------------------------------------------------*/
#define OPT_NUM		    15
#define MODE_NUM	    21

/*--------------------------------------------------------------------*\
    Application global/external data
\*--------------------------------------------------------------------*/
char*	    config_options[OPT_NUM] = 
	    {
		"AXIS_DISPLAY",
		"BELL",
		"COLOR",
		"DATUM_DISPLAY",
		"DATUM_POINT_DISPLAY",
		"DATUM_POINT_TAG_DISPLAY",
		"DISPLAY_COORDINATE_SYS",
		"GRID_SNAP",
		"IGES_OUT_TRIM_CURVE_DEVIATION",
		"ORTHOGONAL_SNAP",
		"REGEN_BACKUP_USE_DISK",
		"SAVE_DISPLAY",
		"SEARCH_PATH",
		"SPIN_CENTER_DISPLAY",
		"TOL_DISPLAY"
	    };

char*	    mode_names[MODE_NUM] = 
	    {
		"PRO_MODE_SKETCHER",
		"PRO_MODE_PART",
		"PRO_MODE_SHEET_METAL",
		"PRO_MODE_COMPOSITE",
		"PRO_MODE_SCAN_MODEL",
		"PRO_MODE_ASSEMBLY",
		"PRO_MODE_DRAWING",
		"PRO_MODE_MANUFACTURE",
		"PRO_MODE_MOLD",
		"PRO_MODE_CAST",
		"PRO_MODE_DIEFACE",
		"PRO_MODE_LAYOUT",
		"PRO_MODE_FORMAT",
		"PRO_MODE_REPORT",
		"PRO_MODE_MARKUP",
		"PRO_MODE_DIAGRAM",
		"PRO_MODE_INTERCHANGE",
		"PRO_MODE_LEGACY",
		"PRO_MODE_USER_DEFINED",
		"PRO_MODE_VERIFY",
		"PRO_MODE_PROCESS"
	    };


int ProTestConfig( void* p_dummy, int int_dummy )
{
    ProError		status;
    int			menu_id;    /* The identifier of the created menu */
    int			action;


    /* Load menu from file */
    status = ProMenuFileRegister( (char*)"TkConfig", (char*)"tkconfig.mnu", &menu_id );
    TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestConfig()", 
			status, status != PRO_TK_NO_ERROR );

    /* Define menu buttons */
    ProMenubuttonActionSet( (char*)"TkConfig", (char*)"Get Opt", 
	(ProMenubuttonAction)ProTestGetOption, NULL, 0 );
    ProMenubuttonActionSet( (char*)"TkConfig", (char*)"Set Opt", 
	(ProMenubuttonAction)ProTestConfigOptionSetMenu, NULL, 0 );
	ProMenubuttonActionSet( (char*)"TkConfig", (char*)"Get Opt By Name", 
	(ProMenubuttonAction)ProTestGetOptionByName, NULL, 0 );
	ProMenubuttonActionSet( (char*)"TkConfig", (char*)"Set Opt By Name", 
	(ProMenubuttonAction)ProTestSetOptionByName, NULL, 0 );
    ProMenubuttonActionSet( (char*)"TkConfig", (char*)"Edit Cfg File", 
	(ProMenubuttonAction)ProTestFileEdit, NULL, 0 );
    ProMenubuttonActionSet( (char*)"TkConfig", (char*)"Verify Opt", 
	(ProMenubuttonAction)ProTestOptionOrderedVerify, NULL, 0 );
    ProMenubuttonActionSet( (char*)"TkConfig", (char*)"Current Mode", 
	(ProMenubuttonAction)ProTestMode, NULL, 0 );
    ProMenubuttonActionSet( (char*)"TkConfig", (char*)"Done", 
	(ProMenubuttonAction)ProMenuDelete, NULL, 0 );
    ProMenubuttonActionSet( (char*)"TkConfig", (char*)"TkConfig", 
	(ProMenubuttonAction)ProMenuDelete, NULL, 0 );

    /* Rubn MEnu */
    status = ProMenuCreate( PROMENUTYPE_MAIN, (char*)"TkConfig", &menu_id );
    TEST_CALL_REPORT( "ProMenuCreate()", "ProTestConfig()", 
			status, status != PRO_TK_NO_ERROR );
    if( status == PRO_TK_NO_ERROR )
    {
	status = ProMenuProcess( (char*)"TkConfig", &action );
	TEST_CALL_REPORT( "ProMenuProcess()", "ProTestConfig()", 
			    status, status != PRO_TK_NO_ERROR );
    }


    return 0;
}

/*=====================================================================*\
FUNCTION: ProTestGetOption
PURPOSE:  Get a list of config option values
NOTE:     Legacy function - maintained for existing tests only - 
			use ProTestGetOptionByName() instead
\*=====================================================================*/
int ProTestGetOption( void* p_dummy, int int_dummy )
{
    ProError	    status;
    FILE*	    f;
    ProName	    w_congig_option;
    ProPath	    w_option_value;
    char	    option_value[ 80 ];
    char	    filename[] = "pttestcfgopt.inf";
    wchar_t	    w_filename[ PRO_PATH_SIZE ];
    int		    i;
    ProInfoWindowLocation   win_location = { 0.0, 0.0 };
    ProInfoWindowSize	    win_size = { 25, 80 };



    if( (f = PTApplsUnicodeFopen( filename, "wt" )) == NULL )
	return -1;

    for( i=0; i<OPT_NUM; i++ )
    {
	ProStringToWstring( w_congig_option, config_options[i] );
	status = ProConfigoptionGet( w_congig_option, w_option_value );
	TEST_CALL_REPORT( "ProConfigoptionGet()", "ProTestGetOption()", 
			    status, status != PRO_TK_NO_ERROR &&
                            status != PRO_TK_E_NOT_FOUND);
	ProWstringToString( option_value, w_option_value );

	if( status == PRO_TK_NO_ERROR )
	{
	    ProTKFprintf( f, "%s = %s\n", config_options[i], option_value );
	}
    }

    fclose( f );

    status = ProInfoWindowDisplay( ProStringToWstring(w_filename, filename),
				    &win_location, &win_size );
    TEST_CALL_REPORT( "ProInfoWindowDisplay()", "ProTestGetOption()",
			status, status != PRO_TK_NO_ERROR);


    return 0;
}


int ProTestGetOptionByName ( void* p_dummy, int int_dummy )
{
    ProError	    status;
    FILE*	    f;
    ProName	    w_config_option;
	char        config_option [PRO_NAME_SIZE];
    ProPath*	w_option_values;
    char	    option_value[PRO_PATH_SIZE];
    char	    filename[] = "pttestcfgopt.inf";
    wchar_t	    w_filename[ PRO_PATH_SIZE ];
    int		    i, arr_size;

    ProInfoWindowLocation   win_location = { 0.0, 0.0 };
    ProInfoWindowSize	    win_size = { 25, 80 };



    if( (f = PTApplsUnicodeFopen( filename, "wt" )) == NULL )
	return -1;

	ProUtilMsgPrint( "gen", "TEST %0s", "Enter option name: " );
    if( !ProUtilStringGet( w_config_option, NULL, PRO_NAME_SIZE ) )
	return -1;

	status = ProConfigoptArrayGet( w_config_option, &w_option_values );
	TEST_CALL_REPORT( "ProConfigoptArrayGet()", "ProTestGetOption()", 
			    status, status != PRO_TK_NO_ERROR &&
                            status != PRO_TK_E_NOT_FOUND);

	if (status == PRO_TK_E_NOT_FOUND)
	{
		ProTKFprintf ( f, "Option not found.\n");
	}

	if (status == PRO_TK_NO_ERROR)
	{
		ProWstringToString (config_option, w_config_option);

		status = ProArraySizeGet (w_option_values, &arr_size);

		for (i = 0; i < arr_size; i ++)
		{			
			ProWstringToString (option_value, w_option_values [i]);

			if (i == 0)
			{
				ProTKFprintf( f, "%s\n", config_option);
				ProTKFprintf( f, "\t = %s\n", option_value);
			}
			else
				ProTKFprintf( f, "\t = %s\n", option_value );	
		}
	}	

    fclose( f );

    status = ProInfoWindowDisplay( ProStringToWstring(w_filename, filename),
				    &win_location, &win_size );
    TEST_CALL_REPORT( "ProInfoWindowDisplay()", "ProTestGetOption()",
			status, status != PRO_TK_NO_ERROR);

    return 0;
}

/*=====================================================================*\
FUNCTION: ProTestConfigOptionSetMenu
PURPOSE:  Set one of a list of config option values
NOTE:     Legacy function - maintained for existing tests only - 
			use ProTestSetOptionByName() instead
\*=====================================================================*/
int ProTestConfigOptionSetMenu( void* p_dummy, int int_dummy )
{
    ProError		status;
    int			menu_id;    /* The identifier of the created menu */
    int			action;


    /* Load menu from file */
    status = ProMenuFileRegister( (char*)"Option", (char*)"tkoption.mnu", &menu_id );
    TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestConfigOptionSetMenu()", 
			status, status != PRO_TK_NO_ERROR );

    /* Define menu buttons */
    ProMenubuttonActionSet( (char*)"Option", (char*)"AXIS_DISPLAY", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"AXIS_DISPLAY", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"BELL", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"BELL", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"COLOR", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"COLOR", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"DATUM_DISPLAY", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"DATUM_DISPLAY", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"DATUM_POINT_DISPLAY", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"DATUM_POINT_DISPLAY", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"DATUM_POINT_TAG_DISPLAY", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"DATUM_POINT_TAG_DISPLAY", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"DISPLAY_COORDINATE_SYS", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"DISPLAY_COORDINATE_SYS", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"GRID_SNAP", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"GRID_SNAP", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"IGES_OUT_TRIM_CURVE_DEVIATION", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"IGES_OUT_TRIM_CURVE_DEVIATION", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"ORTHOGONAL_SNAP", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"ORTHOGONAL_SNAP", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"REGEN_BACKUP_USE_DISK", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"REGEN_BACKUP_USE_DISK", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"SAVE_DISPLAY", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"SAVE_DISPLAY", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"SEARCH_PATH", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"SEARCH_PATH", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"SPIN_CENTER_DISPLAY", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"SPIN_CENTER_DISPLAY", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"TOL_DISPLAY", 
	(ProMenubuttonAction)ProTestConfigOptionSet, (char*)"TOL_DISPLAY", 0 );
    ProMenubuttonActionSet( (char*)"Option", (char*)"Option",
	(ProMenubuttonAction)ProMenuDelete, NULL, 0 );

    /* Rubn MEnu */
    status = ProMenuCreate( PROMENUTYPE_MAIN, (char*)"Option", &menu_id );
    TEST_CALL_REPORT( "ProMenuCreate()", "ProTestConfigOptionSetMenu()", 
			status, status != PRO_TK_NO_ERROR );
    if( status == PRO_TK_NO_ERROR )
    {
	status = ProMenuProcess( (char*)"Option", &action );
	TEST_CALL_REPORT( "ProMenuProcess()", "ProTestConfigOptionSetMenu()", 
			    status, status != PRO_TK_NO_ERROR );
    }

    return 0;
}

int ProTestConfigOptionSet( char* p_option, int int_dummy )
{
    ProError	    status;
    ProName	    w_option;
    ProLine	    w_option_value;


    ProUtilMsgPrint( "gen", "TEST %0s", "Enter option value: " );
    if( !ProUtilStringGet( w_option_value, NULL, PRO_LINE_SIZE ) )
	return -1;

    ProStringToWstring( w_option, p_option );
    status = ProConfigoptSet( w_option, w_option_value );
    TEST_CALL_REPORT( "ProConfigoptSet()", "ProTestConfigOptionSet()", 
			status, status != PRO_TK_NO_ERROR );

    ProUtilMsgPrint( "gen", "TEST %0s", 
	status == PRO_TK_NO_ERROR ? "Option set successfully" : 
	"Can't set option" );

    ProMessageClear();
    TEST_CALL_REPORT( "ProMessageClear()", "ProTestConfigOptionSet()", 
			PRO_TK_NO_ERROR, 0 );

    status = ProMenuDelete();
    TEST_CALL_REPORT( "ProMenuDelete()", "ProTestConfigOptionSet()", 
			status, status != PRO_TK_NO_ERROR );


    return 0;
}


int ProTestSetOptionByName( void* p_dummy, int int_dummy )
{
    ProError	    status;
    ProName	    w_option;
    ProPath	    w_option_value;

	ProUtilMsgPrint( "gen", "TEST %0s", "Enter option name: " );
    if( !ProUtilStringGet( w_option, NULL, PRO_NAME_SIZE ) )
	return -1;

    ProUtilMsgPrint( "gen", "TEST %0s", "Enter option value: " );
    if( !ProUtilStringGet( w_option_value, NULL, PRO_PATH_SIZE ) )
	return -1;

    status = ProConfigoptSet( w_option, w_option_value );
    TEST_CALL_REPORT( "ProConfigoptSet()", "ProTestConfigOptionSet()", 
			status, status != PRO_TK_NO_ERROR );

    ProUtilMsgPrint( "gen", "TEST %0s", 
	status == PRO_TK_NO_ERROR ? "Option set successfully" : 
	"Couldn't set option" );

    ProMessageClear();
    TEST_CALL_REPORT( "ProMessageClear()", "ProTestConfigOptionSet()", 
			PRO_TK_NO_ERROR, 0 );

    return 0;
}


int ProTestFileEdit( void* p_dummy, int int_dummy )
{
    ProError	    status;
    char	    filename[] = "config.pro";
    ProPath	    w_filename;


    ProStringToWstring( w_filename, filename );
    status = ProFileEdit( w_filename );
    TEST_CALL_REPORT( "ProFileEdit()", "ProTestFileEdit()", 
			status, status != PRO_TK_NO_ERROR &&
                        status != PRO_TK_NO_CHANGE);
    return 0;
}

int ProTestOptionOrderedVerify( void* p_dummy, int int_dummy )
{
    ProError	    status;
    ProCharName	    option;
    ProName	    w_option;
    ProBoolean	    option_exist;
    char*	    str = NULL;

    /* Get opt name */
    ProUtilMsgPrint( "gen", "TEST %0s", "Enter option name: " );
    if( !ProUtilStringGet( w_option, NULL, PRO_NAME_SIZE ) )
	return -1;

    /* Verify opt */
    ProWstringToString( option, w_option );
    status = ProOptionOrderedVerify( option, &option_exist );
    TEST_CALL_REPORT( "ProOptionOrderedVerify()", 
			"ProTestOptionOrderedVerify()", 
			status, status != PRO_TK_NO_ERROR );

    /* Display opt status */
    if( status != PRO_TK_NO_ERROR )
	str = (char *)"Invalid option";
    else
    {
        str = (char *)( (option_exist == PRO_B_TRUE)?
		      ("Option exists"):("Option doesn't exist") );
    }

    ProUtilMsgPrint( "gen", "TEST %0s", str );

    ProMessageClear();
    TEST_CALL_REPORT( "ProMessageClear()", "ProTestOptionOrderedVerify()", 
			PRO_TK_NO_ERROR, 0 );

    return 0;
}

int ProTestMode( void* p_dummy, int int_dummy )
{
    ProError	    status;
    ProMode	    mode = PRO_MODE_UNUSED;

    status = ProModeCurrentGet( &mode );
    TEST_CALL_REPORT( "ProModeCurrentGet()", "ProTestMode()", 
        status, status != PRO_TK_NO_ERROR && status != PRO_TK_BAD_CONTEXT);
    return 0;
}