#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (C) 2022 F4PGA Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0

from pathlib import Path
from typing import List
from shutil import which
from subprocess import run

from setuptools import setup as setuptools_setup


packagePath = Path(__file__).resolve().parent
requirementsFile = packagePath / "requirements.txt"


# Read requirements file and add them to package dependency list
def get_requirements(file: Path) -> List[str]:
    requirements = []
    with file.open("r") as fh:
        for line in fh.read().splitlines():
            if line.startswith("#") or line == "":
                continue
            elif line.startswith("-r"):
                # Remove the first word/argument (-r)
                filename = " ".join(line.split(" ")[1:])
                requirements += get_requirements(file.parent / filename)
            elif line.startswith("https"):
                # Convert 'URL#NAME' to 'NAME @ URL'
                splitItems = line.split("#")
                requirements.append("{} @ {}".format(splitItems[1], splitItems[0]))
            else:
                requirements.append(line)
    return requirements


semver = "0.0.0"
version = None

gitcommit = packagePath.parent / ".gitcommit"
if gitcommit.exists():
    with gitcommit.open("r") as rptr:
        sha = rptr.read().strip()
        if sha != "$Format:%h$":
            version = f"{semver}+{sha}"

git = which("git")
if git is not None:
    proc = run(["git", "rev-parse", "HEAD"], capture_output=True)
    if proc.returncode == 0:
        version = f'{semver}+{proc.stdout.decode("utf8")[0:8]}'

if version is None:
    version = semver


sf = "symbiflow"
shwrappers = "f4pga.wrappers.sh.__init__"


setuptools_setup(
    name=packagePath.name,
    version=version,
    license="Apache-2.0",
    author="F4PGA Authors",
    description="F4PGA.",
    url="https://github.com/chipsalliance/f4pga",
    package_dir={"f4pga": "."},
    package_data={
        "f4pga.flows": [
            "*.yml",
        ],
        "f4pga.wrappers.sh": [
            "xc7/*.f4pga.sh",
            "quicklogic/*.f4pga.sh",
        ],
        "f4pga.wrappers.tcl": [
            "*.f4pga.tcl",
        ],
    },
    classifiers=[],
    python_requires=">=3.6",
    install_requires=list(set(get_requirements(requirementsFile))),
    entry_points={
        "console_scripts": [
            "f4pga = f4pga.flows:main",
            # QuickLogic only
            f"ql_{sf} = {shwrappers}:ql",
        ]
        + [
            f"{sf}_{script} = {shwrappers}:{script}"
            for script in [
                "pack",
                "place",
                "route",
                "synth",
                "write_fasm",
                # Xilinx only
                "write_bitstream",
                # QuickLogic only
                "analysis",
                "fasm2bels",
                "generate_bitstream",
                "repack",
                "write_binary",
                "write_bitheader",
                "write_jlink",
                "write_openocd",
            ]
        ]
    },
)
