<template>
  <Navbar />
  <div class="topic-page">
    <Navbar />
    <div class="page-container">
      <!-- 话题头部 -->
      <div class="topic-header">
        <div class="header-content">
          <div class="topic-title-section">
            <h1>{{ topic.title }}</h1>
            <div class="topic-meta">
              <span class="author">
                <el-avatar :size="24">{{ topic.user?.username ? topic.user.username.charAt(0) : 'A' }}</el-avatar>
                <span class="author-name">{{ topic.user?.username || '匿名' }}</span>
              </span>
              <span class="time">{{ formatTime(topic.createTime) }}</span>
              <span class="views">
                <el-icon><View /></el-icon>
                {{ topic.views }}
              </span>
              <el-button
                :icon="isSubscribed ? StarFilled : Star"
                :type="isSubscribed ? 'warning' : 'default'"
                @click="handleSubscribe"
              >
                {{ isSubscribed ? '已订阅' : '订阅' }}
              </el-button>
            </div>
          </div>
          <div class="topic-actions" v-if="isAuthor">
            <el-button type="primary" @click="showEditDialog = true">编辑</el-button>
            <el-button type="danger" @click="handleDelete">删除</el-button>
          </div>
        </div>
      </div>

      <!-- 话题内容 -->
      <div class="topic-content">
        <div class="content-card">
          <div class="content-body" v-html="topic.content"></div>
          <div class="content-tags">
            <el-tag
              v-for="tag in topic.tags"
              :key="tag.id"
              :color="tag.color"
              effect="light"
            >
              {{ tag.name }}
            </el-tag>
          </div>
        </div>
      </div>



      <!-- 回复列表 -->
      <div class="replies-section">
        <h2>回复 ({{ getTotalReplyCount() }})</h2>
        <div class="replies-list">
          <!-- 使用递归组件显示所有回复 -->
          <ReplyTree
            :replies="replies"
            :level="0"
            @reply="replyToPost"
            @edit="editReply"
            @delete="deleteReply"
          />
        </div>
      </div>

      <!-- 回复框 -->
      <div class="reply-box">
        <h3>{{ replyingTo ? `回复 @${replyingTo.author}` : '发表回复' }}</h3>
        <div v-if="replyingTo" class="replying-to">
          <div class="original-content">{{ replyingTo.content }}</div>
          <el-button size="small" @click="cancelReply">取消回复</el-button>
        </div>
        <el-input
          v-model="newReply"
          type="textarea"
          :rows="4"
          placeholder="请输入回复内容..."
        />
        <div class="reply-actions">
          <el-button type="primary" @click="submitReply" :loading="submitting">
            发表回复
          </el-button>
        </div>
      </div>
    </div>

    <!-- 编辑话题对话框 -->
    <el-dialog
      v-model="showEditDialog"
      title="编辑话题"
      width="600px"
    >
      <el-form
        ref="editFormRef"
        :model="editForm"
        :rules="editRules"
        label-width="80px"
      >
        <el-form-item label="标题" prop="title">
          <el-input v-model="editForm.title" />
        </el-form-item>
        <el-form-item label="内容" prop="content">
          <el-input
            v-model="editForm.content"
            type="textarea"
            :rows="8"
          />
        </el-form-item>
        <el-form-item label="标签">
          <div class="tags-input">
            <el-tag
              v-for="tag in editForm.tags"
              :key="tag"
              closable
              @close="removeTag(tag)"
            >
              {{ tag }}
            </el-tag>
            <el-input
              v-if="tagInputVisible"
              ref="tagInputRef"
              v-model="tagInputValue"
              size="small"
              @keyup.enter="addTag"
              @blur="addTag"
              style="width: 100px;"
            />
            <el-button
              v-else
              size="small"
              @click="showTagInput"
            >
              + 添加标签
            </el-button>
          </div>
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="showEditDialog = false">取消</el-button>
        <el-button type="primary" @click="submitEdit" :loading="submitting">
          保存
        </el-button>
      </template>
    </el-dialog>
  </div>
</template>

<script>
import { ref, reactive, onMounted, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import { View, Star, StarFilled } from '@element-plus/icons-vue'
import {
  getTopicById,
  updateTopic,
  deleteTopic
} from '@/api/topic'
import {
  getPostsByTopic,
  getPostTreeByTopic,
  createPost,
  updatePost,
  deletePost
} from '@/api/post'

import {
  getTopicTags,
  assignTagsToTopic
} from '@/api/forumTag'
import {
  recordTopicView,
  getUserViewHistory
} from '@/api/topicView'
import {
  subscribeTopic,
  unsubscribeTopic,
  checkSubscription,
  getSubscriptionList
} from '@/api/subscription'
import Navbar from "@/components/Navbar.vue";
import ReplyTree from "@/components/ReplyTree.vue";

export default {
  name: 'TopicView',
  components: {Navbar, ReplyTree},
  setup() {
    const route = useRoute()
    const router = useRouter()
    const topicId = computed(() => route.params.id)
    
    const topic = ref({})
    const replies = ref([])
    const newReply = ref('')
    const submitting = ref(false)
    const showEditDialog = ref(false)
    const tagInputVisible = ref(false)
    const tagInputValue = ref('')
    const replyingTo = ref(null)
    
    const editForm = reactive({
      title: '',
      content: '',
      tags: []
    })
    
    const editRules = {
      title: [
        { required: true, message: '请输入标题', trigger: 'blur' },
        { min: 5, max: 100, message: '标题长度在 5 到 100 个字符', trigger: 'blur' }
      ],
      content: [
        { required: true, message: '请输入内容', trigger: 'blur' },
        { min: 10, max: 5000, message: '内容长度在 10 到 5000 个字符', trigger: 'blur' }
      ]
    }
    
    const isAuthor = computed(() => {
      // 这里需要根据实际用户系统来判断
      return true
    })
    
    const isSubscribed = ref(false)
    
    const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
    const token = localStorage.getItem('token')
    
    const loadTopicData = async () => {
      try {
        // 获取话题详情
        const response = await getTopicById(topicId.value)
        topic.value = response
        editForm.title = response.title
        editForm.content = response.content
        
        // 获取话题标签
        const tags = await getTopicTags(topicId.value)
        editForm.tags = tags.map(tag => tag.name)
        
        // 获取树形回复结构
        const posts = await getPostTreeByTopic(topicId.value)
        replies.value = posts
        

        
        // 检查订阅状态
        if (token && userInfo.id) {
          const subscriptionStatus = await checkSubscription({
            topicId: topicId.value,
            userId: userInfo.id
          })
          isSubscribed.value = subscriptionStatus
        }
        
        // 记录浏览
        if (token && userInfo.id) {
          await recordTopicView({
            topicId: topicId.value,
            userId: userInfo.id
          })
        }
      } catch (error) {
        console.error('加载话题数据失败:', error)
        ElMessage.error('加载话题数据失败')
      }
    }
    

    
    const handleSubscribe = async () => {
      try {
        if (isSubscribed.value) {
          await unsubscribeTopic({ topicId: topicId.value })
          isSubscribed.value = false
          ElMessage.success('已取消订阅')
        } else {
          await subscribeTopic({ topicId: topicId.value })
          isSubscribed.value = true
          ElMessage.success('已订阅话题')
        }
      } catch (error) {
        console.error('订阅操作失败:', error)
        ElMessage.error('订阅操作失败')
      }
    }
    
    const formatTime = (timeString) => {
      const date = new Date(timeString)
      const now = new Date()
      const diff = now - date
      const hours = Math.floor(diff / (1000 * 60 * 60))
      
      if (hours < 1) return '刚刚'
      if (hours < 24) return `${hours}小时前`
      const days = Math.floor(hours / 24)
      return `${days}天前`
    }
    
    const handleDelete = async () => {
      try {
        await ElMessageBox.confirm(
          '确定要删除这个话题吗？此操作不可恢复。',
          '警告',
          {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }
        )
        
        await deleteTopic(topicId.value)
        ElMessage.success('话题已删除')
        router.push('/forum')
      } catch (error) {
        if (error !== 'cancel') {
          console.error('删除话题失败:', error)
          ElMessage.error('删除话题失败')
        }
      }
    }
    
    const submitEdit = async () => {
      try {
        submitting.value = true
        const updatedTopic = {
          ...topic.value,
          title: editForm.title,
          content: editForm.content
        }
        
        await updateTopic(topicId.value, updatedTopic)
        
        // 更新标签
        await assignTagsToTopic(topicId.value, editForm.tags)
        
        ElMessage.success('话题已更新')
        showEditDialog.value = false
        await loadTopicData()
      } catch (error) {
        console.error('更新话题失败:', error)
        ElMessage.error('更新话题失败')
      } finally {
        submitting.value = false
      }
    }
    
    const submitReply = async () => {
      if (!newReply.value.trim()) {
        ElMessage.warning('请输入回复内容')
        return
      }
      
      try {
        submitting.value = true
        const reply = {
          topicId: topicId.value,
          content: newReply.value,
          parentId: replyingTo.value ? replyingTo.value.id : null
        }
        
        await createPost(reply)
        ElMessage.success('回复已发布')
        newReply.value = ''
        replyingTo.value = null
        await loadTopicData()
      } catch (error) {
        console.error('发布回复失败:', error)
        ElMessage.error('发布回复失败')
      } finally {
        submitting.value = false
      }
    }

    const replyToPost = (post) => {
      replyingTo.value = {
        id: post.id,
        author: post.user?.username || '匿名',
        content: post.content.substring(0, 100) + (post.content.length > 100 ? '...' : '')
      }
      // 滚动到回复框
      document.querySelector('.reply-box').scrollIntoView({ behavior: 'smooth' })
    }

    const cancelReply = () => {
      replyingTo.value = null
    }

    // 递归计算所有回复的总数（包括嵌套回复）
    const countReplies = (posts) => {
      let count = 0
      for (const post of posts) {
        count += 1
        if (post.replies && post.replies.length > 0) {
          count += countReplies(post.replies)
        }
      }
      return count
    }

    const getTotalReplyCount = () => {
      return countReplies(replies.value)
    }


    
    const editReply = (reply) => {
      // 实现编辑回复的逻辑
    }
    
    const deleteReply = async (replyId) => {
      try {
        await ElMessageBox.confirm(
          '确定要删除这条回复吗？',
          '警告',
          {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }
        )
        
        await softDeletePost(replyId)
        ElMessage.success('回复已删除')
        await loadTopicData()
      } catch (error) {
        if (error !== 'cancel') {
          console.error('删除回复失败:', error)
          ElMessage.error('删除回复失败')
        }
      }
    }
    
    const showTagInput = () => {
      tagInputVisible.value = true
      nextTick(() => {
        tagInputRef.value?.focus()
      })
    }
    
    const addTag = () => {
      const tag = tagInputValue.value.trim()
      if (tag && !editForm.tags.includes(tag)) {
        editForm.tags.push(tag)
      }
      tagInputVisible.value = false
      tagInputValue.value = ''
    }
    
    const removeTag = (tag) => {
      const index = editForm.tags.indexOf(tag)
      if (index > -1) {
        editForm.tags.splice(index, 1)
      }
    }
    
    onMounted(() => {
      loadTopicData()
    })
    
          return {
      topic,
      replies,
      newReply,
      submitting,
      showEditDialog,
      tagInputVisible,
      tagInputValue,
      replyingTo,
      editForm,
      editRules,
      isAuthor,
      formatTime,
      handleDelete,
      submitEdit,
      submitReply,
      replyToPost,
      cancelReply,
      getTotalReplyCount,
      editReply,
      deleteReply,
      showTagInput,
      addTag,
      removeTag,
      View,
      Star,
      StarFilled,
      isSubscribed,
      handleSubscribe
    }
  }
}
</script>

<style lang="scss" scoped>
.topic-page {
  max-width: 1200px;
  margin: 0 auto;
  padding: 24px;
  background: #f5f5f5;
  min-height: 100vh;
}

.topic-header {
  background: #fff;
  border-radius: 12px;
  padding: 24px;
  margin-bottom: 24px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
  
  .header-content {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    
    .topic-title-section {
      h1 {
        font-size: 24px;
        font-weight: 600;
        color: #2c3e50;
        margin: 0 0 16px 0;
      }
      
      .topic-meta {
        display: flex;
        align-items: center;
        gap: 16px;
        color: #7f8c8d;
        font-size: 14px;
        
        .author {
          display: flex;
          align-items: center;
          gap: 8px;
        }
        
        .views {
          display: flex;
          align-items: center;
          gap: 4px;
        }
      }
    }
    
    .topic-actions {
      display: flex;
      gap: 12px;
    }
  }
}

.topic-content {
  margin-bottom: 24px;
  
  .content-card {
    background: #fff;
    border-radius: 12px;
    padding: 24px;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
    
    .content-body {
      font-size: 16px;
      line-height: 1.6;
      color: #2c3e50;
      margin-bottom: 24px;
    }
    
    .content-tags {
      display: flex;
      gap: 8px;
      flex-wrap: wrap;
    }
  }
}



.replies-section {
  background: #fff;
  border-radius: 12px;
  padding: 24px;
  margin-bottom: 24px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
  
  h2 {
    font-size: 20px;
    font-weight: 600;
    color: #2c3e50;
    margin: 0 0 20px 0;
  }
}

.reply-box {
  background: #fff;
  border-radius: 12px;
  padding: 24px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
  
  h3 {
    font-size: 18px;
    font-weight: 600;
    color: #2c3e50;
    margin: 0 0 16px 0;
  }
  
  .replying-to {
    background: #f8f9fa;
    border-left: 4px solid #3498db;
    padding: 12px 16px;
    margin-bottom: 16px;
    border-radius: 4px;
    
    .original-content {
      color: #666;
      font-size: 14px;
      margin-bottom: 8px;
      font-style: italic;
    }
  }
  
  .reply-actions {
    margin-top: 16px;
    display: flex;
    justify-content: flex-end;
  }
}

.tags-input {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  
  .el-tag {
    margin: 0;
  }
}



.reply-actions {
  display: flex;
  align-items: center;
  gap: 8px;
}

@media (max-width: 768px) {
  .topic-page {
    padding: 16px;
  }
  
  .topic-header {
    .header-content {
      flex-direction: column;
      
      .topic-actions {
        margin-top: 16px;
        width: 100%;
        justify-content: flex-end;
      }
    }
  }
}
</style> 