import ctypes, ctypes.util

from . import _isl


__all__ = [
    'Context',
    'BasicSet',
]


libisl = ctypes.CDLL(ctypes.util.find_library('isl'))

libisl.isl_printer_get_str.restype = ctypes.c_char_p
libisl.isl_dim_set = _isl.isl_dim_set


class IslObject:

    __slots__ = (
        '_ptr',
    )

    def __init__(self, ptr):
        self._ptr = ptr

    @property
    def _as_parameter_(self):
        return self._ptr


class Context(IslObject):

    def __init__(self):
        ptr = libisl.isl_ctx_alloc()
        super().__init__(ptr)

    #comment out so does not delete itself after being created
    #def __del__(self):
    #   libisl.isl_ctx_free(self)

    def __eq__(self, other):
        if not isinstance(other, Context):
            return False
        return self._ptr == other._ptr


class BasicSet(IslObject):

    def __str__(self):
        ls = libisl.isl_basic_set_get_local_space(self)
        ctx = libisl.isl_local_space_get_ctx(ls)
        p = libisl.isl_printer_to_str(ctx)
        p = libisl.isl_printer_print_basic_set(p, self)
        string = libisl.isl_printer_get_str(p).decode()
        return string

    def __del__(self):
        libisl.isl_basic_set_free(self)

    def constraints(self):
        return _isl.isl_basic_set_constraints(self._ptr)
