"""
ConversionProcessorのシングルトン管理クラス
CSVデータの重複読み込みを防ぎ、メモリ使用量を削減
"""
import pandas as pd
from typing import Dict, Optional
from conversion_processor import ConversionProcessor

class ConversionProcessorManager:
    """
    ConversionProcessorとCSVデータを一元管理するマネージャー
    シングルトンパターンで実装し、メモリ使用量を最小化
    """
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance._initialized = False
        return cls._instance
    
    def __init__(self):
        if self._initialized:
            return
        
        self._initialized = True
        self.shared_csv_data = {}
        self.processors = {}
        print("🎯 ConversionProcessorManager初期化完了（シングルトン）")
    
    def load_csv_data(self, transplants_df: pd.DataFrame, 
                     donor_df: pd.DataFrame, 
                     recipient_df: pd.DataFrame):
        """
        CSVデータを一度だけメモリに読み込む
        全てのConversionProcessorインスタンスで共有される
        """
        self.shared_csv_data = {
            "transplants": transplants_df,
            "d-followups": donor_df,
            "r-followups": recipient_df
        }
        
        # メモリ使用量を表示
        memory_usage = 0
        for name, df in self.shared_csv_data.items():
            size_mb = df.memory_usage(deep=True).sum() / 1024 / 1024
            memory_usage += size_mb
            print(f"📊 {name}: {size_mb:.2f} MB")
        
        print(f"📊 合計CSVメモリ使用量: {memory_usage:.2f} MB")
    
    def get_processor(self, processor_type: str, 
                     rules_path: Optional[str] = None,
                     mapping_path: Optional[str] = None) -> ConversionProcessor:
        """
        指定されたタイプのConversionProcessorを取得
        存在しない場合は新規作成し、共有CSVデータを設定
        """
        if processor_type not in self.processors:
            print(f"🔧 新規ConversionProcessor作成: {processor_type}")
            
            # 新しいプロセッサーを作成
            processor = ConversionProcessor(
                conversion_rules_path=rules_path,
                code_mapping_path=mapping_path
            )
            
            # 共有CSVデータの参照を設定（コピーではなく参照）
            processor.loaded_data = self.shared_csv_data
            
            # キャッシュに保存
            self.processors[processor_type] = processor
        else:
            print(f"♻️ 既存ConversionProcessor再利用: {processor_type}")
        
        return self.processors[processor_type]
    
    def clear_cache(self):
        """
        キャッシュされたデータをクリア（メモリ解放）
        """
        self.shared_csv_data.clear()
        self.processors.clear()
        print("🧹 キャッシュをクリアしました")
    
    def get_memory_usage(self) -> Dict[str, float]:
        """
        現在のメモリ使用量を取得
        """
        usage = {}
        for name, df in self.shared_csv_data.items():
            usage[name] = df.memory_usage(deep=True).sum() / 1024 / 1024
        return usage