from modules.software_base import WorkflowRunnerBase
import os

class MergeByHorizonRunner(WorkflowRunnerBase):
    def __init__(self, logger, manifest_list, input_path, output_path="", additional_args="", threads=2, stepname="", mode=None):
        super().__init__(
            logger=logger,
            manifest_list=manifest_list,
            input_path=input_path,
            output_path=output_path,
            additional_args=additional_args,
            threads=threads,
            stepname=stepname,
            software_name="mergeByHorizon2.py",
            unneeded_args=["-i", "-o", "-s", "-t", "-z", "--input_dir", "--output_dir", "--sample_ids", "--threads", "--horizon-id"],
            output_type="bam",
            rescan_output=True,
            mode=mode
        )

    def find_input_files(self,prev_step_files):
        horizon_dict = {}
        for line in self.manifest_list:
            if "horizon" in line:
                if line["horizon"] != None:
                    if line["horizon"] not in horizon_dict:
                        horizon_dict[line["horizon"]] = []

                    horizon_dict[line["horizon"]].append(line["id"])

        for group in horizon_dict:
            horizon_ids = ",".join(horizon_dict[group])
            self.input_file_list.append({
                "id": group,
                "input1": horizon_ids,
                "input2": None,
                "output1": None,
                "output2": None,
            })

        if self.leaf:
            return prev_step_files
        else:
            return None

    def build_command_queue(self):
        for item in self.input_file_list:
            cmd = [
                self.software_name,
                f"--input_dir {self.input_path}",
                f"--output_dir {self.output_path}",
                f"--horizon_id {item['id']}",
                f"--sample_ids {item['input1']}",
                f"--threads {self.threads}"
            ]
            
            self.command_queue.append(" ".join(cmd))
