from cython import final, no_gc, auto_pickle, freelist
from cpython cimport dict, int, list, long, tuple, type
from cpython.bool cimport PyBool_Check
from cpython.buffer cimport (
    PyObject_GetBuffer, PyObject_GetBuffer, PyBUF_CONTIG_RO, PyBuffer_Release,
)
from cpython.bytes cimport (
    PyBytes_AsStringAndSize, PyBytes_FromStringAndSize, PyBytes_Check,
)
from cpython.dict cimport PyDict_SetItem
from cpython.float cimport PyFloat_Check, PyFloat_AsDouble, PyFloat_FromDouble
from cpython.int cimport PyInt_Check
from cpython.list cimport PyList_Append
from cpython.long cimport PyLong_FromString, PyLong_Check
from cpython.object cimport PyObject, PyObject_GetIter
from cpython.type cimport PyType_Check
from cpython.unicode cimport PyUnicode_Check, PyUnicode_FromEncodedObject, PyUnicode_Format
from libcpp cimport bool as boolean


cdef extern from '<cstddef>' namespace 'std' nogil:
    ctypedef unsigned long size_t


cdef extern from '<cstdint>' namespace 'std' nogil:
    ctypedef unsigned char uint8_t
    ctypedef unsigned short uint16_t
    ctypedef unsigned long uint32_t
    ctypedef unsigned long long uint64_t

    ctypedef signed char int8_t
    ctypedef signed short int16_t
    ctypedef signed long int32_t
    ctypedef signed long long int64_t


cdef extern from '<cstdio>' namespace 'std' nogil:
    int snprintf(char *buffer, size_t buf_size, const char *format, ...)
    size_t strlen(const char *s)


cdef extern from '<cstring>' namespace 'std' nogil:
    void memcpy(void *dest, const void *std, size_t count)
    void memset(void *dest, char value, size_t count)
    size_t strlen(const char *s)


cdef extern from '<cmath>' nogil:
    enum:
        FP_INFINITE, FP_NAN, FP_NORMAL, FP_SUBNORMAL, FP_ZERO

cdef extern from '<cmath>' namespace 'std' nogil:
    int fpclassify(...)


cdef extern from '<utility>' namespace 'std' nogil:
    void swap[T](T&, T&)


cdef extern from 'Python.h':
    ctypedef signed char Py_UCS1
    ctypedef signed short Py_UCS2
    ctypedef signed long Py_UCS4


cdef extern from 'src/native.hpp' namespace 'JSON5EncoderCpp' nogil:
    int32_t cast_to_int32(...)
    uint32_t cast_to_uint32(...)

    ctypedef boolean AlwaysTrue
    boolean obj_has_iter(object obj)

    ctypedef char EscapeDctItem[8]
    cppclass EscapeDct:
        EscapeDctItem items[0x100]
        boolean is_escaped(uint32_t c)
        Py_ssize_t find_unescaped_range(const Py_UCS1 *start, Py_ssize_t length)
        Py_ssize_t find_unescaped_range(const Py_UCS2 *start, Py_ssize_t length)
        Py_ssize_t find_unescaped_range(const Py_UCS4 *start, Py_ssize_t length)
    EscapeDct ESCAPE_DCT

    enum:
        VERSION_LENGTH
    const char VERSION[]

    enum:
        LONGDESCRIPTION_LENGTH
    const char LONGDESCRIPTION[]

    const char HEX[]

    boolean unicode_is_lo_surrogate(uint32_t ch)
    boolean unicode_is_hi_surrogate(uint32_t ch)
    uint32_t unicode_join_surrogates(uint32_t hi, uint32_t lo)

    void reset_hash[T](T *obj)
    AlwaysTrue exception_thrown() except True
    void unreachable()


cdef extern from 'src/native.hpp' namespace 'JSON5EncoderCpp':
    int iter_next(object iterator, PyObject **value) except -1


cdef extern from 'src/native.hpp' nogil:
    boolean expect 'JSON5EncoderCpp_expect'(boolean actual, boolean expected)


cdef extern from 'src/_unicode_cat_of.hpp' namespace 'JSON5EncoderCpp' nogil:
    unsigned unicode_cat_of(uint32_t codepoint)


cdef extern from 'src/_stack_heap_string.hpp' namespace 'JSON5EncoderCpp' nogil:
    cdef cppclass StackHeapString [T]:
        const T *data()
        Py_ssize_t size()
        boolean push_back(T codepoint) except False


cdef extern from 'src/_decoder_recursive_select.hpp' namespace 'JSON5EncoderCpp' nogil:
    cdef enum DrsKind:
        DRS_fail,
        DRS_null, DRS_true, DRS_false, DRS_inf, DRS_nan,
        DRS_string, DRS_number, DRS_recursive

    DrsKind drs_lookup[128]


cdef extern from 'third-party/fast_double_parser/include/fast_double_parser.h' namespace 'fast_double_parser' nogil:
    const char *parse_number(const char *p, double *outDouble)


cdef extern from 'src/dragonbox.cc' namespace 'dragonbox' nogil:
    char *Dtoa(char* buffer, double value)


cdef extern from 'Python.h':
    enum:
        PyUnicode_WCHAR_KIND
        PyUnicode_1BYTE_KIND
        PyUnicode_2BYTE_KIND
        PyUnicode_4BYTE_KIND

    int PyUnicode_READY(object o) except -1
    Py_ssize_t PyUnicode_GET_LENGTH(object o) nogil
    int PyUnicode_KIND(object o) nogil
    boolean PyUnicode_IS_ASCII(object) nogil
    Py_UCS1 *PyUnicode_1BYTE_DATA(object o) nogil
    Py_UCS2 *PyUnicode_2BYTE_DATA(object o) nogil
    Py_UCS4 *PyUnicode_4BYTE_DATA(object o) nogil

    boolean Py_EnterRecursiveCall(const char *where) except True
    void Py_LeaveRecursiveCall()

    bint Py_UNICODE_ISALPHA(Py_UCS4 ch) nogil
    bint Py_UNICODE_ISDIGIT(Py_UCS4 ch) nogil

    object PyUnicode_FromKindAndData(int kind, const void *buf, Py_ssize_t size)
    const char *PyUnicode_AsUTF8AndSize(object o, Py_ssize_t *size) except NULL

    object PyDict_SetDefault(object p, object key, object value)

    object CallFunction 'PyObject_CallFunction'(PyObject *cb, const char *format, ...)
    object CallObject 'PyObject_CallObject'(PyObject *cb, PyObject *args)

    ctypedef signed long Py_hash
    ctypedef signed short wchar_t

    enum:
        SSTATE_NOT_INTERNED
        SSTATE_INTERNED_MORTAL
        SSTATE_INTERNED_IMMORTAL

    ctypedef struct __ascii_object_state:
        uint8_t interned
        uint8_t kind
        boolean compact
        boolean ascii
        boolean ready

    ctypedef struct PyASCIIObject:
        Py_ssize_t length
        Py_hash hash
        wchar_t *wstr
        __ascii_object_state state

    ctypedef struct PyVarObject:
        pass

    ctypedef struct PyBytesObject:
        PyVarObject ob_base
        Py_hash ob_shash
        char ob_sval[1]

    AlwaysTrue ErrNoMemory 'PyErr_NoMemory'() except True
    void *ObjectRealloc 'PyObject_Realloc'(void *p, size_t n)
    void ObjectFree 'PyObject_Free'(void *p)
    object ObjectInit 'PyObject_INIT'(PyObject *obj, type cls)
    PyVarObject *ObjectInitVar 'PyObject_InitVar'(PyVarObject *obj, type cls, Py_ssize_t size)

    object PyLong_FromString(const char *str, char **pend, int base)


ctypedef struct AsciiObject:
    PyASCIIObject base
    char data[1]


cdef extern from * nogil:
    enum:
        CYTHON_COMPILING_IN_PYPY


cdef type datetime, date, time, Decimal, Mapping, IOBase
cdef object saferepr

from collections.abc import Mapping
from datetime import datetime, date, time
from decimal import Decimal
from io import IOBase
from pprint import saferepr
