import * as vscode from 'vscode';

import {
  executeModelConfirmation,
  executeListModels,
  executeChatWithProgram,
  executeCreateCode,
  executeCreateComment,
  executeCodeReview
} from './commands';
import { getModel,initializeOpenAI } from './commands/tools';


export function activate(context: vscode.ExtensionContext) {
  // Initialization code...
  initializeOpenAI();

  const treeDataProvider = new AIAssistantMenuProvider();
  context.subscriptions.push(
    vscode.window.registerTreeDataProvider('aiAssistantMenu', treeDataProvider)
  );

    // モデル名の選択コマンドを登録  
  context.subscriptions.push(
    vscode.commands.registerCommand('extension.executeListModels', async () => {
      await executeListModels(context); // await で 終了待ちを追加

      // カスタムロジックでモデル名を取得（この部分は実際の機能に応じて適宜変更）
      const modelName = getModel();
      
      // モデル名を更新してTreeViewを再描画
      if ( modelName ){
        treeDataProvider.updateModelName(modelName);
      }
    })
  );  

  // 他のコマンドも登録...
  context.subscriptions.push(
    vscode.commands.registerCommand('extension.executeModelConfirmation', () => executeModelConfirmation(context)),
    vscode.commands.registerCommand('extension.executeChatWithProgram', () => executeChatWithProgram(context)),
    vscode.commands.registerCommand('extension.executeCreateCode', () => executeCreateCode(context)),    
    vscode.commands.registerCommand('extension.executeCreateComment', () => executeCreateComment(context)),
    vscode.commands.registerCommand('extension.executeCodeReview', () => executeCodeReview(context))
  );

}

// Modify your TreeDataProvider class to handle model name updates
class AIAssistantMenuProvider implements vscode.TreeDataProvider<string> {
  private model: string = "未選択"; // 初期状態としてモデル名を設定
  private onDidChangeTreeDataEmitter = new vscode.EventEmitter<void>();
  readonly onDidChangeTreeData = this.onDidChangeTreeDataEmitter.event;

  
  // モデル名を動的に変更するメソッド
  public updateModelName(newModelName: string) {
    if (this.model !== newModelName) {
      this.model = newModelName;
      this.onDidChangeTreeDataEmitter.fire();
    }
  }

  getTreeItem(element: string): vscode.TreeItem {
    let label = element;

    // モデル名に応じて表示名を更新
    if (element === '利用確認（モデル未選択）') {
      label = `利用確認（${this.model}）`;
    }

    return {
      label: label,
      command: {
        command:
          element === '利用確認（' + this.model + '）'
            ? 'extension.executeModelConfirmation'
            : element === 'モデル一覧表示・選択'
             ? 'extension.executeListModels'
             : element === 'チャット（プログラム）'
             ? 'extension.executeChatWithProgram'
            : element === 'プログラム作成'
            ? 'extension.executeCreateCode'                
            : element === 'コメント作成'
            ? 'extension.executeCreateComment'
            : 'extension.executeCodeReview',
        title: 'AIAssistant'
      }
    };
  }

  getChildren(): Thenable<string[]> {
    return Promise.resolve([
      `利用確認（${this.model}）`,
      'モデル一覧表示・選択',
      'チャット（プログラム）',
      "プログラム作成",
      'コメント作成',
      'コードレビュー'
    ]);
  }

}
export function deactivate() {}