#!/usr/bin/env python
# Copyright cocotb contributors
# Copyright (c) 2013 Potential Ventures Ltd
# Copyright (c) 2013 SolarFlare Communications Inc
# Licensed under the Revised BSD License, see LICENSE for details.
# SPDX-License-Identifier: BSD-3-Clause

import sys

if sys.version_info[:3] < (3, 6, 2):  # noqa: UP036 | bug in ruff
    version_str = ".".join(sys.version_info[:3])
    msg = [
        "This version of cocotb requires at least Python 3.6.2,",
        f"you are running Python {version_str}."
        "For more information please refer to the documentation at ",
        "https://cocotb.readthedocs.io.",
    ]

    raise SystemExit("\n".join(msg))

import logging
import os
import subprocess
from io import StringIO
from os import path, walk

from setuptools import find_packages, setup

# Note: cocotb is not installed properly yet and is missing dependencies and binaries
# We can still import other files next to setup.py, as long as they're in MANIFEST.in
# The below line is necessary for PEP517 support
sys.path.append(path.dirname(__file__))
from cocotb_build_libs import build_ext, get_ext

__version__ = "2.0.1"

max_python3_minor_version = 13
if "COCOTB_IGNORE_PYTHON_REQUIRES" not in os.environ and sys.version_info >= (
    3,
    max_python3_minor_version + 1,
):
    raise RuntimeError(
        f"cocotb {__version__} only supports a maximum Python version of 3.{max_python3_minor_version}.\n"
        "You can suppress this error by defining the environment variable COCOTB_IGNORE_PYTHON_REQUIRES\n"
        "There is no guarantee this will work and no support will be provided."
    )


def read_file(fname):
    with open(path.join(path.dirname(__file__), fname), encoding="utf8") as f:
        return f.read()


def package_files(directory):
    paths = []
    for fpath, _, filenames in walk(directory):
        for filename in filenames:
            paths.append(path.join("..", "..", fpath, filename))
    return paths


version_file_path = path.join("src", "cocotb", "_version.py")
if "dev" in __version__:
    try:
        rev = subprocess.check_output(
            ["git", "rev-parse", "--short", "HEAD"], universal_newlines=True
        ).strip()
        __version__ += f"+{rev}"
    except Exception as e:
        # if this is not a git repository and _version.py already exists,
        # we are probably installing from an sdist, so use the existing _version.py
        if path.exists(version_file_path):
            exec(read_file(version_file_path))
        else:
            print(e, file=sys.stderr)
with open(version_file_path, "w") as f:
    f.write("# Package version\n")
    f.write("# Generated by setup.py -- do not modify directly\n\n")
    f.write(f'__version__ = "{__version__}"\n')


# store log from build_libs and display at the end in verbose mode
# see https://github.com/pypa/pip/issues/6634
log_stream = StringIO()
handler = logging.StreamHandler(log_stream)
log = logging.getLogger("cocotb_build_libs")
log.setLevel(logging.INFO)
log.addHandler(handler)

setup(
    name="cocotb",
    cmdclass={"build_ext": build_ext},
    version=__version__,
    description="cocotb is a coroutine based cosimulation library for writing VHDL and Verilog testbenches in Python.",
    url="https://www.cocotb.org",
    license="BSD-3-Clause",
    long_description=read_file("README.md"),
    long_description_content_type="text/markdown",
    author="Chris Higgs, Stuart Hodgson",
    maintainer="cocotb contributors",
    maintainer_email="cocotb@lists.librecores.org",
    install_requires=[
        "find_libpython",
    ],
    python_requires=">=3.6.2",
    packages=find_packages(where="src"),
    package_dir={"": "src"},
    package_data={
        "cocotb": (
            package_files("src/cocotb/share/include")
            + package_files("src/cocotb/share/def")
            + package_files("src/cocotb/share/lib/verilator")
        ),
        "cocotb_tools": (package_files("src/cocotb_tools/makefiles")),
    },
    ext_modules=get_ext(),
    entry_points={
        "console_scripts": [
            "cocotb-config=cocotb_tools.config:main",
        ]
    },
    platforms="any",
    classifiers=[
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.6",
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3.11",
        "Programming Language :: Python :: 3.12",
        "Programming Language :: Python :: 3.13",
        "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
        "Framework :: cocotb",
    ],
    # these appear in the sidebar on PyPI
    project_urls={
        "Bug Tracker": "https://github.com/cocotb/cocotb/issues",
        "Source Code": "https://github.com/cocotb/cocotb",
        "Documentation": "https://docs.cocotb.org",
    },
)

print(log_stream.getvalue())
