'use client';

import React, { useEffect, useState, useRef } from "react";
import { Button } from 'primereact/button';
import { Card } from 'primereact/card';
import { Image } from 'primereact/image';
import { Carousel } from 'primereact/carousel';
// 页面跳转
import { useRouter } from 'next/navigation';
// 消息提醒
import { Toast } from 'primereact/toast';
// 评分图标
import { Fire } from '@icon-park/react';
// 接口传输
import axios from 'axios';

// 样式
import './main.scss';
// 模组列表数据
interface Mod {
  resourceId: number;
  resourceName: string;
  resourcePicture: string;
  likes: number;
}
interface ModList {
  records: Mod[];
}
// 地图列表数据
interface Map {
  resourceId: number;
  resourceName: string;
  resourcePicture: string;
  likes: number;
}
interface MapList {
  records: Mod[];
}
// 帖子列表数据
interface Modpack {
  resourceId: number;
  resourceName: string;
  resourcePicture: string;
  likes: number;
}
interface ModpackList {
  records: Modpack[];
}
// 帖子列表数据
interface Texture {
  resourceId: number;
  resourceName: string;
  resourcePicture: string;
  likes: number;
}
interface TextureList {
  records: Texture[];
}
// 热门资源幻灯片数据
interface HotResource {
  resourceId: number;
  resourceName: string;
  resourcePicture: string;
}
interface HotResourceList {
  records: HotResource[];
}
// 站点统计数据
interface Stats {
  threadCount: number;
  downloadCount: number;
  authorCount: number;
  resourceCount: number;
}
// 悬赏列表
interface Reward {
  rewardId: number;
  userId: number;
  rewardPicture: string;
  rewardName: string;
  createdAt: string;
  rewardDescription: string;
  price: number;
}
interface RewardList {
  total: number; // 总记录数
  records: Reward[];
}
// 主页
export default function Home() {
  // 模组列表
  const [mods, setMods] = useState<Mod[]>([]);
  // 悬赏列表
  const [reward, setReweard] = useState<Reward[]>([]);
  // 地图列表
  const [maps, setMaps] = useState<Map[]>([]);
  // 整合包列表
  const [modpacks, setModpacks] = useState<Modpack[]>([]);
  // 材质包列表
  const [textures, setTextures] = useState<Texture[]>([]);
  // 热门资源列表
  const [hotResources, setHotResources] = useState<HotResource[]>([]);
  // 站点统计信息
  const [stats, setStats] = useState<Stats>({
    threadCount: 0,
    downloadCount: 0,
    authorCount: 0,
    resourceCount: 0
  });
  // 消息提醒
  const toast = useRef<Toast>(null);
  const router = useRouter();


  // 获取帖子列表
  useEffect(() => {
    fetchHotResources();
    fetchRewards();
    fetchstats();
    fetchRecommendMods();
    fetchRecommendMaps();
    fetchRecommendModpacks();
    fetchRecommendTextures();
  }, []);

  // 获取悬赏列表
  const fetchRewards = async () => {
    try {
      const response = await axios.get<RewardList>(process.env.PUBLIC_URL +`/reward`, {
        params: { pageNumber: 1, rows: 5, searchValue: '', option: '' }
      });
      console.log('获取悬赏列表:', response.data.records);
      setReweard(response.data.records);
    } catch (err) {
      console.error('获取悬赏失败', err);
      toast.current?.show({ severity: 'error', summary: 'error', detail: '获取悬赏失败' });
    }
  };

  // 获取热门资源幻灯片
  const fetchHotResources = async () => {
    try {
      const response = await axios.get<HotResourceList>(process.env.PUBLIC_URL +`/resource/hot/slide`);
      console.log('获取热门社区幻灯片:', response.data.records);
      setHotResources(response.data.records);
    } catch (err) {
      console.error('获取Mod失败', err);
      toast.current?.show({ severity: 'error', summary: 'error', detail: '获取Mod失败' });
    }
  };

  // 获取全站数据
  const fetchstats = async () => {
    try {
      const response = await axios.get<Stats>(process.env.PUBLIC_URL +`/total/info`);
      console.log('获取全站数据:', response.data);
      setStats(response.data);
    } catch (err) {
      console.error('获取数据失败', err);
      toast.current?.show({ severity: 'error', summary: 'error', detail: '获取数据失败' });
    }
  };


  // 获取推荐模组、地图、整合包、材质包
  const fetchRecommendMods = async () => {
    try {
      const response = await axios.get<ModList>(process.env.PUBLIC_URL +`/resource/recommend`, {
        params: { userId: 22301145, pageNumber: 1, rows: 3, type: '模组' }
      });
      console.log('获取模组列表:', response.data.records);
      setMods(response.data.records);
    } catch (err) {
      console.error('获取Mod失败', err);
      toast.current?.show({ severity: 'error', summary: 'error', detail: '获取Mod失败' });
    }
  };
  const fetchRecommendMaps = async () => {
    try {
      const response = await axios.get<MapList>(process.env.PUBLIC_URL +`/resource/recommend`, {
        params: { userId: 22301145, pageNumber: 1, rows: 3, type: '地图' }
      });
      console.log('获取模组列表:', response.data.records);
      setMaps(response.data.records);
    } catch (err) {
      console.error('获取地图失败', err);
      toast.current?.show({ severity: 'error', summary: 'error', detail: '获取地图失败' });
    }
  };
  const fetchRecommendModpacks = async () => {
    try {
      const response = await axios.get<ModpackList>(process.env.PUBLIC_URL +`/resource/recommend`, {
        params: { userId: 22301145, pageNumber: 1, rows: 3, type: '整合包' }
      });
      console.log('获取模组列表:', response.data.records);
      setModpacks(response.data.records);
    } catch (err) {
      console.error('获取整合包失败', err);
      toast.current?.show({ severity: 'error', summary: 'error', detail: '获取整合包失败' });
    }
  };
  const fetchRecommendTextures = async () => {
    try {
      const response = await axios.get<TextureList>(process.env.PUBLIC_URL +`/resource/recommend`, {
        params: { userId: 22301145, pageNumber: 1, rows: 3, type: '材质包' }
      });
      console.log('获取模组列表:', response.data.records);
      setTextures(response.data.records);
    } catch (err) {
      console.error('获取材质包失败', err);
      toast.current?.show({ severity: 'error', summary: 'error', detail: '获取材质包失败' });
    }
  };
  return (
    <div className="Home">
      {/* 轮播图部分 */}
      <div className="main-header">
        <div className="carousel-wrapper">
          <Carousel
            value={hotResources}
            numVisible={1}
            numScroll={1}
            showIndicators={false}
            showNavigators={true}
            className="custom-carousel"
            itemTemplate={(hotResource) => (
              <div className="carousel-item" onClick={() => router.push(`/resource/resource-detail/${hotResource.resourceId}`)}>
                <Image alt="slide" src={process.env.NEXT_PUBLIC_NGINX_URL + hotResource.resourcePicture} className="carousel-avatar" width="700" height="350" />
              </div>
            )}
          />
        </div>
        <div className="rewards-panel">
          <h2>悬赏排行</h2>
          <div className="rewards-list">
            {reward.map((item) => (
              <div key={item.rewardId} className="reward-item" onClick={() => router.push(`/reward/reward-detail/${item.rewardId}`)}>
                <span className="reward-title">{item.rewardName}</span>
                <span className="reward-price">${item.price}</span>
              </div>
            ))}
          </div>
          <Button
            label="查看全部悬赏"
            className="view-all-button"
            onClick={() => router.push('/reward')}
          />
        </div>
      </div>
      {/* 站点统计信息 */}
      <div className="site-stats">
        <div className="stat-item">
          <span className="stat-value">{stats.threadCount}</span>
          <span className="stat-label">总帖子数</span>
        </div>
        <div className="stat-item">
          <span className="stat-value">{stats.downloadCount}</span>
          <span className="stat-label">下载总数</span>
        </div>
        <div className="stat-item">
          <span className="stat-value">{stats.authorCount}</span>
          <span className="stat-label">人数统计</span>
        </div>
        <div className="stat-item">
          <span className="stat-value">{stats.resourceCount}</span>
          <span className="stat-label">内容总数</span>
        </div>
      </div>
      {/* 推荐模组列表 */}
      <div className="recommended-mods">
        <div className="section-header">
          <h1>推荐模组资源</h1>
          <Button
            label="显示更多"
            link
            onClick={() => router.push('/resource/recommend/模组')}
          />
        </div>
        <div className="resource-grid">
          {mods.map((mod) => (
            <Card key={mod.resourceId} className="resource-card" onClick={() => router.push(`/resource/resource-detail/${mod.resourceId}`)}>
              <Image
                src={process.env.NEXT_PUBLIC_NGINX_URL + mod.resourcePicture}
                alt={mod.resourceName}
                width="368"
                height="200"
              />
              <div className="card-content">
                <h3>{mod.resourceName}</h3>
                <div className="view-count">
                  <Fire theme="outline" size="16" fill="#FF8D1A" />
                  <span>{mod.likes}</span>
                </div>
              </div>
            </Card>
          ))}
        </div>
      </div>
      {/* 推荐地图列表 */}
      <div className="recommended-maps">
        <div className="section-header">
          <h1>推荐地图资源</h1>
          <Button
            label="显示更多"
            link
            onClick={() => router.push('/resource/recommend/地图')}
          />
        </div>
        <div className="resource-grid">
          {maps.map((map) => (
            <Card key={map.resourceId} className="resource-card" onClick={() => router.push(`/resource/resource-detail/${map.resourceId}`)}>
              <Image
                src={process.env.NEXT_PUBLIC_NGINX_URL + map.resourcePicture}
                alt={map.resourceName}
                width="368"
                height="200"
              />
              <div className="card-content">
                <h3>{map.resourceName}</h3>
                <div className="view-count">
                  <Fire theme="outline" size="16" fill="#FF8D1A" />
                  <span>{map.likes}</span>
                </div>
              </div>
            </Card>
          ))}
        </div>
      </div>
      {/* 推荐材质包列表 */}
      <div className="recommended-textures">
        <div className="section-header">
          <h1>推荐材质包资源</h1>
          <Button
            label="显示更多"
            link
            onClick={() => router.push('/resource/recommend/材质包')}
          />
        </div>
        <div className="resource-grid">
          {textures.map((texture) => (
            <Card key={texture.resourceId} className="resource-card" onClick={() => router.push(`/resource/resource-detail/${texture.resourceId}`)}>
              <Image
                src={process.env.NEXT_PUBLIC_NGINX_URL + texture.resourcePicture}
                alt={texture.resourceName}
                width="368"
                height="200"
              />
              <div className="card-content">
                <h3>{texture.resourceName}</h3>
                <div className="view-count">
                  <Fire theme="outline" size="16" fill="#FF8D1A" />
                  <span>{texture.likes}</span>
                </div>
              </div>
            </Card>
          ))}
        </div>
      </div>
      {/* 推荐整合包列表 */}
      <div className="recommended-Modpacks">
        <div className="section-header">
          <h1>推荐整合包资源</h1>
          <Button
            label="显示更多"
            link
            onClick={() => router.push('/resource/recommend/整合包')}
          />
        </div>
        <div className="resource-grid">
          {modpacks.map((modpack) => (
            <Card key={modpack.resourceId} className="resource-card" onClick={() => router.push(`/resource/${modpack.resourceId}`)}>
              <Image
                src={process.env.NEXT_PUBLIC_NGINX_URL + modpack.resourcePicture}
                alt={modpack.resourceName}
                width="368"
                height="200"
              />
              <div className="card-content">
                <h3>{modpack.resourceName}</h3>
                <div className="view-count">
                  <Fire theme="outline" size="16" fill="#FF8D1A" />
                  <span>{modpack.likes}</span>
                </div>
              </div>
            </Card>
          ))}
        </div>
      </div>
    </div>
  );
}
