
checkpoint check_viewpoints_exist:
    input:
        cooler="capcruncher_output/results/{sample}/{sample}.hdf5",
    output:
        "capcruncher_output/resources/viewpoints/{sample}.json",
    log:
        "capcruncher_output/logs/check_viewpoints_exist/{sample}.log",
    script:
        "../scripts/identify_viewpoints_with_interactions.py"



def check_viewpoints_exist(wildcards):
    output = checkpoints.check_viewpoints_exist.get(sample=wildcards.sample).output[0]
    samples = glob_wildcards(pathlib.Path(output).parent / "{sample}.json").sample
    files = [pathlib.Path(output).parent / f"{sample}.json" for sample in samples]
    return files

rule viewpoint_checks:
    input:
        check_viewpoints_exist,
    output:
        touch("capcruncher_output/resources/viewpoints/viewpoints_present.txt"),





def get_existing_viewpoints(sample):
    identified_viewpoints = checkpoints.check_viewpoints_exist.get(
        sample=sample
    ).output[0]

    with open(identified_viewpoints) as f:
        viewpoints = json.load(f)

    return [vp for vp, count in viewpoints.items() if count > 0]


def define_viewpoint_bigwigs():
    bigwigs = []
    for sample in SAMPLE_NAMES:
        viewpoints = get_existing_viewpoints(sample)
        bw = expand(
            "capcruncher_output/results/{sample}/bigwigs/{norm}/{sample}_{viewpoint}.bigWig",
            sample=[sample],
            norm=["raw", "norm"],
            viewpoint=viewpoints,
        )
        bigwigs.extend(bw)

    return bigwigs


def define_comparisons():
    # Define which viewpoints are present in the samples
    viewpoints_per_sample = {}
    for sample in SAMPLE_NAMES:
        viewpoints_per_sample[sample] = get_existing_viewpoints(sample)

    # Define which viewpoints are present in all samples
    viewpoints_all_samples = set.intersection(
        *[set(v) for v in viewpoints_per_sample.values()]
    )

    # Define comparisons
    comparisons = []
    if COMPARE_SAMPLES:
        bigwigs_summary = (
            expand(
                "capcruncher_output/results/comparisons/bigwigs/{group}.{method}-summary.{viewpoint}.bigWig",
                group=DESIGN["condition"].unique(),
                viewpoint=viewpoints_all_samples,
                method=SUMMARY_METHODS,
            ),
        )
        bigwigs_compare = (
            expand(
                "capcruncher_output/results/comparisons/bigwigs/{comparison}.{method}-subtraction.{viewpoint}.bigWig",
                comparison=[
                    f"{a}-{b}"
                    for a, b in itertools.permutations(DESIGN["condition"].unique(), 2)
                ],
                method=SUMMARY_METHODS,
                viewpoint=viewpoints_all_samples,
            ),
        )
        comparisons = bigwigs_summary + bigwigs_compare

    return comparisons
