// Vorosweep - Copyright (C) 2010-2014 T. Mouton
//
// See the LICENSE.txt file for license information. Please report all
// bugs and problems to <thibaud.mouton@gmail.com>.

#include "vorosweep.h"

using namespace vorosweep;

void Graph::handle_edge_edgecrash ( Event *ev )
{
  SweepEdge *se0 = ev->get_sweepedge ( 0 );
  SweepEdge *se1 = ev->get_sweepedge ( 1 );

  se0->print();
  se1->print();
  
    
//   if (se0->get_type() == SweepObject::BORDEREDGE && se1->is_stopped())
//   {
//     double time = ev->get_time();
//     update_time ( time );
// //     se0->set_stopped();
//     return;
//   }
//   
//   if (se1->get_type() == SweepObject::BORDEREDGE && se0->is_stopped())
//   {
//     double time = ev->get_time();
//     update_time ( time );
// //     se1->set_stopped();
//     return;
//   }

  // if one of the edges is still running
  // we have to add its earliest event in the main queue
  if ( se0->is_stopped() && !se1->is_stopped() )
  {
    Front *fr0 = se1->get_front ( 0 );
    Front *fr1 = se1->get_front ( 1 );
    if ( fr0 && fr1 )
    {
      if ( fr0->get_sweepedge ( 0 )->is_stopped() && fr1->get_sweepedge ( 1 )->is_stopped() ) // "T" configuration
      {
        se1->set_stopped();
        return;
      }
    }
    Event *ne = se1->get_earliest_event();
    if ( ne )
      add_event ( ne );
    return;
  }
  else if ( !se0->is_stopped() && se1->is_stopped() )
  {
    Front *fr0 = se0->get_front ( 0 );
    Front *fr1 = se0->get_front ( 1 );

    if ( fr0 && fr1 )
    {
      if ( fr0->get_sweepedge ( 0 )->is_stopped() && fr1->get_sweepedge ( 1 )->is_stopped() ) // "T" configuration
      {
        se0->set_stopped();
        return;
      }
    }
    Event *ne = se0->get_earliest_event();
    if ( ne )
      add_event ( ne );
    return;
  }
  else if ( se0->is_stopped() && se1->is_stopped() )
  {
    return;
  }

  double time = ev->get_time();
  update_time ( time );

  if ( se0->get_xyspeed() <= se1->get_xyspeed() ) // take speed into account
    se0->merge_current ( se1, time ); // stop and update as well (consistency)
  else
    se1->merge_current ( se0, time );

  if ( !se0->get_front ( 0 ) && !se1->get_front ( 1 ) )
  {
    merge ( se1, se0 );
  }
  else if ( !se0->get_front ( 1 ) && !se1->get_front ( 0 ) )
  {
    merge ( se0, se1 );
  }
  else if ( se0->get_front ( 0 ) == se1->get_front ( 1 ) )
  {
    merge ( se1, se0 );
  }
  else
  {
    merge ( se0, se1 );
  }
//   se0->set_stopped();
//   se1->set_stopped();
}

