// Copyright 2023 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include "./numpy_interop.h"

#include "./binding.h"

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "numpy/arrayobject.h"

namespace iree::python::numpy {

namespace {

int internal_import_array() {
  import_array1(-1);
  return 0;
}

}  // namespace

void InitializeNumPyInterop() {
  if (internal_import_array() < 0) {
    throw py::import_error("numpy.core.multiarray failed to import");
  }
}

int ConvertHalElementTypeToNumPyTypeNum(iree_hal_element_type_t t) {
  switch (t) {
    case IREE_HAL_ELEMENT_TYPE_BOOL_8:
      return NPY_BOOL;
    case IREE_HAL_ELEMENT_TYPE_INT_8:
    case IREE_HAL_ELEMENT_TYPE_SINT_8:
      return NPY_INT8;
    case IREE_HAL_ELEMENT_TYPE_UINT_8:
      return NPY_UINT8;
    case IREE_HAL_ELEMENT_TYPE_INT_16:
    case IREE_HAL_ELEMENT_TYPE_SINT_16:
      return NPY_INT16;
    case IREE_HAL_ELEMENT_TYPE_UINT_16:
      return NPY_UINT16;
    case IREE_HAL_ELEMENT_TYPE_INT_32:
    case IREE_HAL_ELEMENT_TYPE_SINT_32:
      return NPY_INT32;
    case IREE_HAL_ELEMENT_TYPE_UINT_32:
      return NPY_UINT32;
    case IREE_HAL_ELEMENT_TYPE_INT_64:
    case IREE_HAL_ELEMENT_TYPE_SINT_64:
      return NPY_INT64;
    case IREE_HAL_ELEMENT_TYPE_UINT_64:
      return NPY_UINT64;
    case IREE_HAL_ELEMENT_TYPE_FLOAT_16:
      return NPY_FLOAT16;
    case IREE_HAL_ELEMENT_TYPE_FLOAT_32:
      return NPY_FLOAT32;
    case IREE_HAL_ELEMENT_TYPE_FLOAT_64:
      return NPY_FLOAT64;
    case IREE_HAL_ELEMENT_TYPE_COMPLEX_FLOAT_64:
      return NPY_COMPLEX64;
    case IREE_HAL_ELEMENT_TYPE_COMPLEX_FLOAT_128:
      return NPY_COMPLEX128;
    default:
      throw py::value_error("Unsupported VM Buffer -> numpy dtype mapping");
  }
}

py::object DescrNewFromType(int typenum) {
  PyArray_Descr* dtype = PyArray_DescrNewFromType(typenum);
  if (!dtype) {
    throw py::python_error();
  }
  return py::steal((PyObject*)dtype);
}

int TypenumFromDescr(py::handle dtype) {
  if (!PyArray_DescrCheck(dtype.ptr())) {
    throw py::cast_error();
  }
  PyArray_Descr* descr = (PyArray_Descr*)dtype.ptr();
  return descr->type_num;
}

py::object SimpleNewFromData(int nd, intptr_t const* dims, int typenum,
                             void* data, py::handle base_object) {
  PyObject* array_c = PyArray_SimpleNewFromData(nd, dims, typenum, data);
  if (!array_c) throw py::python_error();
  py::object array = py::steal(array_c);
  if (base_object) {
    if (PyArray_SetBaseObject(reinterpret_cast<PyArrayObject*>(array.ptr()),
                              base_object.ptr())) {
      throw py::python_error();
    }
    base_object.inc_ref();
  }
  return array;
}

}  // namespace iree::python::numpy
