"use client" import { useState, useEffect } from "react" import { useCompetition } from "@/contexts/competition-context" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Badge } from "@/components/ui/badge" import { Avatar, AvatarFallback } from "@/components/ui/avatar" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Alert, AlertDescription } from "@/components/ui/alert" import { Users, Plus, MoreHorizontal, Edit, Trash2, Eye, UserPlus, UserMinus, Crown, CheckCircle, AlertTriangle, Loader2, } from "lucide-react" import type { Team, TeamMember } from "@/types/competition" export function TeamManagement() { const { teams, addTeam, updateTeam, getTeamById } = useCompetition() const [searchTerm, setSearchTerm] = useState("") const [selectedDepartment, setSelectedDepartment] = useState("all") const [selectedTeam, setSelectedTeam] = useState(null) const [showTeamDetail, setShowTeamDetail] = useState(false) const [showAddTeam, setShowAddTeam] = useState(false) const [showEditTeam, setShowEditTeam] = useState(false) const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) const [isLoading, setIsLoading] = useState(false) const [success, setSuccess] = useState("") const [error, setError] = useState("") // 從 API 獲取的團隊數據 const [apiTeams, setApiTeams] = useState([]) const [isLoadingTeams, setIsLoadingTeams] = useState(true) const [newTeam, setNewTeam] = useState({ name: "", department: "HQBU", contactEmail: "", members: [] as TeamMember[], leader: "", apps: [] as string[], totalLikes: 0, }) const [newMember, setNewMember] = useState({ name: "", user_id: "", department: "HQBU", role: "成員", }) // 可用用戶狀態 const [availableUsers, setAvailableUsers] = useState([]) const [isLoadingUsers, setIsLoadingUsers] = useState(false) // 獲取團隊數據 const fetchTeams = async () => { try { setIsLoadingTeams(true) const response = await fetch('/api/admin/teams') const data = await response.json() if (data.success) { setApiTeams(data.data) } else { console.error('獲取團隊數據失敗:', data.message) setError('獲取團隊數據失敗') } } catch (error) { console.error('獲取團隊數據失敗:', error) setError('獲取團隊數據失敗') } finally { setIsLoadingTeams(false) } } useEffect(() => { fetchTeams() fetchAvailableUsers() }, []) // 獲取可用用戶列表 const fetchAvailableUsers = async () => { try { setIsLoadingUsers(true) const response = await fetch('/api/admin/users/available') const data = await response.json() if (data.success) { setAvailableUsers(data.data) } else { console.error('獲取用戶列表失敗:', data.message) setError('獲取用戶列表失敗') } } catch (error) { console.error('獲取用戶列表失敗:', error) setError('獲取用戶列表失敗') } finally { setIsLoadingUsers(false) } } const filteredTeams = apiTeams.filter((team) => { const matchesSearch = team.name.toLowerCase().includes(searchTerm.toLowerCase()) || team.leader_name?.toLowerCase().includes(searchTerm.toLowerCase()) const matchesDepartment = selectedDepartment === "all" || team.department === selectedDepartment return matchesSearch && matchesDepartment }) const handleViewTeam = (team: Team) => { setSelectedTeam(team) setShowTeamDetail(true) } const handleEditTeam = async (team: any) => { setSelectedTeam(team) try { // 獲取團隊的詳細信息,包括成員 const response = await fetch(`/api/admin/teams/${team.id}`) const data = await response.json() if (data.success) { const teamDetails = data.data // 確保成員數據結構正確 const members = teamDetails.members && Array.isArray(teamDetails.members) ? teamDetails.members.map((member: any) => ({ id: member.user_id || member.id, user_id: member.user_id || member.id, name: member.name, department: member.department, role: member.role || '成員' })) : [] setNewTeam({ name: teamDetails.name, department: teamDetails.department, contactEmail: teamDetails.contact_email || teamDetails.contactEmail, description: teamDetails.description || '', members: members, leader: teamDetails.leader_id || teamDetails.leader, apps: teamDetails.apps || [], totalLikes: teamDetails.total_likes || teamDetails.totalLikes || 0, }) setShowEditTeam(true) } else { setError('獲取團隊詳情失敗') } } catch (error) { console.error('獲取團隊詳情失敗:', error) setError('獲取團隊詳情失敗') } } const handleDeleteTeam = (team: Team) => { setSelectedTeam(team) setShowDeleteConfirm(true) } const confirmDeleteTeam = () => { if (selectedTeam) { // In a real app, you would call a delete function here setShowDeleteConfirm(false) setSelectedTeam(null) setSuccess("團隊刪除成功!") setTimeout(() => setSuccess(""), 3000) } } const handleAddMember = () => { if (!newMember.user_id || !newMember.name.trim()) { setError("請選擇成員") return } // 檢查是否已經添加過這個成員 if (newTeam.members.some(member => member.user_id === newMember.user_id)) { setError("該成員已經在團隊中") return } const member: TeamMember = { id: newMember.user_id, // 使用真實的用戶 ID user_id: newMember.user_id, name: newMember.name, department: newMember.department, role: newMember.role, } setNewTeam({ ...newTeam, members: [...newTeam.members, member], }) // Set as leader if it's the first member if (newTeam.members.length === 0) { setNewTeam((prev) => ({ ...prev, leader: member.id, members: [...prev.members, { ...member, role: "隊長" }], })) } setNewMember({ name: "", user_id: "", department: "HQBU", role: "成員", }) setError("") } const handleRemoveMember = (memberId: string) => { const updatedMembers = newTeam.members.filter((m) => m.id !== memberId) let newLeader = newTeam.leader // If removing the leader, assign leadership to the first remaining member if (memberId === newTeam.leader && updatedMembers.length > 0) { newLeader = updatedMembers[0].id updatedMembers[0].role = "隊長" } setNewTeam({ ...newTeam, members: updatedMembers, leader: newLeader, }) } const handleSetLeader = (memberId: string) => { const updatedMembers = newTeam.members.map((member) => ({ ...member, role: member.id === memberId ? "隊長" : "成員", })) setNewTeam({ ...newTeam, members: updatedMembers, leader: memberId, }) } const handleAddTeam = async () => { setError("") if (!newTeam.name || !newTeam.contactEmail || newTeam.members.length === 0) { setError("請填寫所有必填欄位並至少添加一名成員") return } setIsLoading(true) await new Promise((resolve) => setTimeout(resolve, 1000)) addTeam(newTeam) setShowAddTeam(false) setNewTeam({ name: "", department: "HQBU", contactEmail: "", members: [], leader: "", apps: [], totalLikes: 0, }) setSuccess("團隊創建成功!") setIsLoading(false) setTimeout(() => setSuccess(""), 3000) } const handleUpdateTeam = async () => { if (!selectedTeam) return setError("") if (!newTeam.name || !newTeam.contactEmail || newTeam.members.length === 0) { setError("請填寫所有必填欄位並至少添加一名成員") return } setIsLoading(true) try { // 準備更新數據 const updateData = { name: newTeam.name, department: newTeam.department, contact_email: newTeam.contactEmail, description: newTeam.description || null, leader_id: newTeam.leader, members: newTeam.members.map(member => ({ user_id: member.user_id || member.id, role: member.role })) } console.log('🔍 準備更新的團隊數據:', updateData) console.log('🔍 成員數據:', newTeam.members) // 調用 API 更新團隊 const response = await fetch(`/api/admin/teams/${selectedTeam.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(updateData) }) const data = await response.json() if (data.success) { // 更新成功,重新載入團隊數據 await fetchTeams() setShowEditTeam(false) setSelectedTeam(null) setSuccess("團隊更新成功!") } else { setError(data.message || "更新團隊失敗") } } catch (error) { console.error('更新團隊失敗:', error) setError("更新團隊失敗") } finally { setIsLoading(false) setTimeout(() => setError(""), 3000) setTimeout(() => setSuccess(""), 3000) } } return (
{/* Success/Error Messages */} {success && ( {success} )} {error && ( {error} )} {/* Header */}

團隊管理

管理競賽團隊和成員資訊

{/* Stats Cards */}

總團隊數

{apiTeams.length}

總成員數

{apiTeams.reduce((sum, team) => sum + (team.member_count || 0), 0)}

平均團隊規模

{apiTeams.length > 0 ? Math.round((apiTeams.reduce((sum, team) => sum + (team.member_count || 0), 0) / apiTeams.length) * 10) / 10 : 0}

{/* Filters */}
setSearchTerm(e.target.value)} />
{/* Teams Table */} 團隊列表 ({filteredTeams.length}) 管理所有競賽團隊 團隊名稱 隊長 部門 成員數 應用數 總按讚數 操作 {filteredTeams.map((team) => { return (

{team.name}

{team.contact_email}

{team.leader_name?.[0] || "?"} {team.leader_name || "未設定"}
{team.department}
{team.member_count || 0}
{team.app_count || 0} {team.totalLikes} handleViewTeam(team)}> 查看詳情 handleEditTeam(team)}> 編輯團隊 handleDeleteTeam(team)}> 刪除團隊
) })}
{/* Add Team Dialog */} 新增團隊 創建一個新的競賽團隊 基本資訊 團隊成員
setNewTeam({ ...newTeam, name: e.target.value })} placeholder="輸入團隊名稱" />
setNewTeam({ ...newTeam, contactEmail: e.target.value })} placeholder="team@company.com" />

新增成員

setNewMember({ ...newMember, name: e.target.value })} placeholder="輸入成員姓名" />
setNewMember({ ...newMember, role: e.target.value })} placeholder="例如:開發工程師" />
{newTeam.members.length > 0 && (

團隊成員 ({newTeam.members.length})

{newTeam.members.map((member) => (
{member.name[0]}
{member.name} {member.id === newTeam.leader && ( 隊長 )}
{member.department} • {member.role}
{member.id !== newTeam.leader && ( )}
))}
)}
{/* Edit Team Dialog */} 編輯團隊 修改團隊資訊和成員 基本資訊 團隊成員
setNewTeam({ ...newTeam, name: e.target.value })} placeholder="輸入團隊名稱" />
setNewTeam({ ...newTeam, contactEmail: e.target.value })} placeholder="team@company.com" />

新增成員

setNewMember({ ...newMember, role: e.target.value })} placeholder="例如:開發工程師" />
{newTeam.members.length > 0 && (

團隊成員 ({newTeam.members.length})

{newTeam.members.map((member) => (
{member.name[0]}
{member.name} {member.id === newTeam.leader && ( 隊長 )}
{member.department} • {member.role}
{member.id !== newTeam.leader && ( )}
))}
)}
{/* Delete Confirmation Dialog */} 確認刪除團隊 您確定要刪除團隊「{selectedTeam?.name}」嗎?
此操作無法復原,將會永久刪除團隊的所有資料。
{/* Team Detail Dialog */} 團隊詳情 查看團隊的詳細資訊 {selectedTeam && (

{selectedTeam.name}

{selectedTeam.contact_email}

{selectedTeam.department} {selectedTeam.member_count || 0} 名成員 {selectedTeam.app_count || 0} 個應用

團隊ID

{selectedTeam.id}

總按讚數

{selectedTeam.totalLikes}

團隊成員

{selectedTeam.members.map((member) => (
{member.name[0]}
{member.name} {member.id === selectedTeam.leader && ( 隊長 )}
{member.department} • {member.role}
))}
)}
) }