from modules.software_base import WorkflowRunnerBase
import os

class SamToolsRunner(WorkflowRunnerBase):
    def __init__(self, logger, manifest_list, input_path, output_path, additional_args, threads, stepname, mode):
        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="samtools",
            unneeded_args=["-o", "-@"],
            output_type="bam",  # this is adjusted dynamically below
            mode=mode
        )

    def dynamic_flags_from_args(self):
        # Different subcommands require different input types :C
        if "index" in self.additional_args:
            self.carry_previous = True # Output of previous step is carried forward to this step.
            if "-c " in self.additional_args or "--csi " in self.additional_args:
                self.output_type = "bam.csi"
            else:
                self.output_type = "bam.bai"

        
        if "view" in self.additional_args:
            if "-b" in self.additional_args or "--bam " in self.additional_args:
                self.output_type = "bam"
            elif "-C " in self.additional_args or "--cram " in self.additional_args:
                self.output_type = "cram"
            else:
                self.output_type = "sam"

    def find_input_files(self, prev_step_files):
        for line in prev_step_files:
            self.input_file_list.append({
                "id": line["id"],
                "input1": line["output1"],
                "input2": None,
                "output1": f"{os.path.join(self.output_path, line['id'])}.bam",
                "output2": f"{os.path.join(self.output_path, line['id'])}.{self.output_type}",
            })

        # Return anything else
        if self.leaf:
            return prev_step_files
        else:
            return self.input_file_list

    def build_command_queue(self):
        # Specific form with -o output
        # (of course it's not consistent)
        for item in self.input_file_list:
            cmd = [
                self.software_name,
                self.additional_args,
                f"-@ {self.threads}",
                item['input1']
            ]

            if "fixmate" in self.additional_args:
                cmd += [
                    f"{item['output2']}"
                ]
            else:
                cmd += [
                    f"-o {item['output2']}"
                ]

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