import os
import re

from setuptools import setup


def _version_from_changelog():
  """Derives the PyPI package version, e.g. '0.56.0'.

  Normally read from the top 'vX.Y' entry of the repo CHANGELOG, mapped to
  '0.X.Y'. The CHANGELOG lives outside the package so it is not in the sdist;
  when building from an sdist the CHANGELOG is absent, so fall back to the
  version setuptools wrote into PKG-INFO when the sdist was created.
  """
  here = os.path.dirname(os.path.abspath(__file__))
  changelog = os.path.join(here, os.pardir, 'CHANGELOG')
  if os.path.exists(changelog):
    with open(changelog) as f:
      for line in f:
        m = re.match(r'^v(\d+)[.](\d+)\s', line)
        if m:
          return '0.%s.%s' % (m.group(1), m.group(2))
    raise RuntimeError('No vX.Y entry found in %s' % changelog)

  pkg_info = os.path.join(here, 'PKG-INFO')
  if os.path.exists(pkg_info):
    with open(pkg_info) as f:
      for line in f:
        if line.startswith('Version:'):
          return line.split(':', 1)[1].strip()
  raise RuntimeError('Cannot determine version: no CHANGELOG or PKG-INFO')


def _check_prebuilts_version(version):
  """Refuses a release build whose pinned prebuilts do not match its version.

  Only enforced when PERFETTO_PYPI_RELEASE is set: development trees lag
  between a CHANGELOG bump and the prebuilt roll landing.
  """
  if not os.environ.get('PERFETTO_PYPI_RELEASE'):
    return
  here = os.path.dirname(os.path.abspath(__file__))
  version_py = os.path.join(here, 'perfetto', 'prebuilts', 'manifests',
                            'version.py')
  with open(version_py) as f:
    m = re.search(r"^PREBUILTS_VERSION = '([^']*)'$", f.read(), re.M)
  if not m:
    raise RuntimeError('No PREBUILTS_VERSION found in %s' % version_py)
  expected = 'v' + version[len('0.'):]
  if m.group(1) != expected:
    raise RuntimeError(
        'Package version %s pins prebuilts %s, expected %s. Run '
        'tools/release/roll-prebuilts --manifests-only %s before building.' %
        (version, m.group(1), expected, expected))


_VERSION = _version_from_changelog()
_check_prebuilts_version(_VERSION)

setup(
    name='perfetto',
    packages=[
        'perfetto',
        'perfetto.batch_trace_processor',
        'perfetto.common',
        'perfetto.prebuilts',
        'perfetto.prebuilts.manifests',
        'perfetto.protos.perfetto.trace',
        'perfetto.trace_builder',
        'perfetto.trace_processor',
        'perfetto.trace_uri_resolver',
    ],
    package_data={
        'perfetto.trace_processor': ['*.descriptor'],
    },
    include_package_data=True,
    version=_VERSION,
    license='apache-2.0',
    description='Python APIs and bindings for Perfetto (perfetto.dev)',
    author='Perfetto',
    author_email='perfetto-pypi@google.com',
    url='https://perfetto.dev/',
    download_url='https://github.com/google/perfetto/archive/a760e3fc2f84d84225bfb4928d281c4b7c51d193.zip',
    keywords=['trace processor', 'tracing', 'perfetto'],
    install_requires=[
        'protobuf',
    ],
    extras_require={
        'numpy': ['numpy'],
        'pandas': ['pandas'],
        'polars': ['polars'],
    },
    classifiers=[
        'Development Status :: 3 - Alpha',
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3.11",
        "Programming Language :: Python :: 3.12",
    ],
)
