#!/usr/bin/env python3
"""
🎯 AI-Human協働開発システム - 初心者向け順次テストガイド

このシステムは初めて使う方でも簡単に操作できるよう、
ステップバイステップのガイド付きインターフェースを提供します。

上から順番に実行していくだけで、システム全体を体験できます。
"""

import gradio as gr
import sqlite3
import json
import os
from datetime import datetime
from pathlib import Path
import sys

# プロジェクトルートをパスに追加
sys.path.append('/workspaces/fastapi_django_main_live')

class BeginnerGuideSystem:
    """初心者ガイドシステムクラス"""
    
    def __init__(self):
        self.db_path = "/workspaces/fastapi_django_main_live/prompts.db"
        self.approval_db_path = "/workspaces/fastapi_django_main_live/controllers/gra_03_programfromdocs/approval_system.db"
        self.current_step = 1
        self.max_steps = 6
        self.test_results = {}
        
    def get_system_overview(self):
        """システム概要を取得"""
        return """
# 🚀 AI-Human協働開発システムへようこそ!

## 📋 このシステムでできること

### 🎯 主要機能
1. **プロンプト管理**: AIに指示するプロンプトを作成・保存
2. **承認システム**: 安全性を確保するための承認フロー  
3. **自動実行**: 承認されたプロンプトの自動実行
4. **GitHub連携**: 実行結果をGitHubに自動投稿
5. **ログ管理**: 全実行履歴の記録・確認

### ✨ 特徴
- **24時間での高速開発**を実現
- **安全性重視**の承認システム
- **完全自動化**されたワークフロー
- **初心者でも簡単**に使える設計

### 📝 使い方
このガイドは上から順番にタブを進んでください:
1. **システム概要** (このタブ) - システムの全体像を理解
2. **プロンプト作成** - テスト用プロンプトの作成
3. **承認システム** - 作成したプロンプトの承認
4. **実行テスト** - システムの実行をシミュレーション
5. **GitHub連携** - GitHub Issue作成のテスト
6. **システム確認** - 全体の動作状況を最終確認

すべてのステップを完了すると、システムの基本的な使い方がマスターできます!
        """
    
    def init_database(self):
        """データベースを初期化"""
        try:
            # ディレクトリ作成
            os.makedirs(os.path.dirname(self.approval_db_path), exist_ok=True)
            
            # プロンプトDB作成
            conn = sqlite3.connect(self.db_path)
            cursor = conn.cursor()
            cursor.execute('''
                CREATE TABLE IF NOT EXISTS prompts (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    title TEXT NOT NULL,
                    content TEXT NOT NULL,
                    category TEXT DEFAULT 'general',
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                )
            ''')
            conn.commit()
            conn.close()
            
            # 承認DB作成
            conn = sqlite3.connect(self.approval_db_path)
            cursor = conn.cursor()
            cursor.execute('''
                CREATE TABLE IF NOT EXISTS approvals (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    prompt_id INTEGER,
                    approval_status TEXT,
                    reason TEXT,
                    approved_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                )
            ''')
            conn.commit()
            conn.close()
            
        except Exception as e:
            print(f"データベース初期化エラー: {e}")
    
    def create_test_prompt(self, title, content, category="テスト"):
        """テスト用プロンプトを作成"""
        try:
            if not title or not content:
                return "❌ タイトルと内容を入力してください"
            
            # データベース初期化
            if not os.path.exists(self.db_path):
                self.init_database()
            
            conn = sqlite3.connect(self.db_path)
            cursor = conn.cursor()
            
            # テーブル構造を確認してからインサート
            cursor.execute("PRAGMA table_info(prompts)")
            columns = [row[1] for row in cursor.fetchall()]
            
            # categoryカラムが存在するかチェック
            if 'category' in columns:
                # categoryカラムありの場合
                cursor.execute('''
                    INSERT INTO prompts (title, content, category, created_at)
                    VALUES (?, ?, ?, ?)
                ''', (title, content, category, datetime.now()))
            else:
                # categoryカラムなしの場合
                cursor.execute('''
                    INSERT INTO prompts (title, content, created_at)
                    VALUES (?, ?, ?)
                ''', (title, content, datetime.now()))
            
            prompt_id = cursor.lastrowid
            conn.commit()
            conn.close()
            
            success_msg = f"""
## ✅ プロンプト作成完了!

**プロンプトID**: {prompt_id}  
**タイトル**: {title}  
**カテゴリ**: {category}  
**内容**: {content[:100]}...

### 📝 次のステップ
「ステップ3: 承認システム」タブに進んで、作成したプロンプトを承認してください。
            """
            return success_msg
            
        except Exception as e:
            return f"❌ エラーが発生しました: {str(e)}"
    
    def get_pending_prompts(self):
        """承認待ちプロンプトを取得"""
        try:
            if not os.path.exists(self.db_path):
                return "📝 プロンプトデータベースが存在しません。まずステップ2でプロンプトを作成してください。"
            
            conn = sqlite3.connect(self.db_path)
            cursor = conn.cursor()
            cursor.execute('''
                SELECT id, title, content, created_at 
                FROM prompts 
                ORDER BY created_at DESC 
                LIMIT 5
            ''')
            results = cursor.fetchall()
            conn.close()
            
            if not results:
                return "📝 承認待ちのプロンプトはありません。ステップ2でプロンプトを作成してください。"
            
            pending_list = "## 📋 最新のプロンプト一覧\n\n"
            for row in results:
                pending_list += f"### プロンプト ID: {row[0]}\n"
                pending_list += f"**タイトル**: {row[1]}\n"
                pending_list += f"**内容**: {row[2][:100]}...\n"
                pending_list += f"**作成日時**: {row[3]}\n\n"
            
            pending_list += "### 📝 次のアクション\n下のフォームでプロンプトIDを入力して承認してください。"
            return pending_list
            
        except Exception as e:
            return f"❌ エラーが発生しました: {str(e)}"
    
    def approve_prompt(self, prompt_id, reason="初心者ガイドでのテスト承認"):
        """プロンプトを承認"""
        try:
            if not prompt_id or prompt_id <= 0:
                return "❌ 有効なプロンプトIDを入力してください"
            
            # 承認DB初期化
            if not os.path.exists(self.approval_db_path):
                self.init_database()
            
            conn = sqlite3.connect(self.approval_db_path)
            cursor = conn.cursor()
            
            # 承認記録挿入
            cursor.execute('''
                INSERT INTO approvals (prompt_id, approval_status, reason, approved_at)
                VALUES (?, ?, ?, ?)
            ''', (int(prompt_id), "approved", reason, datetime.now()))
            
            conn.commit()
            conn.close()
            
            return f"""
## ✅ 承認完了!

**プロンプトID**: {prompt_id}  
**ステータス**: approved  
**理由**: {reason}  
**承認日時**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}

### 🚀 次のステップ
「ステップ4: 実行テスト」タブに進んで、実行をシミュレートしてください。
            """
            
        except Exception as e:
            return f"❌ 承認処理でエラーが発生しました: {str(e)}"
    
    def simulate_execution(self):
        """実行をシミュレート"""
        try:
            execution_log = {
                "timestamp": datetime.now(),
                "status": "success",
                "message": "テスト実行が完了しました",
                "steps": [
                    "✅ プロンプト解析完了",
                    "✅ コード生成完了", 
                    "✅ 安全性チェック完了",
                    "✅ 実行完了"
                ]
            }
            
            result = f"""
## 🚀 実行結果

**実行時刻**: {execution_log['timestamp'].strftime('%Y-%m-%d %H:%M:%S')}  
**ステータス**: ✅ {execution_log['status']}  
**メッセージ**: {execution_log['message']}

### 📊 実行ログ
"""
            
            for step in execution_log['steps']:
                result += f"- {step}\n"
            
            result += """
### 🚀 次のステップ
「ステップ5: GitHub連携」タブに進んで、GitHub Issue作成をテストしてください。
            """
            
            return result
            
        except Exception as e:
            return f"❌ 実行シミュレーションでエラーが発生しました: {str(e)}"
    
    def simulate_github_issue(self):
        """GitHub Issue作成をシミュレート"""
        try:
            issue_data = {
                "title": "🚀 AI-Human協働開発システム テスト実行完了",
                "timestamp": datetime.now(),
                "body": f"""
## 📋 実行サマリー
- **実行日時**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
- **ステータス**: ✅ 成功
- **実行時間**: 0.5秒

## 🔧 実行内容
- プロンプト処理
- コード生成
- 安全性チェック
- 結果出力

## 📊 システム状態
- データベース: 正常
- API連携: 正常  
- ログシステム: 正常
                """,
                "labels": ["automation", "test", "ai-human-collaboration"]
            }
            
            result = f"""
## 🐙 GitHub Issue作成完了

**タイトル**: {issue_data['title']}  
**作成日時**: {issue_data['timestamp'].strftime('%Y-%m-%d %H:%M:%S')}

### 📝 Issue内容
{issue_data['body']}

**ラベル**: {', '.join(issue_data['labels'])}

### 🎉 次のステップ
「ステップ6: システム確認」タブに進んで、全体の状況を確認してください。

(実際のGitHub連携は環境設定次第で有効になります)
            """
            
            return result
            
        except Exception as e:
            return f"❌ GitHub連携シミュレーションでエラーが発生しました: {str(e)}"
    
    def check_system_status(self):
        """システム状態を確認"""
        try:
            status_report = f"""
## 🎯 システム全体状況レポート

### 📊 データベース状態
"""
            
            # プロンプトDB確認
            if os.path.exists(self.db_path):
                try:
                    conn = sqlite3.connect(self.db_path)
                    cursor = conn.cursor()
                    cursor.execute("SELECT COUNT(*) FROM prompts")
                    prompt_count = cursor.fetchone()[0]
                    status_report += f"- ✅ プロンプトDB: 正常 ({prompt_count}件のプロンプト)\n"
                    conn.close()
                except:
                    status_report += "- ❌ プロンプトDB: 接続エラー\n"
            else:
                status_report += "- ⚠️ プロンプトDB: ファイルが存在しません\n"
            
            # 承認DB確認
            if os.path.exists(self.approval_db_path):
                try:
                    conn = sqlite3.connect(self.approval_db_path)
                    cursor = conn.cursor()
                    cursor.execute("SELECT COUNT(*) FROM approvals")
                    approval_count = cursor.fetchone()[0]
                    status_report += f"- ✅ 承認DB: 正常 ({approval_count}件の承認記録)\n"
                    conn.close()
                except:
                    status_report += "- ❌ 承認DB: 接続エラー\n"
            else:
                status_report += "- ⚠️ 承認DB: ファイルが存在しません\n"
            
            status_report += f"""
### 🚀 システムステータス
- ✅ Webサーバー: 起動中 (ポート7860)
- ✅ Gradioインターフェース: 正常
- ✅ ファイルシステム: 正常
- ✅ 実行環境: Python {sys.version.split()[0]}

### 🎉 完了おめでとうございます!

AI-Human協働開発システムの基本的な流れをすべて体験しました!

#### 📋 体験した内容
1. ✅ システム概要の理解
2. ✅ プロンプトの作成
3. ✅ 承認プロセスの実行
4. ✅ 実行システムのテスト
5. ✅ GitHub連携のシミュレーション
6. ✅ システム状態の確認

#### 🚀 次のステップ
各機能の詳細は、メインの各タブで更に詳しく利用できます:
- **💾 プロンプト管理システム**: 本格的なプロンプト管理
- **🎯 統合承認システム**: 詳細な承認フロー
- **🤖 GitHub ISSUE自動化**: 実際のGitHub連携
- **🚀 統合管理ダッシュボード**: システム全体の監視

システムを実際に使用する際は、これらのタブを活用してください!
            """
            
            return status_report
            
        except Exception as e:
            return f"❌ システム状態確認でエラーが発生しました: {str(e)}"

# システムインスタンスを作成
guide_system = BeginnerGuideSystem()

def create_beginner_interface():
    """初心者向けGradioインターフェースを作成"""
    
    with gr.Blocks(title="🚀 初心者ガイド", theme=gr.themes.Soft()) as interface:
        gr.Markdown("# 🚀 AI-Human協働開発システム - 初心者ガイド")
        gr.Markdown("**上から順番に**各タブを進んでください。各ステップで「実行」ボタンを押すだけで体験できます!")
        
        with gr.Tab("📚 ステップ1: システム概要"):
            gr.Markdown(guide_system.get_system_overview())
        
        with gr.Tab("📝 ステップ2: プロンプト作成"):
            gr.Markdown("## 🎯 プロンプト作成のテスト")
            gr.Markdown("簡単なテストプロンプトを作成してみましょう。")
            
            with gr.Row():
                with gr.Column(scale=2):
                    title_input = gr.Textbox(
                        label="📝 プロンプトタイトル",
                        value="初回テストプロンプト",
                        placeholder="プロンプトのタイトルを入力"
                    )
                with gr.Column(scale=1):
                    category_input = gr.Textbox(
                        label="🏷️ カテゴリ",
                        value="テスト",
                        placeholder="カテゴリを入力"
                    )
            
            content_input = gr.Textbox(
                label="📄 プロンプト内容",
                value="Hello World を表示するシンプルなPythonスクリプトを作成してください。",
                placeholder="プロンプトの内容を入力",
                lines=3
            )
            
            create_btn = gr.Button("🚀 プロンプト作成実行", variant="primary", size="lg")
            create_result = gr.Markdown(value="👆 上のボタンを押してプロンプトを作成してください")
            
            create_btn.click(
                guide_system.create_test_prompt,
                inputs=[title_input, content_input, category_input],
                outputs=[create_result],
                api_name="create_test_prompt"
            )
        
        with gr.Tab("✅ ステップ3: 承認システム"):
            gr.Markdown("## 🎯 承認システムのテスト")
            gr.Markdown("作成したプロンプトの承認プロセスをテストします。")
            
            check_btn = gr.Button("📋 承認待ちプロンプト確認", variant="secondary", size="lg")
            pending_result = gr.Markdown(value="👆 上のボタンを押して承認待ちプロンプトを確認してください")
            
            check_btn.click(guide_system.get_pending_prompts, outputs=[pending_result], api_name="get_pending_prompts")
            
            gr.Markdown("### 承認実行")
            with gr.Row():
                with gr.Column(scale=1):
                    prompt_id_input = gr.Number(
                        label="🆔 プロンプトID",
                        value=1,
                        precision=0,
                        minimum=1
                    )
                with gr.Column(scale=2):
                    approval_reason = gr.Textbox(
                        label="📝 承認理由",
                        value="初心者ガイドでのテスト承認",
                        placeholder="承認理由を入力"
                    )
            
            approve_btn = gr.Button("✅ 承認実行", variant="primary", size="lg")
            approval_result = gr.Markdown(value="👆 プロンプトIDを確認して承認ボタンを押してください")
            
            approve_btn.click(
                guide_system.approve_prompt,
                inputs=[prompt_id_input, approval_reason],
                outputs=[approval_result],
                api_name="approve_prompt"
            )
        
        with gr.Tab("⚡ ステップ4: 実行テスト"):
            gr.Markdown("## 🎯 実行システムのテスト")
            gr.Markdown("承認されたプロンプトの実行をシミュレートします。")
            
            execute_btn = gr.Button("🚀 実行シミュレーション", variant="primary", size="lg")
            execution_result = gr.Markdown(value="👆 上のボタンを押して実行をシミュレートしてください")
            
            execute_btn.click(guide_system.simulate_execution, outputs=[execution_result], api_name="simulate_execution")
        
        with gr.Tab("🐙 ステップ5: GitHub連携"):
            gr.Markdown("## 🎯 GitHub連携のテスト")
            gr.Markdown("実行結果をGitHub Issueとして作成するプロセスをシミュレートします。")
            
            github_btn = gr.Button("🐙 GitHub Issue作成シミュレーション", variant="primary", size="lg")
            github_result = gr.Markdown(value="👆 上のボタンを押してGitHub連携をテストしてください")
            
            github_btn.click(guide_system.simulate_github_issue, outputs=[github_result], api_name="simulate_github_issue")
        
        with gr.Tab("🎯 ステップ6: システム確認"):
            gr.Markdown("## 🎯 システム全体の状態確認")
            gr.Markdown("最後に、システム全体の動作状況を確認します。")
            
            status_btn = gr.Button("📊 システム状態確認", variant="primary", size="lg")
            status_result = gr.Markdown(value="👆 上のボタンを押してシステム全体の状態を確認してください")
            
            status_btn.click(guide_system.check_system_status, outputs=[status_result], api_name="check_system_status")
    
    return interface

# Gradioインターフェースのエクスポート
gradio_interface = create_beginner_interface()
interface_title = "🚀 初心者ガイド"

if __name__ == "__main__":
    gradio_interface.launch(
        server_name="0.0.0.0",
        server_port=7862,
        share=False
    )