from distutils.core import setup
from distutils import ccompiler
from distutils.errors import CCompilerError, DistutilsPlatformError
from pathlib import Path
import re
import tempfile

import os
import sys

from setuptools import find_packages

IS_TRAVIS = "TRAVIS" in os.environ
IS_DEPLOYING = "DEPLOYING" in os.environ
IS_RTD = "READTHEDOCS" in os.environ

dep_links = [
    "https://github.com/Rapptz/discord.py/tarball/7eb918b19e3e60b56eb9039eb267f8f3477c5e17#egg=discord.py-1.0"
]
if IS_TRAVIS:
    dep_links = []


def get_package_list():
    core = find_packages(include=["redbot", "redbot.*"])
    return core


def check_compiler_available():
    m = ccompiler.new_compiler()

    with tempfile.TemporaryDirectory() as tdir:
        with tempfile.NamedTemporaryFile(prefix="dummy", suffix=".c", dir=tdir) as tfile:
            tfile.write(b"int main(int argc, char** argv) {return 0;}")
            tfile.seek(0)
            try:
                m.compile([tfile.name])
            except (CCompilerError, DistutilsPlatformError):
                return False
    return True


def get_requirements():
    with open("requirements.txt") as f:
        requirements = f.read().splitlines()
    try:
        requirements.remove(
            "git+https://github.com/Rapptz/discord.py.git@rewrite#egg=discord.py[voice]"
        )
    except ValueError:
        pass

    if not check_compiler_available():  # Can't compile python-Levensthein, so drop extra
        requirements.remove("fuzzywuzzy[speedup]<=0.16.0")
        requirements.append("fuzzywuzzy<=0.16.0")
    if IS_DEPLOYING or not (IS_TRAVIS or IS_RTD):
        requirements.append("discord.py>=1.0.0a0")
    if sys.platform.startswith("linux"):
        requirements.append("distro")
    return requirements


def get_version():
    with open("redbot/core/__init__.py") as f:
        version = re.search(
            r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', f.read(), re.MULTILINE
        ).group(1)
    return version


def find_locale_folders():
    """
    Ignore this tomfoolery in the desire for automation. It works, that's
    all you gotta know. Don't fuck with this unless you really know what
    you're doing, otherwise we lose all translations.
    """

    def glob_locale_files(path: Path):
        msgs = path.glob("*.po")

        parents = path.parents

        return [str(m.relative_to(parents[0])) for m in msgs]

    ret = {"redbot.core": glob_locale_files(Path("redbot/core/locales"))}

    cogs_path = Path("redbot/cogs")

    for cog_folder in cogs_path.iterdir():
        locales_folder = cog_folder / "locales"
        if not locales_folder.is_dir():
            continue

        pkg_name = str(cog_folder).replace("/", ".")
        ret[pkg_name] = glob_locale_files(locales_folder)

    return ret


setup(
    name="Red-DiscordBot",
    version=get_version(),
    packages=get_package_list(),
    package_data=find_locale_folders(),
    include_package_data=True,
    url="https://github.com/Cog-Creators/Red-DiscordBot",
    license="GPLv3",
    author="Cog-Creators",
    author_email="",
    description="A highly customizable Discord bot",
    classifiers=[
        "Development Status :: 4 - Beta",
        "Framework :: AsyncIO",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
        "Operating System :: OS Independent",
        "Programming Language :: Python :: 3.5",
        "Programming Language :: Python :: 3.6",
        "Topic :: Communications :: Chat",
        "Topic :: Documentation :: Sphinx",
    ],
    entry_points={
        "console_scripts": [
            "redbot=redbot.__main__:main",
            "redbot-setup=redbot.setup:main",
            "redbot-launcher=redbot.launcher:main",
        ]
    },
    python_requires=">=3.6,<3.7",
    setup_requires=get_requirements(),
    install_requires=get_requirements(),
    dependency_links=dep_links,
    extras_require={
        "test": ["pytest>3", "pytest-asyncio"],
        "mongo": ["motor"],
        "docs": ["sphinx>=1.7", "sphinxcontrib-asyncio", "sphinx_rtd_theme"],
        "voice": ["red-lavalink>=0.0.4"],
        "style": ["black==18.5b1"],
    },
)
