<template>
  <FlexCol v-if="showSessionSidebar" position="relative" width="100%" height="100%">
    <NavBar 
      title="历史会话" 
      leftButton="close-bold" 
      @leftButtonPressed="showSessionSidebar=false"
    />
    <ChatSessionSidebar :sessionManager="sessionManager" @close="showSessionSidebar = false" />
  </FlexCol>
  <ChatMessageContainer
    v-else
    :chatManager="chatManager"
    :sessionManager="sessionManager"
    :historyItemsPagerManager="historyItemsPagerManager"
    :chatInterfaceManager="interfaceManager"
    @intoSelectMode="intoSelectMode"
  >
    <template #header>
      <NavBar 
        title="AI伴写" 
        leftButton="menu"
        rightButton="close-bold"
        @leftButtonPressed="showSessionSidebar = true" 
        @rightButtonPressed="emit('close')"
      />
    </template>
    <template #footer>
      <ChatFooter
        :chatManager="chatManager" 
        :chatInterfaceManager="interfaceManager"
      >
        <template #mulitSelectMode>
          <ChatMulitSelectBar 
            :selectedCount="selectedCount" 
            :messages="messages" 
            :sessionManager="sessionManager" 
            @cancel="exitSelectMode"
          />
        </template>
        <template #header>

        </template>
      </ChatFooter>
    </template>
  </ChatMessageContainer>
</template>

<script setup lang="ts">  
import { onMounted, ref, type Ref } from 'vue';
import { useChatSession } from '../../composables/useChatSession';
import { useChat, type ChatInterfaceManager } from '../../core/Chat';
import { useChatHistoryItemsPager } from '../../composables/useChatHistoryItemsPager';
import { useChatSelection } from '../../composables/useChatSelection';
import { useAgentTools } from './composables/agentTools';
import { ChatMessage as ChatMessageModel } from '../../model/Message';
import { ChatGroups } from '../../core/Groups';
import ChatFooter from '../../components/ChatFooter.vue';
import ChatMessageContainer from '../../components/ChatMessageContainer.vue';
import ChatSessionSidebar from '../../components/Session/ChatSessionSidebar.vue';
import ChatMulitSelectBar from '../../components/Footer/ChatMulitSelectBar.vue';
import NavBar from '@/components/nav/NavBar.vue';
import FlexCol from '@/components/layout/FlexCol.vue';

const messages = ref<ChatMessageModel[]>([]) as Ref<ChatMessageModel[]>;
const interfaceManager: ChatInterfaceManager = {
  messages,
  getAttachmentList: async () => {
    return [];
  },
  uploadAttachment() {
    emit('upload');
  },
};

const props = defineProps<{
  title: string;
  content: string;
  images: {
    url: string;
    localUrl: string;
  }[];
}>();
const emit = defineEmits([ 
  'update:title',
  'update:content',
  'update:images',
  'close',
  'upload'
]);

const showSessionSidebar = ref(false);

const sessionManager = useChatSession({
  messages,
  enableSession: true,
  groupId: ChatGroups.NOTE_EDITOR,
  onStop: () => chatManager.stop(),
  onScrollToBottom: () => interfaceManager.scrollToBottom?.(),
});
const historyItemsPagerManager = useChatHistoryItemsPager({
  messages,
  sessionManager,
});

const { registerTools } = useAgentTools({
  title: props.title,
  content: props.content,
  images: props.images,
  onUpdateTitle: (title) => emit('update:title', title),
  onUpdateContent: (content) => emit('update:content', content),
  onUpdateImages: (images) => emit('update:images', images),
});

const welcomeActions = [
  '乡村振兴的现状与未来', 
  '乡源情怀是什么',
  '乡源文化的传承与发展',
  '乡源文化的保护与利用',
  '乡源文化的传承与发展',
  '乡源文化的保护与利用',
  '帮我续写这篇笔记',
  '帮我润色这篇笔记',
  '帮我改写这篇笔记的开头',
  '帮我提供几个更吸引人的标题',
  '总结一下这篇笔记的要点',
  '给这段话添加相关案例或数据',
  '检查并修正文中的错别字和语病',
  '根据当前内容延伸新的段落',
  '将这篇笔记缩写成200字以内',
  '把文章改写得更具故事性',
  '帮我检查逻辑和表达是否清晰',
  '请提出内容改进的建议',
  '根据现有内容给出分段和小标题',
  '尝试用不同文风重写这段：略带幽默或更正式',
  '请帮我删除冗余和重复内容',
  '模仿范文风格改写这段文字',
  '将内容转为适合公众号发布的结构',
]

const chatManager = useChat({
  interfaceManager,
  sessionManager,
  config: {
    onGetSendOptions: () => ({
      enableThinking: true,
      enableSearch: false,
      modelInfo: {
        name: 'hunyuan-2.0-thinking-20251109',
        value: 'hunyuan-2.0-thinking-20251109',
        max_tokens: 10000,
      },
      model: 'hunyuan-2.0-thinking-20251109',
      chatOptions: {
        temperature: 0.5,
        top_p: 1,
        top_k: 40,
        presence_penalty: 0,
      },
      customSystemPrompt: '',
    }),
    defaultSystemPrompt: `你是一个“乡村文化挖掘笔记/文章写作与改稿助手”，工作在一个笔记编辑器里。你需要在与用户对话的同时，能直接读取并修改当前文章（标题与正文）。

## 工作目标
- 帮用户写作：构思、列提纲、扩写、续写、改写、润色、降重、统一文风、改错别字与语病。
- 帮用户改稿：在不改变事实/观点的前提下，提高表达清晰度、逻辑性与可读性；必要时提出修改建议并给出可直接应用的改稿。

## 强制规则（很重要）
- 当用户的需求涉及“基于现有文章内容”进行判断/总结/改写/润色/纠错/扩写时：你必须先调用工具读取文章（至少读取标题或正文）再开始。
- 当需要改动文章时：优先使用“片段替换/插入/删除”等精确编辑工具；只有在大改（重写/大幅重排）时才使用整篇覆盖写入。
- 任何工具写入后，都要简短说明你改了什么（1-3 条），避免长篇复述全文。
- 如果用户只是在聊天，不需要动文章，就不要调用写入工具。
- 用户大部分情况下需要简短的文章，请尽量在200~800字以内完成任务。

## 输出偏好
- 先给结论/方案，再给要点；结构清晰，使用小标题与列表。
- 涉及改稿时，优先给“可直接应用”的修改结果（通过工具写入完成），必要时补充原因。`,
    onBuildWelcome: () => {
      return {
        welcomeMessage: '你好！欢迎使用亮乡源AI伴写助手。可以与我讨论写作灵感、写作计划、交代我写作任务等。',
        welcomeActions: [...welcomeActions].sort(() => Math.random() - 0.5).slice(0, 5),
      }
    },
    onInitTools: (toolsManager) => {
      registerTools(toolsManager);
    },
  }
});

const {
  intoSelectMode,
  exitSelectMode,
  selectedCount,
  isSelectMode,
} = useChatSelection();

onMounted(() => {
  interfaceManager.scrollToBottom?.();
});
</script>