// dentaire - registration of implants
// Copyright (C) 2008-2026 Eric Bechet
//
// See the LICENSE file for contributions and license information.
// Please report all bugs and problems to <bechet@cadxfem.org>.
//

#include <iostream>
#include <vector>
#include <string>
#include <sstream>


#include "ndisplay.h"
#include "geometry.h"
#include "fileIO.h"
#include "interface_callbacks.h"
#include "program_options.h"

int main(int argc, char * argv[])
{
  data_env current;
  try 
  { 
    program_options::parse(argc, argv);
  } 
  catch (const std::exception &x)
  {
    std::cerr << x.what() << '\n';
    program_options::help();
    return EXIT_FAILURE;
  }
  
  if (program_options::stl())
  {
    try 
    {
      loadmesh(program_options::stl_file(),current.mesh);
      current.mesh.build_kdtree();
    }
    catch(int)
    {
      std::cerr << "Problem reading STL" << std::endl;
    }
  }
  
  if (program_options::sb())
  {
    try 
    {
      loadSB(program_options::sb_file(),current.scanbodies);
    }
    catch(int)
    {
      std::cerr << "Problem reading scanbodies" << std::endl;
    }
  }

  if (program_options::ref_sb())
  {
    try 
    {
      loadSB(program_options::ref_sb_file(),current.ref_scanbodies);
    }
    catch(int)
    {
      std::cerr << "Problem reading reference scanbodies" << std::endl;
    }
  }

  if (program_options::ref_sb()&& program_options::sb()&& program_options::compare())
  {
    std::cout << "Comparing SBs" << std::endl;
    std::stringstream buffer;
    compare(current.scanbodies,current.ref_scanbodies,buffer);
    std::cout << buffer.str() << std::endl;
  }
  
  if (program_options::GUI())
  {
    current.init_display();
    data_container &data_stl=current.buffer[0];
    data_container &data_sb=current.buffer[1];
    data_container &data_pts=current.buffer[2];
    properties p;
    p.c=color(255,0,0);
    p.pointsize=7;
    data_pts.setproppoints(p);
    current.sbh=0.0;
//    p=data_stl.getproptriangles();
//    p.edgeon=true;
//    p.c=color(255,0,0);
//    data_stl.setproptriangles(p);
    #ifdef INTERFACE_TYPE_FLTK
    current.display->buildMenus(custom_menu_items,&current);
    current.display->gl_picks(false);
    #endif
    current.mesh.Display(data_stl,false);
    drawsb(&current);
    current.display->init_data(current.buffer);
    mycallbacks CB(current);
    current.display->setcallbacks(&CB);
    current.display->display();
  }
  return EXIT_SUCCESS;
}
