"""scqubits: superconducting qubits in Python
===========================================

scqubits is an open-source Python library for simulating superconducting qubits. It is
meant to give the user a convenient way to obtain energy spectra of common
superconducting qubits, plot energy levels as a function of external parameters,
calculate matrix elements etc. The library further provides an interface to QuTiP,
making it easy to work with composite Hilbert spaces consisting of coupled
superconducting qubits and harmonic modes. Internally, numerics within scqubits is
carried out with the help of Numpy and Scipy; plotting capabilities rely on
Matplotlib.

If scqubits is helpful to you in your research, please support its continued
development and maintenance. Use of scqubits in research publications is
appropriately acknowledged by citing:

Peter Groszkowski and Jens Koch, 'scqubits:  a Python package for superconducting qubits',
Quantum 5, 583 (2021). https://quantum-journal.org/papers/q-2021-11-17-583/
"""
#
# This file is part of scqubits.
#
#    Copyright (c) 2019, Jens Koch and Peter Groszkowski
#    All rights reserved.
#
#    This source code is licensed under the BSD-style license found in the
#    LICENSE file in the root directory of this source tree.
############################################################################

import os
import sys

import setuptools

DOCLINES = __doc__.split("\n")

CLASSIFIERS = """\
Development Status :: 5 - Production/Stable
Intended Audience :: Science/Research
License :: OSI Approved :: BSD License
Programming Language :: Python
Programming Language :: Python :: 3
Topic :: Scientific/Engineering
Operating System :: MacOS
Operating System :: POSIX
Operating System :: Unix
Operating System :: Microsoft :: Windows
"""


EXTRA_KWARGS = {}

# version information about scqubits goes here
MAJOR = 3
MINOR = 0
MICRO = 1
ISRELEASED = True

VERSION = "%d.%d.%d" % (MAJOR, MINOR, MICRO)

CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(CURRENT_DIR, "requirements.txt")) as requirements:
    INSTALL_REQUIRES = requirements.read().splitlines()


EXTRAS_REQUIRE = {
    "graphics": ["matplotlib-label-lines (>=0.3.6)"],
    "explorer": ["ipywidgets (>=7.5)"],
    "h5-support": ["h5py (>=2.10)"],
    "pathos": ["pathos", "dill"],
    "fitting": ["lmfit"],
}

TESTS_REQUIRE = ["h5py (>=2.7.1)", "pathos", "dill", "ipywidgets", "pytest", "lmfit"]

PACKAGES = [
    "scqubits",
    "scqubits/core",
    "scqubits/tests",
    "scqubits/utils",
    "scqubits/ui",
    "scqubits/io_utils",
    "scqubits/explorer",
]

PYTHON_VERSION = ">=3.7"


NAME = "scqubits"
AUTHOR = "Jens Koch, Peter Groszkowski"
AUTHOR_EMAIL = "jens-koch@northwestern.edu, piotrekg@gmail.com"
LICENSE = "BSD"
DESCRIPTION = DOCLINES[0]
LONG_DESCRIPTION = "\n".join(DOCLINES[2:])
KEYWORDS = "superconducting qubits"
URL = "https://scqubits.readthedocs.io"
CLASSIFIERS = [_f for _f in CLASSIFIERS.split("\n") if _f]
PLATFORMS = ["Linux", "Mac OSX", "Unix", "Windows"]


def git_short_hash():
    try:
        git_str = "+" + os.popen('git log -1 --format="%h"').read().strip()
    except OSError:
        git_str = ""
    else:
        if git_str == "+":  # fixes setuptools PEP issues with versioning
            git_str = ""
    return git_str


FULLVERSION = VERSION
if not ISRELEASED:
    FULLVERSION += ".dev" + str(MICRO) + git_short_hash()


def write_version_py(filename="scqubits/version.py"):
    cnt = """\
# THIS FILE IS GENERATED FROM scqubits SETUP.PY
short_version = '%(version)s'
version = '%(fullversion)s'
release = %(isrelease)s
"""
    versionfile = open(filename, "w")
    try:
        versionfile.write(
            cnt
            % {
                "version": VERSION,
                "fullversion": FULLVERSION,
                "isrelease": str(ISRELEASED),
            }
        )
    finally:
        versionfile.close()


local_path = os.path.dirname(os.path.abspath(sys.argv[0]))
os.chdir(local_path)
sys.path.insert(0, local_path)
sys.path.insert(0, os.path.join(local_path, "scqubits"))  # to retrieve _version

# always rewrite _version
if os.path.exists("scqubits/version.py"):
    os.remove("scqubits/version.py")
write_version_py()

setuptools.setup(
    name=NAME,
    version=FULLVERSION,
    packages=PACKAGES,
    author=AUTHOR,
    author_email=AUTHOR_EMAIL,
    license=LICENSE,
    description=DESCRIPTION,
    long_description=LONG_DESCRIPTION,
    keywords=KEYWORDS,
    url=URL,
    classifiers=CLASSIFIERS,
    platforms=PLATFORMS,
    install_requires=INSTALL_REQUIRES,
    extras_require=EXTRAS_REQUIRE,
    tests_require=TESTS_REQUIRE,
    zip_safe=False,
    include_package_data=True,
    python_requires=PYTHON_VERSION,
    **EXTRA_KWARGS
)
