<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>
      </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 Navbar from '@/components/Navbar.vue'
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'

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>