"""
jin.pyの修正例：ConversionProcessorManagerを使用した実装
"""

def main():
    """
    メイン処理関数（シングルトン版）
    """
    from conversion_processor_manager import ConversionProcessorManager
    
    error_logs = []
    
    try:
        # ステップ1: CSVデータを一度だけ読み込む
        print("📁 CSVファイル読み込み開始...")
        institution_df, donor_df, recipient_df, transplants_df, df_mapping = load_data()
        
        # ステップ2: ConversionProcessorManagerを初期化（シングルトン）
        print("🔧 ConversionProcessorManager初期化...")
        manager = ConversionProcessorManager()
        
        # ステップ3: 共有CSVデータを設定（一度だけ）
        manager.load_csv_data(transplants_df, donor_df, recipient_df)
        
        # ステップ4: 必要に応じてプロセッサーを取得
        processors = {}
        
        if Path(CSV_PATHS["donor_kidney_liv_conversion_rules"]).exists():
            processors["donor_kidney_liv"] = manager.get_processor(
                "donor_kidney_liv",
                CSV_PATHS["donor_kidney_liv_conversion_rules"],
                CSV_PATHS["code_mapping"]
            )
        
        if Path(CSV_PATHS["donor_liv_conversion_rules"]).exists():
            processors["donor_liv"] = manager.get_processor(
                "donor_liv",
                CSV_PATHS["donor_liv_conversion_rules"],
                CSV_PATHS["code_mapping"]
            )
        
        if Path(CSV_PATHS["recipient_kidney_liv_conversion_rules"]).exists():
            processors["recipient_kidney_liv"] = manager.get_processor(
                "recipient_kidney_liv",
                CSV_PATHS["recipient_kidney_liv_conversion_rules"],
                CSV_PATHS["code_mapping"]
            )
        
        if Path(CSV_PATHS["ishoku_kihon_liv_conversion_rules"]).exists():
            processors["ishoku_kihon_liv"] = manager.get_processor(
                "ishoku_kihon_liv",
                CSV_PATHS["ishoku_kihon_liv_conversion_rules"],
                CSV_PATHS["code_mapping"]
            )
        
        # メモリ使用量を確認
        memory_usage = manager.get_memory_usage()
        print(f"📊 現在のメモリ使用量: {sum(memory_usage.values()):.2f} MB")
        
        # ステップ5: データベース処理
        db_conn = DatabaseConnection(DB_CONFIG)
        
        # バッチ処理
        total_count = len(transplants_df)
        success_count = 0
        
        for batch_start in range(0, total_count, BATCH_SIZE):
            batch_end = min(batch_start + BATCH_SIZE, total_count)
            batch_df = transplants_df.iloc[batch_start:batch_end]
            
            logger.info(f"📦 バッチ処理: {batch_start + 1}-{batch_end}/{total_count}")
            
            # バッチごとに接続を再確立
            if batch_start > 0:
                db_conn.reconnect()
            
            # 各移植データを処理
            for index, transplant_raw in batch_df.iterrows():
                current_index = batch_start + index + 1
                logger.info(f"処理中: {current_index}/{total_count}")
                
                try:
                    # プロセッサーを使用して処理
                    def process_with_connection(connection, transplant_data):
                        with connection.cursor() as cursor:
                            process_transplant_data(
                                cursor, connection, transplant_data,
                                df_mapping, donor_df, recipient_df,
                                error_logs, institution_df, processors  # processorsを渡す
                            )
                    
                    execute_with_retry(db_conn, process_with_connection, transplant_raw)
                    success_count += 1
                    
                except Exception as e:
                    logger.error(f"移植データ処理中にエラー: {e}")
                    error_logs.append({
                        "テーブル名": "全体処理",
                        "YearNo": transplant_raw.get('YearNo', 'N/A'),
                        "エラー内容": str(e)
                    })
            
            # バッチ処理後にメモリ状況を確認
            import gc
            gc.collect()  # ガベージコレクション実行
            
            # メモリ使用量を表示（オプション）
            if batch_start % 500 == 0:  # 500件ごとに表示
                import psutil
                import os
                process = psutil.Process(os.getpid())
                memory_mb = process.memory_info().rss / 1024 / 1024
                print(f"💾 プロセスメモリ使用量: {memory_mb:.2f} MB")
        
        # 処理完了
        logger.info(f"""
        ========================================
        処理完了サマリー
        ========================================
        総件数: {total_count}
        成功: {success_count}
        エラー: {len(error_logs)}
        成功率: {success_count/total_count*100:.1f}%
        ========================================
        """)
        
        # エラーログ出力
        output_error_logs(error_logs, transplants_df, df_mapping, db_conn)
        
    except Exception as e:
        logger.error(f"処理中に予期しないエラーが発生しました: {e}")
        import traceback
        traceback.print_exc()
        raise
        
    finally:
        # クリーンアップ
        if 'manager' in locals():
            manager.clear_cache()  # メモリ解放
        if 'db_conn' in locals():
            db_conn.close()

# process_transplant_data関数も修正が必要
def process_transplant_data(cursor, connection, transplant_raw, 
                           df_mapping, donor_df, recipient_df, 
                           error_logs, institution_df, 
                           processors):  # processorsを引数に追加
    """
    各移植データの処理（シングルトン版）
    """
    # 既存の処理...
    
    # プロセッサーを使用する箇所
    if "donor_kidney_liv" in processors:
        donor_processor = processors["donor_kidney_liv"]
        # 処理...