<template>
  <div class="home-page">
    <!-- 导航栏 -->
    <Navbar />

    <!-- 主内容区 -->
    <div class="main-content">
      <!-- 欢迎卡片 -->
      <div class="welcome-card">
        <div class="welcome-header">
          <h1>欢迎回来，{{ username }}！</h1>
          <p>当前时间：{{ currentTime }}</p>
        </div>
        
        <!-- 用户统计概览 -->
        <div class="stats-overview" v-if="userInfo">
          <div class="stat-item">
            <div class="stat-icon upload">
              <el-icon size="24"><Upload /></el-icon>
            </div>
            <div class="stat-content">
              <h3>{{ formatBytes(userInfo.user.uploaded) }}</h3>
              <p>总上传</p>
            </div>
          </div>
          
          <div class="stat-item">
            <div class="stat-icon download">
              <el-icon size="24"><Download /></el-icon>
            </div>
            <div class="stat-content">
              <h3>{{ formatBytes(userInfo.user.downloaded) }}</h3>
              <p>总下载</p>
            </div>
          </div>
          
          <div class="stat-item">
            <div class="stat-icon ratio">
              <el-icon size="24"><TrendCharts /></el-icon>
            </div>
            <div class="stat-content">
              <h3>{{ calculateRatio(userInfo.user.uploaded, userInfo.user.downloaded) }}</h3>
              <p>分享率</p>
            </div>
          </div>
          
          <div class="stat-item">
            <div class="stat-icon points">
              <el-icon size="24"><Star /></el-icon>
            </div>
            <div class="stat-content">
              <h3>{{ userInfo.user.karma || '0' }}</h3>
              <p>积分</p>
            </div>
          </div>
        </div>
      </div>

      <!-- 功能快捷入口 -->
      <div class="quick-actions">
        <h2>快捷操作</h2>
        <div class="actions-grid">
          <div class="action-card" @click="$router.push('/upload')">
            <el-icon size="32" color="#67c23a"><Upload /></el-icon>
            <h3>上传种子</h3>
            <p>分享你的资源</p>
          </div>
          
          <div class="action-card" @click="$router.push('/torrents')">
            <el-icon size="32" color="#409eff"><Search /></el-icon>
            <h3>浏览种子</h3>
            <p>发现新内容</p>
          </div>
          
          <div class="action-card" @click="$router.push('/forum')">
            <el-icon size="32" color="#e6a23c"><ChatDotRound /></el-icon>
            <h3>社区论坛</h3>
            <p>交流讨论</p>
          </div>
          
          <div class="action-card" @click="$router.push('/profile')">
            <el-icon size="32" color="#f56c6c"><User /></el-icon>
            <h3>个人中心</h3>
            <p>管理账户</p>
          </div>
          <div class="action-card" @click="$router.push('/chat')">
            <el-icon size="32" color="#8e44ad"><ChatDotRound /></el-icon>
            <h3>聊天室</h3>
            <p>实时聊天互动</p>
          </div>
        </div>
      </div>

      <!-- API连接状态测试 -->
      <div class="api-status-card">
        <h2>API连接状态</h2>
        <div class="status-items">
          <div class="status-item">
            <el-icon :color="loginStatusColor"><CircleCheck /></el-icon>
            <span>登录状态：{{ loginStatusText }}</span>
            <el-button size="small" @click="checkLoginStatus">检查状态</el-button>
          </div>
          
          <div class="status-item">
            <el-icon :color="userInfoStatusColor"><User /></el-icon>
            <span>用户信息：{{ userInfoStatusText }}</span>
            <el-button size="small" @click="refreshUserInfo">刷新信息</el-button>
          </div>
        </div>
        
        <!-- 用户详细信息展示 -->
        <div class="user-details" v-if="userInfo">
          <h3>用户详细信息</h3>
          <div class="details-grid">
            <div class="detail-item">
              <label>用户ID：</label>
              <span>{{ userInfo.user.id }}</span>
            </div>
            <div class="detail-item">
              <label>用户名：</label>
              <span>{{ userInfo.user.username }}</span>
            </div>
            <div class="detail-item">
              <label>邮箱：</label>
              <span>{{ userInfo.user.email }}</span>
            </div>
            <div class="detail-item">
              <label>用户组：</label>
              <span>{{ userInfo.user.group?.displayName || '未知' }}</span>
            </div>
            <div class="detail-item">
              <label>注册时间：</label>
              <span>{{ formatDate(userInfo.user.createdAt) }}</span>
            </div>
            <div class="detail-item">
              <label>个性签名：</label>
              <span>{{ userInfo.user.signature || '这个用户很懒，还没有个性签名' }}</span>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import { ref, computed, onMounted, onUnmounted } from 'vue'
import { useRouter } from 'vue-router'
import { useStore } from 'vuex'
import { ElMessage, ElMessageBox } from 'element-plus'
import {
  ArrowDown,
  User,
  Setting,
  SwitchButton,
  Upload,
  Download,
  TrendCharts,
  Star,
  Search,
  ChatDotRound,
  CircleCheck
} from '@element-plus/icons-vue'
import Navbar from "@/components/Navbar.vue";

export default {
  name: 'HomeView',
  components: {
    ArrowDown,
    User,
    Setting,
    SwitchButton,
    Upload,
    Download,
    TrendCharts,
    Star,
    Search,
    ChatDotRound,
    CircleCheck,
    Navbar
  },
  setup() {
    const router = useRouter()
    const store = useStore()
    
    const currentTime = ref('')
    const timeInterval = ref(null)
    
    // 从store获取用户信息
    const userInfo = computed(() => store.getters['auth/userInfo'])
    const username = computed(() => store.getters['auth/username'])
    const userAvatar = computed(() => store.getters['auth/avatar'])
    const isAuthenticated = computed(() => store.getters['auth/isAuthenticated'])
    
    // API状态
    const loginStatusColor = computed(() => isAuthenticated.value ? '#67c23a' : '#f56c6c')
    const loginStatusText = computed(() => isAuthenticated.value ? '已登录' : '未登录')
    
    const userInfoStatusColor = computed(() => userInfo.value ? '#67c23a' : '#f56c6c')
    const userInfoStatusText = computed(() => userInfo.value ? '已获取' : '未获取')
    
    // 更新当前时间
    const updateCurrentTime = () => {
      currentTime.value = new Date().toLocaleString('zh-CN')
    }
    
    // 格式化字节数
    const formatBytes = (bytes) => {
      if (!bytes || bytes === 0) return '0 B'
      
      const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
      const i = Math.floor(Math.log(bytes) / Math.log(1024))
      const size = (bytes / Math.pow(1024, i)).toFixed(2)
      
      return `${size} ${sizes[i]}`
    }
    
    // 计算分享率
    const calculateRatio = (uploaded, downloaded) => {
      if (!uploaded || !downloaded || downloaded === 0) {
        return uploaded > 0 ? '∞' : '0.00'
      }
      return (uploaded / downloaded).toFixed(2)
    }
    
    // 格式化日期
    const formatDate = (timestamp) => {
      if (!timestamp) return '未知'
      return new Date(timestamp).toLocaleDateString('zh-CN')
    }
    
    // 检查登录状态
    const checkLoginStatus = async () => {
      try {
        await store.dispatch('auth/checkLoginStatus')
        ElMessage.success('登录状态检查完成')
      } catch (error) {
        console.error('检查登录状态失败:', error)
        ElMessage.error('检查登录状态失败')
      }
    }
    
    // 刷新用户信息
    const refreshUserInfo = async () => {
      try {
        await store.dispatch('auth/checkLoginStatus')
        ElMessage.success('用户信息刷新成功')
      } catch (error) {
        console.error('刷新用户信息失败:', error)
        ElMessage.error('刷新用户信息失败')
      }
    }
    
    // 处理用户菜单命令
    const handleUserCommand = async (command) => {
      switch (command) {
        case 'profile':
          router.push('/profile')
          break
        case 'settings':
          ElMessage.info('设置功能开发中...')
          break
        case 'logout':
          try {
            await ElMessageBox.confirm('确定要退出登录吗？', '提示', {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              type: 'warning'
            })
            
            await store.dispatch('auth/logout')
            router.push('/login')
          } catch (error) {
            // 用户取消操作
            if (error !== 'cancel') {
              console.error('退出登录失败:', error)
            }
          }
          break
      }
    }
    
    onMounted(() => {
      // 开始时间更新
      updateCurrentTime()
      timeInterval.value = setInterval(updateCurrentTime, 1000)
      
      // 检查登录状态
      if (!isAuthenticated.value) {
        checkLoginStatus()
      }
    })
    
    onUnmounted(() => {
      // 清理定时器
      if (timeInterval.value) {
        clearInterval(timeInterval.value)
      }
    })
    
    return {
      currentTime,
      userInfo,
      username,
      userAvatar,
      isAuthenticated,
      loginStatusColor,
      loginStatusText,
      userInfoStatusColor,
      userInfoStatusText,
      formatBytes,
      calculateRatio,
      formatDate,
      checkLoginStatus,
      refreshUserInfo,
      handleUserCommand
    }
  }
}
</script>

<style lang="scss" scoped>
.home-page {
  min-height: 100vh;
  background: #f5f5f5;
}

.navbar {
  background: #fff;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
  height: 60px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 24px;
  position: sticky;
  top: 0;
  z-index: 1000;
}

.navbar-brand {
  font-size: 20px;
  font-weight: 700;
  color: #409eff;
  text-decoration: none;
}

.navbar-nav {
  display: flex;
  align-items: center;
  gap: 24px;
}

.navbar-item {
  color: #606266;
  text-decoration: none;
  font-weight: 500;
  transition: color 0.3s;
  
  &:hover {
    color: #409eff;
  }
}

.navbar-user {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  padding: 8px;
  border-radius: 6px;
  transition: background-color 0.3s;
  
  &:hover {
    background-color: #f5f7fa;
  }
  
  .username {
    font-weight: 500;
    color: #303133;
  }
}

.main-content {
  max-width: 1200px;
  margin: 0 auto;
  padding: 24px;
}

.welcome-card {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  color: white;
  border-radius: 12px;
  padding: 32px;
  margin-bottom: 24px;
  
  .welcome-header {
    text-align: center;
    margin-bottom: 24px;
    
    h1 {
      font-size: 28px;
      margin-bottom: 8px;
    }
    
    p {
      opacity: 0.9;
      font-size: 14px;
    }
  }
  
  .stats-overview {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 16px;
    
    .stat-item {
      background: rgba(255, 255, 255, 0.1);
      backdrop-filter: blur(10px);
      border-radius: 8px;
      padding: 20px;
      display: flex;
      align-items: center;
      gap: 16px;
      
      .stat-icon {
        width: 48px;
        height: 48px;
        border-radius: 50%;
        background: rgba(255, 255, 255, 0.2);
        display: flex;
        align-items: center;
        justify-content: center;
      }
      
      .stat-content {
        h3 {
          font-size: 20px;
          font-weight: 600;
          margin: 0 0 4px 0;
        }
        
        p {
          font-size: 14px;
          opacity: 0.8;
          margin: 0;
        }
      }
    }
  }
}

.quick-actions {
  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;
    color: #303133;
    margin: 0 0 20px 0;
  }
  
  .actions-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 16px;
    
    .action-card {
      background: #f8f9fa;
      border-radius: 8px;
      padding: 24px;
      text-align: center;
      cursor: pointer;
      transition: all 0.3s;
      border: 2px solid transparent;
      
      &:hover {
        transform: translateY(-2px);
        box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
        border-color: #409eff;
      }
      
      h3 {
        font-size: 16px;
        color: #303133;
        margin: 12px 0 8px 0;
      }
      
      p {
        font-size: 14px;
        color: #909399;
        margin: 0;
      }
    }
  }
}

.api-status-card {
  background: #fff;
  border-radius: 12px;
  padding: 24px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
  
  h2 {
    font-size: 20px;
    color: #303133;
    margin: 0 0 20px 0;
  }
  
  .status-items {
    margin-bottom: 24px;
    
    .status-item {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 12px 0;
      border-bottom: 1px solid #ebeef5;
      
      &:last-child {
        border-bottom: none;
      }
      
      span {
        flex: 1;
        font-size: 14px;
        color: #606266;
      }
    }
  }
  
  .user-details {
    border-top: 1px solid #ebeef5;
    padding-top: 20px;
    
    h3 {
      font-size: 16px;
      color: #303133;
      margin: 0 0 16px 0;
    }
    
    .details-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
      gap: 12px;
      
      .detail-item {
        display: flex;
        align-items: center;
        padding: 8px 0;
        
        label {
          font-weight: 500;
          color: #909399;
          min-width: 80px;
          font-size: 14px;
        }
        
        span {
          color: #606266;
          font-size: 14px;
        }
      }
    }
  }
}

@media (max-width: 768px) {
  .navbar {
    padding: 0 16px;
    
    .navbar-nav {
      gap: 16px;
    }
    
    .navbar-user .username {
      display: none;
    }
  }
  
  .main-content {
    padding: 16px;
  }
  
  .welcome-card {
    padding: 24px 16px;
    
    .welcome-header h1 {
      font-size: 24px;
    }
    
    .stats-overview {
      grid-template-columns: repeat(2, 1fr);
      gap: 12px;
      
      .stat-item {
        padding: 16px;
        
        .stat-content h3 {
          font-size: 16px;
        }
      }
    }
  }
  
  .actions-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 12px;
    
    .action-card {
      padding: 16px;
      
      h3 {
        font-size: 14px;
      }
      
      p {
        font-size: 12px;
      }
    }
  }
  
  .details-grid {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 480px) {
  .stats-overview {
    grid-template-columns: 1fr;
  }
  
  .actions-grid {
    grid-template-columns: 1fr;
  }
}
</style>