# -*- python -*-
# ex: set filetype=python:

import os

from buildbot.plugins import *
from buildbot.www.authz.roles import RolesFromBase

# This is a sample buildmaster config file. It must be installed as
# 'master.cfg' in your buildmaster's base directory.

# This is the dictionary that the buildmaster pays attention to. We also use
# a shorter alias to save typing.
c = BuildmasterConfig = {}

GITEA_SECRET = os.environ.get("GITEA_SECRET")
GITEA_TOKEN = os.environ.get("GITEA_TOKEN")

CLIENT_ID = os.environ.get("GITEA_CLIENT_ID")
assert CLIENT_ID
CLIENT_SECRET = os.environ.get("GITEA_CLIENT_SECRET")
assert CLIENT_SECRET

####### WORKERS

# The 'workers' list defines the set of recognized workers. Each element is
# a Worker object, specifying a unique worker name and password.  The same
# worker name and password must be configured on the worker.

c["workers"] = [
    worker.Worker("worker-rust-1-65", "pass", properties={"rust_version": "1.65"}),
    worker.Worker("worker-rust-1-71", "pass", properties={"rust_version": "1.71"}),
]
rust_workers = ["worker-rust-1-65"]

if "BUILDBOT_MQ_URL" in os.environ:
    c["mq"] = {
        "type": "wamp",
        "router_url": os.environ["BUILDBOT_MQ_URL"],
        "realm": os.environ.get("BUILDBOT_MQ_REALM", "buildbot").decode("utf-8"),
        "debug": "BUILDBOT_MQ_DEBUG" in os.environ,
        "debug_websockets": "BUILDBOT_MQ_DEBUG" in os.environ,
        "debug_lowlevel": "BUILDBOT_MQ_DEBUG" in os.environ,
    }
# 'protocols' contains information about protocols which master will use for
# communicating with workers. You must define at least 'port' option that workers
# could connect to your master with this protocol.
# 'port' must match the value configured into the workers (with their
# --master option)
c["protocols"] = {"pb": {"port": os.environ.get("BUILDBOT_WORKER_PORT", 9989)}}

####### CHANGESOURCES

# the 'change_source' setting tells the buildmaster how it should find out
# about source code changes.  Here we point to the buildbot clone of radn.

c["change_source"] = []
c["change_source"].append(
    changes.GitPoller(
        "https://gitea.parrrate.ru/PTV/radn-rs.git",
        workdir="gitpoller-workdir",
        branch="main",
        pollinterval=300,
    )
)

####### BUILDERS

# The 'builders' list defines the Builders, which tell Buildbot how to perform a build:
# what steps, and which workers can execute them.  Note that any particular build will
# only take place on one worker.

# all_repositories = {
#     r"https://gitea.parrrate.ru/PTV/radn-rs.git": "radn-rs",
# }


# def codebaseGenerator(chdict):
#     return all_repositories.get(chdict["repository"])


# c["codebaseGenerator"] = codebaseGenerator

c["builders"] = []

builderNames = []

CARGO_TARGET_DIR = "/buildbot/_rust/radn-rs/target"
env = {"CARGO_TARGET_DIR": CARGO_TARGET_DIR}
DOC_DIR = f"{CARGO_TARGET_DIR}/doc"

factory = util.BuildFactory()
factory.addStep(
    steps.Git(repourl="https://gitea.parrrate.ru/PTV/radn-rs.git", mode="incremental")
)
factory.addStep(
    steps.ShellCommand(
        command=["cargo", "test"],
        env=env,
    )
)
c["builders"].append(
    util.BuilderConfig(name="runtests", workernames=rust_workers, factory=factory)
)
builderNames.append("runtests")

factory = util.BuildFactory()
factory.addStep(
    steps.Git(repourl="https://gitea.parrrate.ru/PTV/radn-rs.git", mode="incremental")
)
factory.addStep(
    steps.ShellCommand(
        command=[
            "cargo",
            "clippy",
            "--workspace",
            "--examples",
            "--tests",
            "--",
            "--deny=warnings",
        ],
        env=env,
    )
)
c["builders"].append(
    util.BuilderConfig(name="clippy", workernames=rust_workers, factory=factory)
)
builderNames.append("clippy")

factory = util.BuildFactory()
factory.addStep(
    steps.Git(repourl="https://gitea.parrrate.ru/PTV/radn-rs.git", mode="incremental")
)
factory.addStep(
    steps.ShellCommand(
        command=[
            "cargo",
            "doc",
            "--workspace",
        ],
        env=env,
    )
)
factory.addStep(
    steps.DirectoryUpload(
        workersrc=DOC_DIR,
        masterdest=util.Interpolate(
            "/buildbot_share/docs/radn-rs/%(prop:rust_version)s/"
        ),
        url=util.Interpolate(
            "https://radn.parrrate.ru/latest/docs/%(prop:rust_version)s/radn_rs/"
        ),
    )
)
factory.addStep(
    steps.DirectoryUpload(
        workersrc=DOC_DIR,
        masterdest="/buildbot_share/docs/radn-rs/",
        url="https://radn.parrrate.ru/latest/docs/radn_rs/",
    )
)
c["builders"].append(
    util.BuilderConfig(name="rustdoc", workernames=rust_workers, factory=factory)
)
builderNames.append("rustdoc")

factory = util.BuildFactory()
factory.addStep(
    steps.Git(repourl="https://gitea.parrrate.ru/PTV/radn-rs.git", mode="incremental")
)
factory.addStep(
    steps.ShellCommand(
        command=[
            "cargo",
            "fmt",
            "--check",
            "--all",
        ],
        env=env,
    )
)
c["builders"].append(
    util.BuilderConfig(name="fmt-check", workernames=rust_workers, factory=factory)
)
builderNames.append("fmt-check")

####### SCHEDULERS

# Configure the Schedulers, which decide how to react to incoming changes.  In this
# case, just kick off a 'runtests' build

c["schedulers"] = []
c["schedulers"].append(
    schedulers.SingleBranchScheduler(
        name="all",
        change_filter=util.ChangeFilter(branch="main"),
        treeStableTimer=None,
        builderNames=builderNames,
    )
)
c["schedulers"].append(
    schedulers.ForceScheduler(name="force", builderNames=builderNames)
)

####### REPORTER TARGETS

# 'services' is a list of Reporter Targets. The results of each build will be
# pushed to these targets. buildbot/reporters/*.py has a variety to choose from,
# like IRC bots.

c["services"] = []

####### PROJECT IDENTITY

# the 'title' string will appear at the top of this buildbot installation's
# home pages (linked to the 'titleURL').

c["title"] = "RADN"
c["titleURL"] = "https://gitea.parrrate.ru/PTV/radn-rs"

# the 'buildbotURL' string should point to the location where the buildbot's
# internal web server is visible. This typically uses the port number set in
# the 'www' entry below, but with an externally-visible host name which the
# buildbot cannot figure out without some help.

c["buildbotURL"] = os.environ.get("BUILDBOT_WEB_URL", "http://localhost:8010/")


class RolesFromCustom(RolesFromBase):
    def getRolesFromUser(self, userDetails: dict):
        if userDetails.get("is_admin") is True:
            return ["admins"]
        else:
            return []


# minimalistic config to activate new web UI
c["www"] = {
    "port": os.environ.get("BUILDBOT_WEB_PORT", 8010),
    "plugins": {
        "waterfall_view": {},
        "console_view": {},
    },
    "change_hook_dialects": {},
    "auth": util.GiteaAuth(
        endpoint="https://gitea.parrrate.ru",
        client_id=CLIENT_ID,
        client_secret=CLIENT_SECRET,
    ),
    "authz": util.Authz(
        allowRules=[util.AnyControlEndpointMatcher(role="admins")],
        roleMatchers=[RolesFromCustom()],
    ),
}
if GITEA_SECRET:
    c["www"]["change_hook_dialects"]["gitea"] = {
        "secret": GITEA_SECRET,
        "onlyIncludePushCommit": True,
    }
if GITEA_TOKEN:
    c["services"].append(
        reporters.GiteaStatusPush(
            "https://gitea.parrrate.ru", token=GITEA_TOKEN, verbose=True
        ),
    )

####### DB URL

c["db"] = {
    # This specifies what database buildbot uses to store its state.  You can leave
    # this at its default for all but the largest installations.
    "db_url": os.environ.get("BUILDBOT_DB_URL", "sqlite://").format(**os.environ),
}

c["buildbotNetUsageData"] = None