from modules.software_base import WorkflowRunnerBase
import os

class Bowtie2Runner(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="bowtie2",
            unneeded_args=["-1", "-2", "-S", "-U", "--threads", "-p"],
            output_type="sam",
            mode=mode
        )

    def find_input_files(self,prev_step_files):
        for line in prev_step_files:
            man_item = next((man_item for man_item in self.manifest_list if man_item['id'] == line['id']), None)
            self.input_file_list.append({
                "id": line["id"],
                "horizon": man_item['horizon'],
                "input1": line["output1"],
                "input2": line["output2"],
                "output1": f"{os.path.join(self.output_path, line['id'])}.{self.output_type}",
                "output2": None,
            })
        if self.leaf:
            return prev_step_files
        else:
            return self.input_file_list

    def build_command_queue(self):
        for item in self.input_file_list:
            # RG_ID = Project.SampleID.SampleGroup.SeqType.LibraryLabel
            cmd = [
                self.software_name,
                f"-S {item['output1']}",
                self.additional_args,
                f"--rg-id SFM22.{item['id']}.{item['horizon']}.Illumina.Lib01",
                f"--rg SM:{item['id']}",
                f"--threads {self.threads}"
            ]
            
            # Some specific rules for bowtie2
            # depending on the contents of the Manifest file
            if item["input2"]:   # FWD and REV
                cmd += [
                    f"-1 {item['input1']}", 
                    f"-2 {item['input2']}"
                ]
            else:               # FWD only
                cmd += [f"-U {item['input1']}"]

            self.command_queue.append(" ".join(cmd))
