import { Component } from '@angular/core';
import { CloudSeMealPlan } from 'src/lib/cloudplans'; // 引入封装好的 CloudSeMealPlan 类
import { FmodeChatCompletion, MarkdownPreviewModule } from 'fmode-ng';
import { CloudSeUser } from 'src/lib/cloudSeuser'; // 引入 CloudSeUser 类

import { AlertController, IonButton, IonContent, IonHeader, IonInput, IonSelect, IonSelectOption, IonTextarea, IonTitle, IonToolbar, ModalController } from '@ionic/angular/standalone';
import { CloudUser } from 'src/lib/ncloud';
import { openUserLoginModal } from '../modal-user-login/modal-user-login.component';
import { PageEditComponent } from '../page-edit/page-edit.component';
@Component({
selector: 'app-tab2',
templateUrl: 'tab2.page.html',
styleUrls: ['tab2.page.scss'],
standalone: true,
imports: [
IonContent, IonHeader, IonTitle, IonToolbar,
IonButton,IonTextarea,IonInput,IonSelectOption,IonSelect,
MarkdownPreviewModule,
],
})
export class Tab2Page {

constructor(private modalCtrl: ModalController, private alertCtrl: AlertController) {
  this.currentUser=new CloudUser();
}

ngOnInit() {
this.loadUserData();
this.setNextDay();
}

planningDays: string = "";
userPrompt: string = "";
currentDate = new Date();
dateOnlyString: string = '';
currentUser:CloudUser|undefined
// 用户信息
age: number | null = null;
gender: string = '';
height: number | null = null;
weight: number | null = null;
activityLevel: string = '';
dietPreference: string = '';
dietGroup: string = '';
avatar: string | null = null;
allergies: string = '';
xinxi:boolean = true;

responseMsg: string = "";
responseMsg0: string = "";
responseMsg1: string = "";
isComplete: boolean = false;
isNew: boolean = false;

async loadUserData() {
const cloudSeUser = new CloudSeUser();
const currentUserInfo = await cloudSeUser.getCurrentUserInfo();

if (currentUserInfo) {
  this.age = currentUserInfo.get('age') || null;
  this.gender = currentUserInfo.get('gender') || '';
  this.height = currentUserInfo.get('height') || null;
  this.weight = currentUserInfo.get('weight') || null;
  this.activityLevel = currentUserInfo.get('activityLevel') || '';
  this.dietPreference = currentUserInfo.get('dietPreference') || '';
  this.dietGroup = currentUserInfo.get('dietGroup') || '';
  this.allergies = currentUserInfo.get('allergies') || '';
} else {
  console.error("未能加载当前用户信息");
  this.xinxi=false
 
}
}

setNextDay() {
const nextDay = new Date(this.currentDate);
nextDay.setDate(this.currentDate.getDate() + 1);
this.dateOnlyString = nextDay.toISOString().split('T')[0];
}

planningDaysInput(ev: any) {
this.planningDays = ev.detail.value;
}

promptInput(ev: any) {
this.userPrompt = ev.detail.value;
}

async sendMessage() {
  if(this.xinxi){
    console.log("create");

this.responseMsg = "";
this.responseMsg0="";
this.isComplete = false;

let newPrompt;
if(this.responseMsg1==""){
  newPrompt = `
  你是一名专业的饮食营养规划师，拥有丰富的营养学背景和实践经验。你的工作是为不同需求的人群提供个性化的饮食规划，帮助他们实现健康目标，如减肥、增肌、健康维护或疾病管理。
  你需要根据用户的用户信息和需求为客户设计量身定制具体的饮食方案。
  当前用户的饮食需求是：${this.userPrompt}，
  现在告诉你用户描述：该用户是一个年龄为${this.age}岁，身高和体重分别为${this.height}cm，${this.weight}kg的${this.gender}性。
  他的活动水平${this.activityLevel}，饮食偏好${this.dietPreference}，并且他的过敏信息为${this.allergies}。
  重点是他希望作为一位${this.dietGroup}群体的人，希望你为他或她规划以为${this.dateOnlyString}开始${this.planningDays}天的详细的饮食规划（食物内容以日常生活常见食物为主,每次规划尽量不同，要多样化）。
  生成的结果不需要再复述用户的信息，直接以形式输出格式为（day（date类型）、breakfast（string类型）、lunch（string类型）、dinner（string类型）、notes（string类型）、No（number类型，第几天））结构化JSON格式输出
  （结果不需要用\`\`\`json和\`\`\`将结果包裹，当日期信息同时存在12-31和01-01时,01-01的年份比12-31的年份加1.当天数大于一时，用[]括起多天的规划、并且之间用,隔开）
  `;
}else{
  newPrompt = `
  你是一名专业的饮食营养规划师，拥有丰富的营养学背景和实践经验。你的工作是为不同需求的人群提供个性化的饮食规划，帮助他们实现健康目标，如减肥、增肌、健康维护或疾病管理。
  你需要根据用户的用户信息和需求为客户设计量身定制具体的饮食方案。
  现在告诉你用户描述：该用户是一个年龄为${this.age}岁，身高和体重分别为${this.height}cm，${this.weight}kg的${this.gender}性。
  他的活动水平${this.activityLevel}，饮食偏好${this.dietPreference}，并且他的过敏信息为${this.allergies}。
  重点是他希望作为一位${this.dietGroup}群体的人，希望你为他或她规划以为${this.dateOnlyString}开始${this.planningDays}天的详细的饮食规划（食物内容以日常生活常见食物为主）。
  你可以在该${this.responseMsg1}饮食规划的基础上，再根据该需求${this.userPrompt}，生成新的饮食规划，以下格式不变。
  生成的结果不需要再复述用户的信息，直接以形式输出格式为（day（date类型，日期）、breakfast（string类型）、lunch（string类型）、dinner（string类型）、notes（string类型）、No（number类型，第几天））结构化JSON格式输出
  （结果不需要用\`\`\`json和\`\`\`将结果包裹.当日期信息同时存在12-31和01-01时,01-01的年份比12-31的年份加1.当天数大于一时，用[]括起多天的规划、并且之间用,隔开）
  `;

}


let completion = new FmodeChatCompletion([
  { role: "system", content: "" },
  { role: "user", content: newPrompt }
]);

completion.sendCompletion().subscribe((message: any) => {
  console.log(message.content);
  this.responseMsg = message.content;

  if (message?.complete) {
    this.isComplete = true;
    this.isNew = true;
    this.responseMsg0=this.responseMsg;
    this.responseMsg1=this.responseMsg;
    // 1. 替换字段名
    this.responseMsg0 = this.responseMsg0
    .replace(/\bday\b/g, '日期')
    .replace(/\bbreakfast\b/g, '早餐')
    .replace(/\blunch\b/g, '午餐')
    .replace(/\bdinner\b/g, '晚餐')
    .replace(/\bnotes\b/g, '注意事项');

    // 2. 将 " 后面的 , 替换为换行
    this.responseMsg0 = this.responseMsg0.replace(/",/g, '<br>');

    // 3. 将 } 后面的 , 替换为换行
    this.responseMsg0 = this.responseMsg0.replace(/},/g, '<br>-------------------<br>');

    // 4. 删除多余的空格（包括首尾空格和中间多余的空格）
    this.responseMsg0 = this.responseMsg0.replace(/\s+/g, ' ').trim();

    // 5. 删除所有的双引号、方括号、花括号
    this.responseMsg0 = this.responseMsg0
    .replace(/["\[\]{}]/g, ''); // 删除双引号、方括号、花括号

  }
});
  }else{
     // 弹出提醒用户填写个人信息的弹窗
  const alert = await this.alertCtrl.create({
    header: '信息缺失',
    message: '未能加载您的个人信息，请先填写个人信息。',
    buttons: [
      {
        text: '确定',
        handler: async () => {
          const modal = await this.modalCtrl.create({
            component: PageEditComponent,  // 这里是你要弹出的弹窗组件
            cssClass: 'my-custom-class',  // 可选：自定义样式
          });

          // 显示模态框
          await modal.present();  
        }
      }
    ]
  });
  await alert.present();
  }

}

// 保存饮食规划到数据库
async saveMealPlan() {
const cloudSeMealPlan = new CloudSeMealPlan();

try {
  // 清理 responseMsg，并处理数据结构
  const processedMealPlan = JSON.parse(this.responseMsg).map((plan: any) => {
    return {
      day: plan.day,
      breakfast: plan.breakfast,
      lunch: plan.lunch,
      dinner: plan.dinner,
      notes: plan.notes,
      No: Number(plan.No)
    };
  });

  // 将处理后的每一天的饮食规划保存到数据库
  for (let meal of processedMealPlan) {
    const savedMealPlan = await cloudSeMealPlan.saveMealPlan(meal);
    if (savedMealPlan) {
      console.log('饮食规划保存成功:', savedMealPlan);
    } else {
      console.error('饮食规划保存失败');
      // console.log(this.responseMsg)
    }
  }


  // 显示保存成功的弹窗
  const alert = await this.alertCtrl.create({
    header: '成功',
    message: '饮食规划已成功导出！',
    buttons: ['确定']
  });
  await alert.present();

} catch (error) {
  console.error('保存饮食规划时发生错误:', error);
}
}

async exportMealPlan() {
  if (this.isComplete) {
    try {
      const cloudSeMealPlan = new CloudSeMealPlan();
      const cloudUser = new CloudUser();
      const cloudSeUser = new CloudSeUser();

      const currentUser = await cloudUser.current();
      if (!currentUser) {
        console.error("用户未登录");
        return;
      }

      // 获取当前用户的计划天数
      const currentUserInfo = await cloudSeUser.getCurrentUserInfo();
      const planDaysFromUserInfo = currentUserInfo?.get('planDays');

      // 如果 planDays 存在且不为空，则删除旧的饮食规划
      if (planDaysFromUserInfo && planDaysFromUserInfo > 0) {
        console.log(`计划天数为 ${planDaysFromUserInfo}，删除旧的饮食规划`);
        // 直接使用 currentUser 对象，而不需要单独声明 currentUserId
        
        // 根据 planDays 执行循环删除操作
        for (let i = 0; i < planDaysFromUserInfo; i++) {
          const existingMealPlan = await cloudSeMealPlan.getCurrentUserMealPlan();
          if (existingMealPlan && existingMealPlan.id) {
            await cloudSeMealPlan.deleteMealPlan(existingMealPlan.id);
            console.log('已删除一条旧的饮食规划');
          }
        }
      }else{
        console.error('无旧的饮食规划，无法删除');
      }

      // 处理新的饮食规划
      const processedMealPlan = JSON.parse(this.responseMsg).map((plan: any) => {
        return {
          day: plan.day,
          breakfast: plan.breakfast,
          lunch: plan.lunch,
          dinner: plan.dinner,
          notes: plan.notes,
          No: Number(plan.No)
        };
      });

      // 标志位，表示饮食规划是否成功保存
      let mealPlansSavedSuccessfully = true;

      // 保存新的饮食规划
      for (let meal of processedMealPlan) {
        const savedMealPlan = await cloudSeMealPlan.saveMealPlan(meal);
        if (savedMealPlan) {
          console.log('饮食规划已成功导出并保存');
        } else {
          console.error('导出饮食规划失败');
          mealPlansSavedSuccessfully = false;
          break;
        }
      }

      // 如果饮食规划保存失败，跳过更新 planDays
      if (!mealPlansSavedSuccessfully) {
        console.error("饮食规划保存失败，规划天数不会更新");
        return;
      }

      // 更新用户的 planDays 字段
      const planDaysNumber = parseInt(this.planningDays, 10);
      if (isNaN(planDaysNumber)) {
        console.error("规划天数无效，无法保存");
        return;
      }

      const updatedUser = await cloudSeUser.updateUserInfo({ planDays: planDaysNumber });
      if (updatedUser) {
        console.log('用户的计划天数已更新');
      } else {
        console.error('更新用户计划天数失败');
      }

      // 显示成功导出的弹窗
      const alert = await this.alertCtrl.create({
        header: '成功',
        message: '饮食规划已成功导出并保存！',
        buttons: ['确定']
      });
      await alert.present();



    } catch (error) {
      console.error('导出饮食规划时发生错误:', error);
    }
  } else {
    console.error('饮食规划尚未生成，无法导出');
  }
}

async login(){
  // 弹出登录窗口
  let user = await openUserLoginModal(this.modalCtrl);
  if(user?.id){
    this.currentUser = user
    await this.loadUserData();// 登录后加载用户信息
  }
}

}