import pandas as pd
from phase0 import HardwarePhase
from phase1 import SegmentationPhase
from phase2 import FeatureExtractionPhase
from  phase3 import RobustnessPhase
import numpy as np

class Pipeline:
    """
    A global pipeline to integrate the robustness and prediction pipelines.

    This pipeline first runs the robustness analysis to identify the most robust features
    and then evaluates the performance of models in the prediction pipeline using
    various percentages of these features.
    """

    def __init__(self, features_output_path, global_args):
        """
        Inicializa cada fase del pipeline con los argumentos necesarios.

        Args:
            features_output_path (str): Ruta al directorio donde se guardan las características extraídas.
            global_args (dict): Argumentos requeridos para todas las fases del pipeline.
        """
        self.hardware_phase = HardwarePhase()
        self.segmentation_phase = SegmentationPhase(**global_args)
        self.feature_extraction_phase = FeatureExtractionPhase(features_output_path, **global_args)
        self.robustness_phase = RobustnessPhase(**global_args)

    def run_global_pipeline(self):
        """
        Ejecuta el pipeline completo.
        """
        print("Encontrando los trabajadores óptimos...")
        self.hardware_phase.run_pipeline()
        print("Paralelización con ", self.hardware_phase.optimal_workers, " trabajadores")
        
        print("Haciendo algunas segmentaciones automáticas y semiautomáticas...")
        self.segmentation_phase.run_pipeline(self.hardware_phase.optimal_workers)
        print("Segmentaciones automáticas y semiautomáticas completadas.")
        
        print("Empezando la extracción de características radiómicas...")
        self.feature_extraction_phase.run_pipeline(self.hardware_phase.optimal_workers)
        print("Extracción de características radiómicas completada.")
        
        print("Empezando el análisis de robustez...")
        self.robustness_phase.run_pipeline(self.hardware_phase.optimal_workers)
        print("Análisis de robustez completado.")
       

