"""
Wrappers to simplify some pyclipper functions
"""
from typing import Sequence, Optional, List

from numpy.typing import ArrayLike
from pyclipper import (
    Pyclipper, PT_CLIP, PT_SUBJECT, CT_UNION, CT_INTERSECTION, PFT_NONZERO, PFT_EVENODD,
    PyPolyNode,
    )

from .types import contour_t


def union_nonzero(shapes: Sequence[ArrayLike]) -> Optional[PyPolyNode]:
    if not shapes:
        return None
    pc = Pyclipper()
    pc.AddPaths(shapes, PT_CLIP, closed=True)
    result = pc.Execute2(CT_UNION, PFT_NONZERO, PFT_NONZERO)
    return result


def union_evenodd(shapes: Sequence[ArrayLike]) -> List[contour_t]:
    if not shapes:
        return []
    pc = Pyclipper()
    pc.AddPaths(shapes, PT_CLIP, closed=True)
    return pc.Execute(CT_UNION, PFT_EVENODD, PFT_EVENODD)


def intersection_evenodd(
        subject_shapes: Sequence[ArrayLike],
        clip_shapes: Sequence[ArrayLike],
        ) -> List[contour_t]:
    if not subject_shapes or not clip_shapes:
        return []
    pc = Pyclipper()
    pc.AddPaths(subject_shapes, PT_SUBJECT, closed=True)
    pc.AddPaths(clip_shapes, PT_CLIP, closed=True)
    return pc.Execute(CT_INTERSECTION, PFT_EVENODD, PFT_EVENODD)


def hier2oriented(polys: Sequence[PyPolyNode]) -> List[ArrayLike]:
    contours = []
    for poly in polys:
        contours.append(poly.Contour)
        contours += [hole.Contour for hole in poly.Childs]

    return contours
