%module{Slic3r::XS};

%{
#include <myinit.h>
#include "ExtrusionEntity.hpp"
%}

%name{Slic3r::ExtrusionPath} class ExtrusionPath {
    ~ExtrusionPath();
    SV* arrayref()
        %code{% RETVAL = THIS->polyline.to_AV(); %};
    SV* pp()
        %code{% RETVAL = THIS->polyline.to_SV_pureperl(); %};
    void pop_back()
        %code{% THIS->polyline.points.pop_back(); %};
    void reverse();
    Lines lines()
        %code{% RETVAL = THIS->polyline.lines(); %};
    Point* first_point()
        %code{% const char* CLASS = "Slic3r::Point"; RETVAL = THIS->first_point(); %};
    Point* last_point()
        %code{% const char* CLASS = "Slic3r::Point"; RETVAL = THIS->last_point(); %};
    ExtrusionEntityCollection* intersect_expolygons(ExPolygonCollection* collection)
        %code{% const char* CLASS = "Slic3r::ExtrusionPath::Collection"; RETVAL = THIS->intersect_expolygons(collection); %};
    ExtrusionEntityCollection* subtract_expolygons(ExPolygonCollection* collection)
        %code{% const char* CLASS = "Slic3r::ExtrusionPath::Collection"; RETVAL = THIS->subtract_expolygons(collection); %};
    void clip_end(double distance);
    void simplify(double tolerance);
    double length();
    bool is_perimeter();
    bool is_fill();
    bool is_bridge();
%{

ExtrusionPath*
_new(CLASS, polyline_sv, role, mm3_per_mm)
    char*           CLASS;
    SV*             polyline_sv;
    ExtrusionRole   role;
    double          mm3_per_mm;
    CODE:
        RETVAL = new ExtrusionPath ();
        RETVAL->polyline.from_SV_check(polyline_sv);
        RETVAL->role            = role;
        RETVAL->mm3_per_mm      = mm3_per_mm;
    OUTPUT:
        RETVAL

Polyline*
ExtrusionPath::polyline(...)
    PREINIT:
        const char* CLASS = "Slic3r::Polyline::Ref";
    CODE:
        if (items > 1) {
            THIS->polyline.from_SV_check( ST(1) );
        }
        RETVAL = &(THIS->polyline);
    OUTPUT:
        RETVAL

ExtrusionRole
ExtrusionPath::role(...)
    CODE:
        if (items > 1) {
            THIS->role = (ExtrusionRole)SvUV(ST(1));
        }
        RETVAL = THIS->role;
    OUTPUT:
        RETVAL

double
ExtrusionPath::mm3_per_mm(...)
    CODE:
        if (items > 1) {
            THIS->mm3_per_mm = (double)SvNV(ST(1));
        }
        RETVAL = THIS->mm3_per_mm;
    OUTPUT:
        RETVAL

void
ExtrusionPath::append(...)
    CODE:
        for (unsigned int i = 1; i < items; i++) {
            Point p;
            p.from_SV_check(ST(i));
            THIS->polyline.points.push_back(p);
        }

%}
};

%package{Slic3r::ExtrusionPath};
%{

IV
_constant()
  ALIAS:
    EXTR_ROLE_PERIMETER                    = erPerimeter
    EXTR_ROLE_EXTERNAL_PERIMETER           = erExternalPerimeter
    EXTR_ROLE_OVERHANG_PERIMETER           = erOverhangPerimeter
    EXTR_ROLE_CONTOUR_INTERNAL_PERIMETER   = erContourInternalPerimeter
    EXTR_ROLE_FILL                         = erFill
    EXTR_ROLE_SOLIDFILL                    = erSolidFill
    EXTR_ROLE_TOPSOLIDFILL                 = erTopSolidFill
    EXTR_ROLE_BRIDGE                       = erBrige
    EXTR_ROLE_INTERNALBRIDGE               = erInternalBridge
    EXTR_ROLE_SKIRT                        = erSkirt
    EXTR_ROLE_SUPPORTMATERIAL              = erSupportMaterial
    EXTR_ROLE_GAPFILL                      = erGapFill
  PROTOTYPE:
  CODE:
    RETVAL = ix;
  OUTPUT: RETVAL

%}