{
  lib,
  stdenv,
  buildPythonPackage,
  cffi,
  dos2unix,
  fetchPypi,
  matplotlib,
  networkx,
  numpy,
  pytestCheckHook,
  pythonOlder,
  setuptools,
  setuptools-scm,
  wheel,
  gurobi,
  gurobipy,
  # Enable support for the commercial Gurobi solver (requires a license)
  gurobiSupport ? false,
  # If Gurobi has already been installed outside of the Nix store, specify its
  # installation directory here
  gurobiHome ? null,
}:

buildPythonPackage rec {
  pname = "mip";
  version = "1.15.0";
  format = "pyproject";

  disabled = pythonOlder "3.7";

  src = fetchPypi {
    inherit pname version;
    hash = "sha256-f28Dgc/ixSwbhkAgPaLLVpdLJuI5UN37GnazfZFvGX4=";
  };

  nativeCheckInputs = [
    matplotlib
    networkx
    numpy
    pytestCheckHook
  ];

  nativeBuildInputs = [
    dos2unix
    setuptools
    setuptools-scm
    wheel
  ];

  propagatedBuildInputs = [
    cffi
  ] ++ lib.optionals gurobiSupport ([ gurobipy ] ++ lib.optional (gurobiHome == null) gurobi);

  # Source files have CRLF terminators, which make patch error out when supplied
  # with diffs made on *nix machines
  prePatch = ''
    find . -type f -exec ${dos2unix}/bin/dos2unix {} \;
  '';

  patches = [
    # Some tests try to be smart and dynamically construct a path to their test
    # inputs. Unfortunately, since the test phase is run after installation,
    # those paths point to the Nix store, which no longer contains the test
    # data. This patch hardcodes the data path to point to the source directory.
    ./test-data-path.patch
  ];

  postPatch = ''
    # Allow newer cffi versions to be used
    substituteInPlace pyproject.toml --replace "cffi==1.15.*" "cffi>=1.15"
  '';

  # Make MIP use the Gurobi solver, if configured to do so
  makeWrapperArgs = lib.optional gurobiSupport "--set GUROBI_HOME ${
    if gurobiHome == null then gurobi.outPath else gurobiHome
  }";

  # Tests that rely on Gurobi are activated only when Gurobi support is enabled
  disabledTests = lib.optional (!gurobiSupport) "gurobi";

  passthru.optional-dependencies = {
    inherit gurobipy numpy;
  };

  meta = with lib; {
    homepage = "https://python-mip.com/";
    description = "Collection of Python tools for the modeling and solution of Mixed-Integer Linear programs (MIPs)";
    downloadPage = "https://github.com/coin-or/python-mip/releases";
    changelog = "https://github.com/coin-or/python-mip/releases/tag/${version}";
    license = licenses.epl20;
    broken = stdenv.isAarch64;
    maintainers = with maintainers; [ nessdoor ];
  };
}
