/*
  maxToEgg.cxx
  Created by Ken Strickland 02/24/03
  Modified and maintained by Corey Revilla, (05/22/03)-(Present)
  Carnegie Mellon University, Entetainment Technology Center
*/

//Our headers, which in turn includes some Max headers. 
#include "maxToEgg.h"
#include "errno.h"

//Member Function Definitions
/* ~MaxToEgg() - Uninteresting destructor.
 */
MaxToEgg::~MaxToEgg() 
{
}

/* MaxToEgg() - Constructs a MaxToEgg "application."  It sets the types of
   options this converter can take and sets up a description of the program.
 */
MaxToEgg::MaxToEgg() : SomethingToEgg("3D Studio Max",".max") 
{
  add_path_replace_options();
  add_path_store_options();
  add_animation_options();
  add_units_options();
  add_normals_options();
  add_transform_options();

  set_program_description("This program converts 3D Studio Max model files to egg.");
  /*add_option("p", "", 0,
             "Generate polygon output only.  Convert scene to triangle mesh "
             "before converting.", &MaxToEgg::dispatch_none, &alertOnBegin);*/
  add_option("bface", "", 0,
             "Export all polygons as double-sided ",
             &MaxToEgg::dispatch_none, &doubleSided);
  //Fill in the member variables.
  pMaxInterface = null;
  successfulOutput = false;
  confirmExport = true;
  doubleSided = false;
}

/* IsSuccessful() - Indicates if conversion was successful.
 */
bool MaxToEgg::IsSuccessful() 
{
  return successfulOutput;
}

char *MaxToEgg::MyClassName()
{
  return "MaxToEgg";
}

/* Run() - Runs the conversion.  Creates a MaxToEggConverter, populates it
   with the scene graph, and then writes out the egg file.
*/
void MaxToEgg::Run(ULONG *selection_list, int len) 
{
  MaxToEggConverter converter;

  Logger::FunctionEntry( "MaxToEgg::Run" );
  // Now, we fill out the necessary fields of the converter, which does all
  // the necessary work.
  Logger::Log( MTE, Logger::SAT_DEBUG_SPAM_LEVEL, "Setting Max Interface." );
  converter.setMaxInterface( pMaxInterface );
  Logger::Log( MTE, Logger::SAT_DEBUG_SPAM_LEVEL,
               "Setting converter's egg data." );
  converter.set_egg_data( _data );
  // applies the parameters from the command line options
  apply_parameters(converter);
  converter.set_double_sided(doubleSided);
  converter.set_selection_list(selection_list, len);
  
  //Now, do the actual file conversion.
  if (confirmExport && converter.convert_file(_input_filename)) {
    successfulOutput=true;
    write_egg_file();
    Logger::Log( MTE, Logger::SAT_DEBUG_SPAM_LEVEL, "Egg file written!" );
  }

  Logger::FunctionExit();
}


/* SetMaxInterface(Interface *) - This is how we know how to traverse the Max
   scene graph.  For this to be a standalone application, we'd want to be able
   to build one of these interfaces for the input file.
*/
void MaxToEgg::SetMaxInterface(Interface *pInterface) 
{
  pMaxInterface = pInterface;
}

bool MaxToEgg::handle_args(Args &args) {
  char msg[3072];

  //If "auto overwrite" was not checked, ask if the user wishes to overwrite the file
  if (_allow_last_param && !_got_output_filename && args.size() > 1) {
    _got_output_filename = true;
    _output_filename = Filename::from_os_specific(args.back());
    args.pop_back();

    if (!verify_output_file_safe()) {
      sprintf(msg, "Overwrite file \"%s\"?", _output_filename.to_os_specific().c_str());
      confirmExport = 
        ( MessageBox(pMaxInterface->GetMAXHWnd(), msg, "Panda3D Exporter", MB_YESNO | MB_ICONQUESTION)
          == IDYES );
    }
  }

  //Attempt to catch if the output file is read-only
  if (confirmExport) {
    _output_filename.make_dir();
    if (access(Filename(_output_filename.get_dirname()).to_os_specific().c_str(), 2) ||
        (access(_output_filename.to_os_specific().c_str(), 2) && errno != ENOENT)) {
      sprintf(msg, "Error attempting to open \"%s\"\n\nDestination file is in use or read-only", _output_filename.to_os_specific().c_str());
      MessageBox(pMaxInterface->GetMAXHWnd(), msg, "Panda3D Exporter", MB_OK | MB_ICONERROR);
      confirmExport = false;
    }
  }

  return SomethingToEgg::handle_args(args);
}
