import { Component } from '@angular/core';
import { IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/angular/standalone';
import { ExploreContainerComponent } from '../explore-container/explore-container.component';
import { extactAndParseJsonFromString } from 'src/agent/agent.json';
import { TaskInqueryUserStory } from 'src/agent/tasks/inquiry/1.inquiry-user-story';
import { TaskInqueryDoctorQuestion } from 'src/agent/tasks/inquiry/2.inquiry-doctor-question';
import { TaskInqueryUserAnswer } from 'src/agent/tasks/inquiry/3.inquiry-user-answer';
import { TaskExecutor } from 'src/agent/agent.start';
import { AgentTaskStep } from 'src/agent/agent.task';
import { IonButton, IonIcon, ModalController } from '@ionic/angular/standalone';
import { TaskPoemPictureDesc } from 'src/agent/tasks/poem/poem-desc';
import { TaskPoemPictureCreate } from 'src/agent/tasks/poem/poem-picture';
import { CommonModule, DecimalPipe } from '@angular/common';
import { addIcons } from 'ionicons';
import { radioButtonOffOutline, reloadOutline, checkmarkCircleOutline, closeCircleOutline } from 'ionicons/icons';
import { IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonItem, IonList, IonThumbnail } from '@ionic/angular/standalone';
import { CloudObject, CloudQuery, CloudUser } from 'src/lib/ncloud';
import { openUserLoginModal } from 'src/lib/user/modal-user-login/modal-user-login.component';
import { ChatPanelOptions, FmodeChat, FmodeChatMessage, openChatPanelModal } from 'fmode-ng';

addIcons({radioButtonOffOutline, reloadOutline, checkmarkCircleOutline, closeCircleOutline}) 
@Component({
  selector: 'app-tab2',
  templateUrl: 'tab2.page.html',
  styleUrls: ['tab2.page.scss'],
  standalone: true,
  imports: [IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent, IonButton, IonIcon, DecimalPipe,
    CommonModule, IonCard, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCardContent, IonList, IonItem, IonThumbnail
  ]
})
export class Tab2Page {

  constructor(private modalCtrl:ModalController) {


  }

  // taskList:AgentTaskStep[] = []

  // wait(duration:number=1000){
  //   return new Promise(resolve=>{
  //     setTimeout(() => {
  //         resolve(true)
  //     }, duration);
  //   })
  // }

  // shareData:any = {}

  // // 任务：完成故事意境描述及图像绘制
  // doPoemTask(){
  //   // 产生： shareData.PictureDescResult 生成后描述
  //   let task1 = TaskPoemPictureDesc({shareData:this.shareData,modalCtrl:this.modalCtrl});
  //   // 产生： shareData.images 渲染后图片
  //   let task2 = TaskPoemPictureCreate({shareData:this.shareData,modalCtrl:this.modalCtrl});
    
  //   // 定义任务集
  //   let PoemTaskList = [task1,task2]
  //   // 传递给显示组件
  //   this.taskList = PoemTaskList
  //   // 开始执行任务
  //   TaskExecutor(PoemTaskList)
  // }


  // testJSON(){
  //   let string = `
  //         ''''json
  //             {
  //                 "keshi": "神经内科",
  //                 "sympList": [
  //                     {
  //                         "title": "偏头痛",
  //                         "desc": "持续了2天的偏头疼",
  //                         "duration": "2天"
  //                     },
  //                     {
  //                         "title": "发冷",
  //                         "desc": "感觉发冷，已经有一天",
  //                         "duration": "1天"
  //                     }
  //                 ]
  //             }
  //             ''''
  //     `
  //     console.log(extactAndParseJsonFromString(string))
  // }
  // // 任务集：医疗问诊任务集 完成一次完整的门诊服务
  // doInqueryTask(){
  //   let task1 = TaskInqueryUserStory({shareData:this.shareData,modalCtrl:this.modalCtrl});
  //   let task2 = TaskInqueryDoctorQuestion({shareData:this.shareData,modalCtrl:this.modalCtrl});
  //   let task3 = TaskInqueryUserAnswer({shareData:this.shareData,modalCtrl:this.modalCtrl});

  //   // 定义任务集
  //   let InquireServiceTaskList = [
  //     task1,task2,task3
  //   ]
  //   // 传递给显示组件
  //   this.taskList = InquireServiceTaskList
  //   // 开始执行任务
  //   TaskExecutor(InquireServiceTaskList)
  // }

  ngOnInit() {
    // 生命周期：页面加载后，运行医生列表加载函数
    this.loadExpectList()
  }

  // 创建用于数据列表存储的属性
  expectList:Array<CloudObject> = []
  // 查询并加载医生列表的函数
  async loadExpectList(){
    let query = new CloudQuery("Expect");
    this.expectList = await query.find()
  }


     /** 示例：问诊根据expect拼接提示词 */
     async openInquiry(expect:any){
      // 验证用户登录
      let currentUser = new CloudUser();
      let userPrompt = ``
      if(!currentUser?.id){
        console.log("用户未登录，请登录后重试");
        let user = await openUserLoginModal(this.modalCtrl);
        if(!user?.id){
          return
        }
        currentUser = user;
      }

      console.log(expect.get('depart'))
      
      if(currentUser?.get("realname")){
        userPrompt += `当前来访的患者，姓名：${currentUser?.get("realname")}`
      }
      if(currentUser?.get("gender")){
        userPrompt += `，性别：${currentUser?.get("gender")}`
      }
      if(currentUser?.get("age")){
        userPrompt += `，年龄：${currentUser?.get("age")}`
      }
  
  
      localStorage.setItem("company","E4KpGvTEto")
  
      let consult = new CloudObject("Consultation")
      let now = new Date();
      let dateStr = `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`
      // 对象权限的精确指定
      let ACL:any = {
        "*":{read:false,write:false}
      }
      if(currentUser?.id){
        ACL[currentUser?.id] = {read:true,write:true}
      }
      consult.set({
        title:`${expect.get('depart')?.name || ""}门诊记录${dateStr}-${expect?.get("name")}`,
        expect:expect.toPointer(),
        depart:{
          __type:"Pointer",
          className:"Department",
          objectId:expect.get("depart")?.objectId
        },
        user:currentUser.toPointer(),
        ACL:ACL
      })
  
      let options:ChatPanelOptions = {
        roleId:"2DXJkRsjXK",
        onChatInit:(chat:FmodeChat)=>{
          console.log("onChatInit");
                console.log("预设角色",chat.role);
                chat.role.set("name",expect?.get("name"));
                chat.role.set("title",expect?.get("title"));
                chat.role.set("desc",expect?.get("desc"));
                chat.role.set("tags",expect?.get("qualifications"));
                chat.role.set("avatar",expect?.get("avatar") || "../../assets/image/doctor7.png")
                chat.role.set("prompt",`
  # 角色设定
  您是${expect?.get("name")}，是一位${expect?.get("specialist")}医生，${expect?.get("desc")}，年龄${expect?.get("age")}岁，需要完成有关本科室的门诊服务，无关科室的症状描述请委婉结束聊天并推荐患者去对应的科室。
  
  # 对话环节
  0.导诊（根据用户基本情况，引导挂号合适的科室）
  1.预设的问询方式（根据不同症状来问询具体的情况）
  - 打招呼，以用户自述为主
  - 当信息充足时候，确认用户症状对应的科室，并进入下一个环节
  2.拓展的问询细节
  例如：用户反映呼吸不畅，拓展出：是否咳嗽；是否感觉痛或者痒等其他需要的问题。
  - 当问询细节补充完成后进入下一个环节
  3.初步的诊断结果，并且同时列出检查检验项目
  初步诊断：确定需要有哪些进一步检查
  检查检验：获取医学客观数据
  - 等待用户提交客观数据，进入下一阶段
  4.给出诊断方案并给出处方
  - 完成处方时，请在消息结尾附带: [处方完成]
  
  # 开始话语
  当您准备好了，可以以一个医生的身份，先向来访的用户亲切地打招呼。
  ${userPrompt}
  `);
        },
        onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
          console.log("onMessage",message)
          let content:any = message?.content
          if(typeof content == "string"){
            if(content?.indexOf("[处方完成]")>-1){
              console.log("门诊已完成")
              consult.set({
                content:content // 处方内容
              })
              consult.save();
            }
          }
        },
        onChatSaved:(chat:FmodeChat)=>{
          // chat?.chatSession?.id 本次会话的 chatId
          console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
        }
      }
      openChatPanelModal(this.modalCtrl,options)
    }
  }
  
