import gradio as gr
import sys
import os

# LlamaFactoryのパスを追加
llamafactory_path = '/workspaces/fastapi_django_main_live/LLaMA-Factory'
sys.path.append(llamafactory_path)

def create_llamafactory_interface():
    """LlamaFactory Gradio インターフェースを作成する"""
    try:
        # 作業ディレクトリをLlamaFactoryに変更
        original_cwd = os.getcwd()
        llamafactory_path = '/workspaces/fastapi_django_main_live/LLaMA-Factory'
        os.chdir(llamafactory_path)
        
        # 環境変数を設定
        os.environ['LLAMAFACTORY_HOME'] = llamafactory_path
        os.environ['PYTHONPATH'] = f"{llamafactory_path}:{os.environ.get('PYTHONPATH', '')}"
        
        # 必要なファイルの存在確認
        dataset_info_path = os.path.join(llamafactory_path, 'data', 'dataset_info.json')
        if not os.path.exists(dataset_info_path):
            print(f"⚠️ Dataset info file not found: {dataset_info_path}")
            os.chdir(original_cwd)
            with gr.Blocks() as missing_file_ui:
                gr.Markdown("## ⚠️ Configuration Missing")
                gr.Markdown(f"データセット情報ファイルが見つかりません: `{dataset_info_path}`")
                gr.Markdown("LlamaFactoryの初期設定が必要です。")
            return missing_file_ui
        
        print(f"✅ Found dataset info: {dataset_info_path}")
        print(f"✅ Working directory: {os.getcwd()}")
        
        # LlamaFactoryのUIを作成
        from llamafactory.webui.interface import create_ui
        ui = create_ui()
        
        # 作業ディレクトリを元に戻す
        os.chdir(original_cwd)
        return ui
        
    except ImportError as e:
        if 'original_cwd' in locals():
            os.chdir(original_cwd)
        print(f"LlamaFactory import error: {e}")
        # フォールバック UI を作成
        with gr.Blocks() as fallback_ui:
            gr.Markdown("## ⚠️ LlamaFactory Unavailable")
            gr.Markdown("LlamaFactoryモジュールが見つかりません。")
            gr.Markdown("### 解決方法:")
            gr.Markdown("1. LlamaFactoryの依存関係をインストール")
            gr.Markdown("2. パスの設定を確認")
            gr.Code("pip install -e /workspaces/fastapi_django_main_live/LLaMA-Factory", language="bash")
        return fallback_ui
    except Exception as e:
        if 'original_cwd' in locals():
            os.chdir(original_cwd)
        print(f"LlamaFactory UI creation error: {e}")
        with gr.Blocks() as error_ui:
            gr.Markdown("## ❌ LlamaFactory Error")
            gr.Markdown(f"エラー: {str(e)}")
            gr.Markdown("### トラブルシューティング:")
            gr.Markdown("1. LlamaFactoryのファイル構成を確認")
            gr.Markdown("2. 必要な依存関係をインストール")
            gr.Markdown("3. 権限設定を確認")
            with gr.Code():
                gr.Textbox(value=f"エラー詳細: {str(e)}", interactive=False)
        return error_ui

# メインGradio インターフェースを作成
with gr.Blocks(title="🤖 AI Development Platform", theme=gr.themes.Soft()) as gradio_interface:
    # ヘッダー
    gr.Markdown("""
    # 🤖 AI開発プラットフォーム
    
    このプラットフォームでは、LlamaFactoryを使用してLLMのファインチューニングを行うことができます。
    """)
    
    with gr.Tabs() as tabs:
        # LlamaFactory タブ
        with gr.TabItem("🦙 LlamaFactory WebUI"):
            gr.Markdown("""
            ## 🦙 LlamaFactory WebUI
            
            LLM(Large Language Models)のファインチューニングを行うためのWebインターフェースです。
            
            ### 主な機能:
            - 🎯 **モデル訓練**: カスタムデータセットでLLMを訓練
            - 📊 **データセット管理**: 訓練用データの管理・前処理
            - ⚙️ **ハイパーパラメータ調整**: 学習パラメータの最適化
            - 📈 **訓練監視**: リアルタイムでの訓練進捗確認
            """)
            
            # LlamaFactory UIを統合
            try:
                llamafactory_ui = create_llamafactory_interface()
                if llamafactory_ui:
                    # LlamaFactory UIを現在のタブに埋め込み
                    with gr.Group():
                        gr.Markdown("### 🔧 LlamaFactory コントロールパネル")
                        llamafactory_ui.render()
            except Exception as e:
                gr.Markdown(f"### ❌ LlamaFactory 読み込みエラー\n\n```\n{str(e)}\n```")
        
        # 情報タブ
        with gr.TabItem("ℹ️ システム情報"):
            gr.Markdown("""
            ## 📋 システム情報
            
            ### 🔧 利用可能な機能:
            - **LlamaFactory**: LLMファインチューニング
            - **OpenInterpreter**: コード実行・解釈
            - **AutoPrompt**: プロンプト自動最適化
            - **BabyAGI**: 自律AIエージェント
            
            ### 🚀 クイックスタート:
            1. 左側の「LlamaFactory WebUI」タブを選択
            2. データセットを準備・アップロード
            3. モデルとパラメータを設定
            4. 訓練を開始
            
            ### 📞 サポート:
            - 📖 ドキュメント: `/docs/` フォルダ
            - 🐛 問題報告: GitHub Issues
            """)
            
            # システム状態表示
            with gr.Row():
                with gr.Column():
                    gr.Markdown("#### 🔍 システム状態")
                    
                    # 動的にシステム情報を取得
                    def get_system_info():
                        llamafactory_path = '/workspaces/fastapi_django_main_live/LLaMA-Factory'
                        dataset_info_path = os.path.join(llamafactory_path, 'data', 'dataset_info.json')
                        
                        return f"""
                        - **Python Version**: {sys.version.split()[0]}
                        - **Current Directory**: {os.getcwd()}
                        - **LlamaFactory Path**: {llamafactory_path}
                        - **Dataset Info Exists**: {"✅ Yes" if os.path.exists(dataset_info_path) else "❌ No"}
                        - **LlamaFactory Accessible**: {"✅ Yes" if os.path.exists(llamafactory_path) else "❌ No"}
                        """
                    
                    system_status = get_system_info()
                    gr.Markdown(system_status)
                    
                    # LlamaFactory セットアップボタン
                    with gr.Row():
                        setup_btn = gr.Button("🔧 LlamaFactory セットアップ確認", variant="secondary")
                        
                    setup_output = gr.Textbox(
                        label="セットアップ結果", 
                        lines=10, 
                        interactive=False,
                        visible=False
                    )
                    
                    def check_llamafactory_setup():
                        """LlamaFactoryのセットアップ状況をチェック"""
                        result = []
                        llamafactory_path = '/workspaces/fastapi_django_main_live/LLaMA-Factory'
                        
                        # 1. ディレクトリ存在確認
                        if os.path.exists(llamafactory_path):
                            result.append("✅ LlamaFactoryディレクトリが存在します")
                        else:
                            result.append("❌ LlamaFactoryディレクトリが見つかりません")
                            return "\n".join(result), gr.update(visible=True)
                        
                        # 2. dataset_info.json確認
                        dataset_info_path = os.path.join(llamafactory_path, 'data', 'dataset_info.json')
                        if os.path.exists(dataset_info_path):
                            result.append("✅ dataset_info.jsonが存在します")
                        else:
                            result.append("❌ dataset_info.jsonが見つかりません")
                        
                        # 3. 必要なディレクトリ確認
                        required_dirs = ['src', 'data', 'examples']
                        for dir_name in required_dirs:
                            dir_path = os.path.join(llamafactory_path, dir_name)
                            if os.path.exists(dir_path):
                                result.append(f"✅ {dir_name}/ ディレクトリが存在します")
                            else:
                                result.append(f"❌ {dir_name}/ ディレクトリが見つかりません")
                        
                        # 4. モジュールインポート確認
                        try:
                            sys.path.append(llamafactory_path)
                            import llamafactory
                            result.append("✅ LlamaFactoryモジュールのインポートが可能です")
                        except ImportError as e:
                            result.append(f"❌ LlamaFactoryモジュールのインポートに失敗: {e}")
                        
                        return "\n".join(result), gr.update(visible=True)
                    
                    setup_btn.click(
                        fn=check_llamafactory_setup,
                        outputs=[setup_output, setup_output]
                    )

# 自動検出システム用のメタデータ
interface_title = "🚀 AI開発プラットフォーム"
interface_description = "LlamaFactory WebUIとAI開発ツール"