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


/*--------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*--------------------------------------------------------------------*/
#include <ProModelitem.h>
#include <ProNcseq.h>
#include <ProMfgoper.h>
#include <ProWcell.h>
#include <ProTool.h>
#include <UtilFiles.h>
#include <ProTKRunTime.h>
#include <PTApplsUnicodeUtils.h>
#include <ProUtil.h>
/*--------------------------------------------------------------------*\
Application includes
\*--------------------------------------------------------------------*/
#include "TestMfgNew.h"
#include "UtilString.h"
#include "UtilGeom.h"
#include "TestError.h"
#include "UtilMessage.h"

/*--------------------------------------------------------------------*\
Function prototypes
\*--------------------------------------------------------------------*/
ProError ProUtilToolChoose(ProMfg *p_mfg, ProTool *p_sel_tool);


/*====================================================================*\
FUNCTION : ProTestRouteTool()
PURPOSE  : Create info for Tool
\*====================================================================*/
ProError ProTestRouteTool()
{
    ProMfg mfg_model;
    ProAsmcomppath comp_path;
    ProSolid mfg_solid;
    ProError status;
    ProTool sel_tool;
 
     status = ProTestGetModels( &mfg_model, &mfg_solid, &comp_path);

     status = ProUtilToolChoose(&mfg_model, &sel_tool);

      if (status != PRO_TK_E_NOT_FOUND)
       {
         ProTestGetToolInfo(&sel_tool);
       }
      else
        ProUtilMsgPrint((char*)"gen", (char*)"TEST %0s",(char*)"No Tools available");

    return ((ProError)0);
}

/*====================================================================*\
FUNCTION : ProTestToolParamGet()
PURPOSE  : Read tool parameter (only double) and write to file.
\*====================================================================*/
ProError ProTestToolParamGet (
    FILE *fp,
    ProTool *p_tool,
    ProCharName tl_param_name)
{
    ProParamvalue param_val;
    ProError status;
    double param_value;
    
    
    status = ProToolParamGet(p_tool, tl_param_name, &param_val);
    TEST_CALL_REPORT("ProToolParamGet()",
	"ProTestGetToolInfo()", status, status != PRO_TK_NO_ERROR &&
	status != PRO_TK_E_NOT_FOUND);
    if (status != PRO_TK_NO_ERROR)
	return status;
    
     status = ProParamvalueValueGet (&param_val, PRO_PARAM_DOUBLE,
         &param_value);
     TEST_CALL_REPORT("ProParamvalueValueGet()",
                        "ProTestGetToolInfo()", status,
                        (status != PRO_TK_NO_ERROR));
    if (status != PRO_TK_NO_ERROR)
	return status;
    
    ProTKFprintf(fp, (char*)"\n%s parameter's value is %f", tl_param_name, param_value);
    return status;
}


/*====================================================================*\
FUNCTION : ProTestGetToolInfo()
PURPOSE  : Get Information about Nc sequence
\*====================================================================*/
ProError ProTestGetToolInfo(ProTool *p_tool)
{
    FILE *fp;
    char tool_name[PRO_LINE_SIZE];
    char tool_name_u[PRO_LINE_SIZE];
    ProToolType r_tool_type;
    wchar_t w_filename[PRO_LINE_SIZE];
    ProCharName tool_cutter_diam = "CUTTER_DIAM";
    ProCharName tool_length = "LENGTH";
    ProError status;
   
/*--------------------------------------------------------------------*\
    Open info file
\*--------------------------------------------------------------------*/
     ProWstringToString (tool_name_u, (wchar_t*) p_tool->tool_id);
     ProUtilStringLower( tool_name_u, tool_name);
     ProUtilstrcat(tool_name, ".inf"); 
     fp = PTApplsUnicodeFopen(tool_name,"w");

     ProTKFprintf(fp, (char*)"\tInformation about \"%s\" tool", tool_name_u); 

/*--------------------------------------------------------------------*\    
    Get the tool type
\*--------------------------------------------------------------------*/
     status = ProToolTypeGet (p_tool, &r_tool_type);
     TEST_CALL_REPORT("ProToolTypeGet()",
                        "ProTestGetToolInfo()", status,
                        (status != PRO_TK_NO_ERROR));

      switch (r_tool_type)
       {
         case PRO_TOOL_NONE:
           ProTKFprintf(fp, (char*)"\nTool type:  not defined");
           break;
	   
	 case PRO_TOOL_TURN:
	   ProTKFprintf(fp, (char*)"\nTool type:  Turning");
           break; 

         case PRO_TOOL_DRILL:
           ProTKFprintf(fp, (char*)"\nTool type:  Drilling");
           break;

         case PRO_TOOL_MILL:
           ProTKFprintf(fp, (char*)"\nTool type:  Milling");
           break;

         case PRO_TOOL_SIDE_MILL:
           ProTKFprintf(fp, (char*)"\nTool type:  Side Milling");
           break;

	 case PRO_TOOL_SAW:
	   ProTKFprintf(fp, (char*)"\nTool type:  Saw");
           break; 

         case PRO_TOOL_GROOVE:
           ProTKFprintf(fp, (char*)"\nTool type:  Groove");
           break;

         case PRO_TOOL_BORE:
           ProTKFprintf(fp, (char*)"\nTool type:  Bore");
           break;

         case PRO_TOOL_TAP:
           ProTKFprintf(fp, (char*)"\nTool type:  Tap");
           break;

	 case PRO_TOOL_CSINK:
           ProTKFprintf(fp, (char*)"\nTool type:  Counter sink");
           break;

         case PRO_TOOL_REAM:
           ProTKFprintf(fp, (char*)"\nTool type:  Ream");
           break;

	 case PRO_TOOL_CENTER_DRL:
	   ProTKFprintf(fp, (char*)"\nTool type:  Center drilling");
           break; 

         case PRO_TOOL_TURN_GRV:
           ProTKFprintf(fp, (char*)"\nTool type:  Turn groove");
           break;

         case PRO_TOOL_MILL_THREAD:
           ProTKFprintf(fp, (char*)"\nTool type:  Mill thread");
           break;

         case PRO_TOOL_TURN_THREAD:
           ProTKFprintf(fp, (char*)"\nTool type:  Turn thread");
           break;
	   
       } 

/*--------------------------------------------------------------------*\
    Get the tool parameters
\*--------------------------------------------------------------------*/
     ProTestToolParamGet(fp, p_tool, tool_cutter_diam);
     ProTestToolParamGet(fp, p_tool, tool_length);
     ProTestToolParamGet(fp, p_tool, (char*)"NOSE_RADIUS");
     ProTestToolParamGet(fp, p_tool, (char*)"SIDE_ANGLE");
     ProTestToolParamGet(fp, p_tool, (char*)"END_ANGLE");
     ProTestToolParamGet(fp, p_tool, (char*)"TOOL_WIDTH");
     ProTestToolParamGet(fp, p_tool, (char*)"CORNER_RADIUS");
     ProTestToolParamGet(fp, p_tool, (char*)"CUTTER_WIDTH");
     ProTestToolParamGet(fp, p_tool, (char*)"POINT_ANGLE");
     ProTestToolParamGet(fp, p_tool, (char*)"CHAMFER_LENGTH");
     ProTestToolParamGet(fp, p_tool, (char*)"DRILL_DIAMETER");
     ProTestToolParamGet(fp, p_tool, (char*)"DRILL_LENGTH");
     ProTestToolParamGet(fp, p_tool, (char*)"CUTTING_OFFSET");
     ProTestToolParamGet(fp, p_tool, (char*)"BODY_DIAMETER");
     ProTestToolParamGet(fp, p_tool, (char*)"INSERT_LENGTH");
     ProTestToolParamGet(fp, p_tool, (char*)"SIDE_WIDTH");
     ProTestToolParamGet(fp, p_tool, (char*)"SHANK_DIAM");

     fclose(fp);
     status = ProInfoWindowDisplay(ProStringToWstring(w_filename, tool_name),
         NULL,NULL);      
     TEST_CALL_REPORT ("ProInfoWindowDisplay", "ProTestGetToolInfo",
         status, status != PRO_TK_NO_ERROR);
    
     return PRO_TK_NO_ERROR;
}