<script setup>
import { onMounted, ref, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { useVbenModal } from '@vben/common-ui';
import { Button, Modal, message } from 'ant-design-vue';
import ChatArea from '#/views/business/chat/components/ChatArea.vue';
import ConnectionStatus from '#/views/business/chat/components/ConnectionStatus.vue';
import EmptyState from '#/views/business/chat/components/EmptyState.vue';
import PrescriptionModal from '#/views/business/chat/components/PrescriptionModal.vue';
import { useChatStore } from '#/views/business/chat/stores/chat.ts';
import { useUserStore } from '#/views/business/chat/stores/user';
import { usePrescriptionStore } from '#/store/prescription';
import PatientList from './components/PatientList.vue';
import PatientInfoPanel from './components/PatientInfoPanel.vue';
import { endConsultation } from './api/index.ts';
import { getProductListDoctorReception } from '#/views/doctor/doctor-reception/api';

const route = useRoute();
const router = useRouter();
const chatStore = useChatStore();
const userStore = useUserStore();
const prescriptionStore = usePrescriptionStore();

// 使用 VbenModal 管理处方模态框
const [PrescriptionModalComponent, prescriptionModalApi] = useVbenModal({
  connectedComponent: PrescriptionModal,
});

// 当前患者信息
const currentPatient = ref(null);
const registerId = ref(null);

// 左侧列表显示状态
const leftShow = ref(true);

// 当前选中的患者
const selectedPatient = ref(null);

// PatientList 组件的 ref
const patientListRef = ref(null);

// 视图模式：'list' = 列表模式（显示患者列表和信息），'chat' = 聊天模式（显示聊天界面）
const viewMode = ref('list');

// 获取左侧列表显示状态
function getLeftShow() {
  const localStorageLeftShow = localStorage.getItem('onlineConsultationClinicLeftShow');
  leftShow.value = localStorageLeftShow !== 'false';
}
getLeftShow();

// 监听leftShow存入缓存
watch(
  () => leftShow.value,
  (enable) => {
    localStorage.setItem('onlineConsultationClinicLeftShow', enable);
  },
  { immediate: true }
);

// 从路由参数获取registerId
onMounted(() => {
  const id = route.params.id || route.query.registerId;
  if (id) {
    registerId.value = id;
    // 初始化处方store，但不获取患者信息（避免调用错误的API）
    prescriptionStore.initializePrescription(id, false, 'onlineConsultationClinic-');
  }
});

// 监听当前好友变化，更新患者信息
watch(
  () => chatStore.currentFriend,
  (friend) => {
    if (friend) {
      currentPatient.value = friend;
      // 更新registerId
      if (friend.registerId) {
        registerId.value = friend.registerId;
        // 初始化处方数据，但不获取患者信息（避免调用错误的API）
        prescriptionStore.initializePrescription(friend.registerId, false, 'onlineConsultationClinic-');
      }
    }
  },
  { immediate: true }
);

// 显示开方模块
const openPrescriptionModule = (id) => {
  const targetRegisterId = id || registerId.value;
  if (!targetRegisterId) {
    console.error('registerId不能为空');
    return;
  }

  prescriptionModalApi.setData({
    registerId: targetRegisterId,
    onPrescriptionSent: handlePrescriptionSent,
    storagePrefix: 'onlineConsultationClinic-',
  });
  prescriptionModalApi.open();
};

// 处理处方发送完成事件
const handlePrescriptionSent = () => {
  // 可以在这里添加其他逻辑，如刷新聊天记录等
};

// 处理转诊导入成功
const handleTransferImportSuccess = (prescriptionData) => {
  // 打开处方模态框
  openPrescriptionModule(registerId.value);
};

// 处理选择患者
const handleSelectPatient = (patient) => {
  selectedPatient.value = patient;

  // 如果是已接诊的患者（status=2），直接进入聊天模式；否则显示患者信息
  if (patient.status === 2) {
    viewMode.value = 'chat';
  } else {
    viewMode.value = 'list';
  }

  // 设置当前好友，以便聊天功能正常工作
  if (patient && patient.room_id) {
    // 设置聊天好友信息
    const friendInfo = {
      id: patient.user_id || patient.user?.id,
      room_id: patient.room_id,
      register_id: patient.register_id,
      nick_name: patient.user_patient?.name || patient.user?.nick_name || '患者',
      avatar: patient.user?.avatar || '',
      un_read_count: 0,
    };
    chatStore.setCurrentFriend(friendInfo);
    // 切换到该好友并加载消息（如果已接诊）
    if (friendInfo.room_id && userStore.currentUser?.doctor_id && patient.status === 2) {
      chatStore.switchFriend(friendInfo, userStore.currentUser.doctor_id);
    }
    // 更新registerId
    if (patient.register_id) {
      registerId.value = patient.register_id;
      // 初始化处方数据，但不获取患者信息（避免调用错误的API）
      prescriptionStore.initializePrescription(patient.register_id, false, 'onlineConsultationClinic-');
    }
  }
};

// 处理进入聊天
const handleEnterChat = (patient) => {
  // 切换到聊天模式
  viewMode.value = 'chat';

  // 设置当前好友，以便聊天功能正常工作
  if (patient && patient.room_id) {
    // 设置聊天好友信息（参考handleSelectPatient的逻辑）
    const friendInfo = {
      id: patient.user_id || patient.user?.id,
      room_id: patient.room_id,
      register_id: patient.register_id,
      nick_name: patient.user_patient?.name || patient.user?.nick_name || '患者',
      avatar: patient.user?.avatar || '',
      un_read_count: 0,
    };
    chatStore.setCurrentFriend(friendInfo);
    // 切换到该好友并加载消息
    if (friendInfo.room_id && userStore.currentUser?.id) {
      chatStore.switchFriend(friendInfo, userStore.currentUser.id);
    }
    // 更新registerId
    if (patient.register_id) {
      registerId.value = patient.register_id;
      // 初始化处方数据，但不获取患者信息（避免调用错误的API）
      prescriptionStore.initializePrescription(patient.register_id, false, 'onlineConsultationClinic-');
    }
  }
};

// 处理接诊成功
const handleReceptionSuccess = (patient) => {
  // 更新 selectedPatient
  selectedPatient.value = {
    ...selectedPatient.value,
    ...patient,
    status: 2, // 接诊中
  };

  // 接诊成功后，切换到聊天模式
  viewMode.value = 'chat';

  // 确保 room_id 存在
  if (!patient.room_id && selectedPatient.value?.room_id) {
    patient.room_id = selectedPatient.value.room_id;
  }

  // 设置当前好友，以便聊天功能正常工作
  if (patient && patient.room_id) {
    // 设置聊天好友信息（参考handleSelectPatient的逻辑）
    const friendInfo = {
      id: patient.user_id || patient.user?.id,
      room_id: patient.room_id,
      register_id: patient.register_id,
      nick_name: patient.user_patient?.name || patient.user?.nick_name || '患者',
      avatar: patient.user?.avatar || '',
      un_read_count: 0,
    };
    chatStore.setCurrentFriend(friendInfo);
    // 切换到该好友并加载消息
    if (friendInfo.room_id && userStore.currentUser?.doctor_id) {
      chatStore.switchFriend(friendInfo, userStore.currentUser.doctor_id);
    }
  }

  // 更新registerId
  if (patient.register_id) {
    registerId.value = patient.register_id;
    // 初始化处方数据，但不获取患者信息（避免调用错误的API）
    prescriptionStore.initializePrescription(patient.register_id, false, 'onlineConsultationClinic-');
  }
};

// 处理刷新列表
const handleRefreshList = () => {
  // 刷新患者列表
  patientListRef.value?.fetchPatientList();
};

// 结束接诊
const handleEndConsultation = () => {
  if (!selectedPatient.value) {
    message.warning('请先选择患者');
    return;
  }

  if (!selectedPatient.value.register_id) {
    message.warning('患者信息不完整，无法结束接诊');
    return;
  }

  const patientName = selectedPatient.value.user_patient?.name ||
                      selectedPatient.value.user?.nick_name ||
                      '患者';

  Modal.confirm({
    title: '确认结束接诊',
    content: `确定要结束${patientName}的复诊吗？`,
    okText: '确定',
    cancelText: '取消',
    onOk: async () => {
      try {
        await endConsultation({
          register_id: selectedPatient.value.register_id,
          doctor_id: userStore.currentUser?.doctor_id || '39',
          reason: '医生主动结束'
        });

        // res 已经是 result 内容，无需判断 code
        message.success('结束接诊成功');

        // 清空选中的患者
        selectedPatient.value = null;

        // 切换到列表模式
        viewMode.value = 'list';

        // 刷新患者列表
        patientListRef.value?.fetchPatientList();
      } catch (error) {
        console.error('结束接诊失败:', error);
        message.error('结束接诊失败，请重试');
      }
    }
  });
};

// 处理结束接诊成功事件（从 ChatArea 传递过来）
const handleEndConsultationSuccess = () => {
  // 清空选中的患者
  selectedPatient.value = null;
  // 切换到列表模式
  viewMode.value = 'list';
  // 刷新患者列表
  patientListRef.value?.fetchPatientList();
};

// 将患者购买的药品加入处方单
const handleAddPatientProductsToPrescription = async () => {
  // 检查处方store是否已初始化
  if (!prescriptionStore.currentRegisterId) {
    message.warning('请先接诊患者');
    return;
  }

  // 从聊天记录中筛选出所有 message_type=11 的消息（患者就诊经历）
  const productMessages = chatStore.messages.filter(
    (msg) => msg.message_type === 11
  );

  if (productMessages.length === 0) {
    message.warning('当前聊天没有可添加的药品');
    return;
  }

  // 获取诊所ID
  let storeId = prescriptionStore.myStoreId;
  if (!storeId || storeId === 0) {
    if (prescriptionStore.myStoreList && prescriptionStore.myStoreList.length > 0) {
      storeId = prescriptionStore.myStoreList[0].id;
    } else {
      message.warning('请先选择诊所');
      return;
    }
  }

  let addedCount = 0;
  let skippedCount = 0;
  const errors = [];

  try {
    // 遍历每条商品消息，添加到处方单
    for (const msg of productMessages) {
      try {
        // 解析消息内容
        let productData;
        try {
          productData = typeof msg.message_content === 'string'
            ? JSON.parse(msg.message_content)
            : msg.message_content;
        } catch (e) {
          console.error('解析就诊经历消息失败:', e);
          continue;
        }

        // 获取药品名称（从就诊经历中提取 drug_name）
        const drugName = productData.drug_name;
        if (!drugName) {
          skippedCount++;
          continue;
        }

        // 通过药品名称搜索药品
        const res = await getProductListDoctorReception({
          store_id: storeId,
          type: 2, // 中成(西)药
          name: drugName,
        });

        if (!res || res.length === 0) {
          errors.push(`未找到药品：${drugName}`);
          skippedCount++;
          continue;
        }

        // 使用第一个匹配的药品
        const drugData = res[0];

        // 检查药品是否已在处方中
        const existItem = prescriptionStore.currentDrugs.find(
          (item) => item.index_id === drugData.id,
        );
        if (existItem) {
          skippedCount++;
          continue;
        }

        // 添加药品到处方单
        const success = prescriptionStore.addProducts(drugData);
        if (success) {
          addedCount++;
        }
      } catch (error) {
        console.error('添加药品失败:', error);
        errors.push(`添加药品失败：${error.message || '未知错误'}`);
      }
    }

    // 显示结果消息
    if (addedCount > 0) {
      message.success(`已成功添加 ${addedCount} 个药品到处方单`);
      // 打开处方模态框
      prescriptionModalApi.setData({
        registerId: prescriptionStore.currentRegisterId,
        onPrescriptionSent: handlePrescriptionSent,
        storagePrefix: 'onlineConsultationClinic-',
      });
      prescriptionModalApi.open();
    } else if (skippedCount > 0) {
      // 如果所有药品都无法添加，尝试添加最新的那个
      // 按时间排序，取最新的药品（created_at 或 timestamp 最大的）
      const sortedMessages = [...productMessages].sort((a, b) => {
        const timeA = a.created_at ? new Date(a.created_at).getTime() : (a.timestamp || 0);
        const timeB = b.created_at ? new Date(b.created_at).getTime() : (b.timestamp || 0);
        return timeB - timeA; // 降序排列，最新的在前
      });

      if (sortedMessages.length > 0) {
        const latestMessage = sortedMessages[0];
        try {
          // 解析最新消息的内容
          let productData;
          try {
            productData = typeof latestMessage.message_content === 'string'
              ? JSON.parse(latestMessage.message_content)
              : latestMessage.message_content;
          } catch (e) {
            console.error('解析商品消息失败:', e);
            message.warning('当前聊天没有可添加的药品');
            return;
          }

          // 获取药品名称
          const drugName = productData.drug_name || productData.name;
          if (!drugName) {
            message.warning('当前聊天没有可添加的药品');
            return;
          }

          // 通过药品名称搜索药品
          const res = await getProductListDoctorReception({
            store_id: storeId,
            type: 2, // 中成(西)药
            name: drugName,
          });

          if (!res || res.length === 0) {
            message.warning('当前聊天没有可添加的药品');
            return;
          }

          // 使用第一个匹配的药品
          const drugData = res[0];

          // 检查药品是否已在处方中
          const existItem = prescriptionStore.currentDrugs.find(
            (item) => item.index_id === drugData.id,
          );
          if (existItem) {
            message.warning('当前聊天没有可添加的药品');
            return;
          }

          // 添加药品到处方单
          const success = prescriptionStore.addProducts(drugData);
          if (success) {
            message.success(`已成功添加 ${drugData.drug.drug_name} 到处方单`);
            // 打开处方模态框
            prescriptionModalApi.setData({
              registerId: prescriptionStore.currentRegisterId,
              onPrescriptionSent: handlePrescriptionSent,
              storagePrefix: 'onlineConsultationClinic-',
            });
            prescriptionModalApi.open();
          } else {
            message.warning('当前聊天没有可添加的药品');
          }
        } catch (error) {
          console.error('添加最新药品失败:', error);
          message.warning('当前聊天没有可添加的药品');
        }
      } else {
        message.warning('当前聊天没有可添加的药品');
      }
    }

    // 如果有错误，显示错误信息
    if (errors.length > 0) {
      console.warn('添加药品时的错误:', errors);
    }
  } catch (error) {
    console.error('批量添加药品失败:', error);
    message.error('添加药品失败，请重试');
  }
};
</script>

<template>
  <div
    class="chat-box-body flex bg-gradient-to-br from-blue-900 via-purple-900 to-pink-300 p-5"
    style="height: 95vh"
  >
    <!-- 主容器 -->
    <div
      :class="leftShow ? 'container-box-grid' : 'container-box'"
      class="z-10 mx-auto flex flex-1 overflow-hidden rounded-2xl bg-white/90 shadow-2xl backdrop-blur-sm"
    >
      <!-- 连接状态指示器 -->
      <ConnectionStatus />

      <!-- 处方模态框 - 使用 VbenModal 模式 -->
      <PrescriptionModalComponent />

      <!-- 左侧患者列表 -->
      <div class="left-panel-wrapper">
        <Button
          :class="leftShow ? 'w-full mb-2' : 'sticky top-5 left-5'"
          type="primary"
          @click="leftShow = !leftShow"
        >
          {{ leftShow ? '收起患者列表' : '展开患者列表' }}
        </Button>
        <PatientList
          ref="patientListRef"
          v-if="leftShow"
          :doctor-id="userStore.currentUser?.doctor_id"
          @select-patient="handleSelectPatient"
          class="patient-list-panel"
        />
      </div>

      <!-- 右侧内容区域 -->
      <div class="right-content-area">
        <!-- 列表模式：显示患者信息和接诊 -->
        <template v-if="viewMode === 'list'">
          <PatientInfoPanel
            :patient="selectedPatient"
            :doctor-id="userStore.currentUser?.doctor_id"
            @reception-success="handleReceptionSuccess"
            @enter-chat="handleEnterChat"
            @refresh-list="handleRefreshList"
            @transfer-import-success="handleTransferImportSuccess"
            class="patient-info-panel"
          />
        </template>

        <!-- 聊天模式：显示聊天界面 -->
        <template v-else>
          <div class="min-w-0 flex-1 min-h-0">
            <ChatArea
              v-if="chatStore.currentFriend"
              @open-prescription="openPrescriptionModule"
              @end-consultation-success="handleEndConsultationSuccess"
            />
            <EmptyState v-else />
          </div>
        </template>
      </div>
    </div>
  </div>
</template>

<style scoped>
.container-box {
  min-height: 90vh;
  display: flex;
  flex-direction: column;
}

.container-box-grid {
  min-height: 90vh;
  display: grid;
  grid-template-columns: 300px 1fr;
  gap: 0;
}

.left-panel-wrapper {
  border-right: 1px solid #e4e7ed;
  padding: 16px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.patient-list-panel {
  flex: 1;
  overflow: hidden;
}

.right-content-area {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  min-height: 0;
}

.patient-info-panel {
  flex: 1;
  overflow-y: auto;
}

.dark .left-panel-wrapper {
  border-right-color: #334155;
  background: #1e293b;
}

.dark .container-box-grid {
  background: #1f2937;
}
</style>
