"""Offline Phase 8 analysis command that never imports camera/application code.""" from __future__ import annotations import logging from pathlib import Path from .analysis_loader import AnalysisLoader from .analysis_plots import AnalysisPlots from .analysis_reporter import AnalysisReporter from .config_loader import AnalysisSettings from .statistical_analyzer import StatisticalAnalyzer LOGGER=logging.getLogger(__name__) def run_analysis_cli(config:AnalysisSettings,input_path:Path,output_path:Path)->list[Path]: settings=AnalysisSettings(config.enabled,str(input_path),str(output_path),config.recursive,config.include_prompt_condition,config.include_control_condition,config.valid_voice_analysis_only,config.response_level_threshold,config.response_rate_test,config.numeric_test,config.yaw_metric_denominator,config.generate_plots,config.overwrite_outputs,config.alpha) loader=AnalysisLoader(settings);paths=loader.find_person_analysis_tables(input_path,settings.recursive) if input_path.is_dir() else [input_path] df=loader.load_person_analysis_tables(paths);result=StatisticalAnalyzer(settings).run_analysis(df,len(paths));outputs=AnalysisReporter(settings).write(result);outputs+=AnalysisPlots(settings).generate(df,result) for path in outputs:LOGGER.info("Analysis output: %s",path) return outputs