from modules.software_base import WorkflowRunnerBase
import os
from workflow.log import logcolor

class FastpRunner(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="fastp",
            unneeded_args=["--in1", "--in2", "--out1", "--out2", "--thread", "--json", "--html"],
            output_type="fastq",
            mode=mode
        )

    def find_input_files(self, prev_step_files):
        for line in prev_step_files:
            if line["output2"]:
                self.input_file_list.append({
                    "id": line["id"],
                    "input1": line["output1"],
                    "input2": line["output2"],
                    "output1": f"{os.path.join(self.output_path, line['id'])}_R1.{self.output_type}",
                    "output2": f"{os.path.join(self.output_path, line['id'])}_R2.{self.output_type}",
                })
            else:
                self.input_file_list.append({
                    "id": line["id"],
                    "input1": line["output1"],
                    "input2": None,
                    "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:
            base_cmd = [
                self.software_name,
                f"--thread {self.threads}",
                f"--json {os.path.join(self.output_path, item['id'])}.json",
                f"--html {os.path.join(self.output_path, item['id'])}.html",
                self.additional_args
            ]

            if item["input2"]:   # Double Input
                base_cmd += [
                    f"--in1 {item['input1']}",
                    f"--in2 {item['input2']}",
                    f"--out1 {item['output1']}",
                    f"--out2 {item['output2']}"
                ]
            else:               # Single Input
                base_cmd += [
                    f"--in1 {item['input1']}",
                    f"--out1 {item['output1']}"
                ]

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





# fastp -in1 input_R1.fastq.gz -in2 input_R2.fastq.gz \
#       -out1 output_R1.fastq.gz -out2 output_R2.fastq.gz \
#       --dedup \
#       --low_complexity_filter \
#       --complexity_threshold 30 \
#       --length_required 50 \
#       --html report.html \
#       --json report.json

# fastp -in1 collapsed.fastq \
#       -out1 filtered_collapsed.fastq \
#       --dedup \
#       --low_complexity_filter \
#       --complexity_threshold 30 \
#       --length_required 50 \
#       --html report.html \
#       --json report.json

# ADDITIONAL ARGS: --dedup --low_complexity_filter --complexity_threshold 30 --length_required 50