# ---- begin snakebids boilerplate ----------------------------------------------

from copy import deepcopy
from functools import partial

import snakebids
from snakebids import bids, generate_inputs


configfile: "config/snakebids.yml"


class ConfigError(Exception):
    """Error raised if the app is misconfigured."""


if not all(
    [config[key] for key in ["overlay_bids_dir", "base_desc", "overlay_desc"]]
):
    raise ConfigError(
        "overlay_bids_dir, base_desc, and overlay_desc must all be defined."
    )
if (
    Path(config["overlay_bids_dir"]).resolve()
    == Path(config["bids_dir"]).resolve()
) and (config["base_desc"] == config["overlay_desc"]):
    raise ConfigError("The base and overlay images are identical.")


base_config = deepcopy(config["pybids_inputs"])
base_config["labelmap"]["filters"]["desc"] = config["base_desc"]
overlay_config = deepcopy(config["pybids_inputs"])
overlay_config["labelmap"]["filters"]["desc"] = config["overlay_desc"]

base_inputs = generate_inputs(
    bids_dir=config["bids_dir"],
    pybids_config=["bids", "derivatives"],
    derivatives=config["derivatives"],
    pybids_inputs=base_config,
    participant_label=config["participant_label"],
)
overlay_inputs = generate_inputs(
    bids_dir=config.get("overlay_bids_dir", config["bids_dir"]),
    pybids_config=["bids", "derivatives"],
    derivatives=config["derivatives"],
    pybids_inputs=overlay_config,
    participant_label=config["participant_label"],
)


# this adds constraints to the bids naming
wildcard_constraints:
    **snakebids.get_wildcard_constraints(config["pybids_inputs"]),


# ---- end snakebids boilerplate ------------------------------------------------


# Rules
include: "rules/label_harmonization.smk"


rule all:
    input:
        base_inputs["labelmap"].expand(
            rules.merge_labels.output["merged_map"],
        ),
        base_inputs["labelmap"].expand(
            rules.merge_labels.output["merged_metadata"],
        ),
    default_target: True
