#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>

#include <CGAL/Polygon_with_holes_2.h>
#include <CGAL/create_offset_polygons_from_polygon_with_holes_2.h>
#include <CGAL/Straight_skeleton_2/IO/print.h>

#include <memory>

#include <vector>
#include <cassert>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K ;

typedef K::Point_2                    Point ;
typedef CGAL::Polygon_2<K>            Polygon_2 ;
typedef CGAL::Polygon_with_holes_2<K> PolygonWithHoles ;

typedef std::shared_ptr<PolygonWithHoles> PolygonWithHolesPtr ;

typedef std::vector<PolygonWithHolesPtr> PolygonWithHolesPtrVector;

int main()
{
  Polygon_2 outer ;
  outer.push_back( Point( 0.0, 0.0) ) ;
  outer.push_back( Point(10.0, 0.0) ) ;
  outer.push_back( Point(10.0, 4.5) ) ;
  outer.push_back( Point(12.0, 4.5) ) ;
  outer.push_back( Point(12.0, 2.0) ) ;
  outer.push_back( Point(16.0, 2.0) ) ;
  outer.push_back( Point(16.0, 8.0) ) ;
  outer.push_back( Point(12.0, 8.0) ) ;
  outer.push_back( Point(12.0, 5.5) ) ;
  outer.push_back( Point(10.0, 5.5) ) ;
  outer.push_back( Point(10.0,10.0) ) ;
  outer.push_back( Point( 0.0,10.0) ) ;

  Polygon_2 hole ;
  hole.push_back( Point(3.0,3.0) ) ;
  hole.push_back( Point(3.0,7.0) ) ;
  hole.push_back( Point(7.0,7.0) ) ;
  hole.push_back( Point(7.0,3.0) ) ;

  assert(outer.is_counterclockwise_oriented());
  assert(hole.is_clockwise_oriented());

  PolygonWithHoles poly( outer ) ;
  poly.add_hole( hole ) ;

  double lOffset = 1 ;
  PolygonWithHolesPtrVector offset_poly_with_holes = CGAL::create_interior_skeleton_and_offset_polygons_with_holes_2(lOffset,poly);

  CGAL::Straight_skeletons_2::IO::print_polygons_with_holes(offset_poly_with_holes);

  return EXIT_SUCCESS;
}
