import { notFound } from 'next/navigation'
import { getTranslations, setRequestLocale } from 'next-intl/server'
import { Link } from '@/i18n/navigation'
import {
getCharacter,
getCharacterEquipment,
getCharacterCustomizations,
getCharacterStats,
getCharacterProfessions,
getItemIcons,
getAchievementPoints,
getCharacterTalentGroups,
getCharacterSpecs,
getSpellIcons,
getActivityPage,
getAchievementOverview,
getRaidProgress,
getDungeonProgress,
getRealmName,
getQuestCount,
getQuestPage,
getQuestStatusCounts,
getCharacterCollection,
getReputations,
getPvpRank,
getCharacterArena,
getPvpCurrency,
getBattlegroundHistory,
} from '@/lib/armory'
import { raceName, className, classColor, factionOf, classPower, XP_FOR_LEVEL } from '@/lib/wow-data'
import { PageShell } from '@/components/PageShell'
import { ArmoryPaperdoll, type SheetItem } from '@/components/ArmoryPaperdoll'
import { wowheadIcon } from '@/lib/wowhead'
import { ArmoryTalentTab } from '@/components/ArmoryTalentTab'
import { ArmoryAchievements } from '@/components/ArmoryAchievements'
import { ArmoryRaids } from '@/components/ArmoryRaids'
import { ArmoryQuests } from '@/components/ArmoryQuests'
import { ArmoryTabs, type ArmoryTab } from '@/components/ArmoryTabs'
import { ArmoryReputations } from '@/components/ArmoryReputations'
import { ArmoryCollection } from '@/components/ArmoryCollection'
import { ArmoryPvpRank } from '@/components/ArmoryPvpRank'
import { ArmoryBattlegrounds } from '@/components/ArmoryBattlegrounds'
export const dynamic = 'force-dynamic'
const MAX_LEVEL = 80
export default async function CharacterPage({ params }: { params: Promise<{ locale: string; guid: string }> }) {
const { locale, guid } = await params
setRequestLocale(locale)
const t = await getTranslations('Armory')
const id = Number(guid)
const character = await getCharacter(id)
if (!character) notFound()
const [equipment, customizations, stats, professions, achievementPoints, talentGroups, specs, activityData, questCount] =
await Promise.all([
getCharacterEquipment(id, locale),
getCharacterCustomizations(id),
getCharacterStats(id),
getCharacterProfessions(id, locale),
getAchievementPoints(id),
getCharacterTalentGroups(id, character.class, locale),
getCharacterSpecs(id, character.class, locale),
getActivityPage(id, locale, 1, 10, '', ''),
getQuestCount(id),
])
const [questData, mounts, pets, questCounts, reputations, pvpRankData, arena, pvpCurrency, bgHistory, achOverview, raidProgress, dungeonProgress, realmName] = await Promise.all([
getQuestPage(id, locale, 1, 15, '', '', 'all'),
getCharacterCollection(id, locale, 'mounts'),
getCharacterCollection(id, locale, 'pets'),
getQuestStatusCounts(id),
getReputations(id, locale),
getPvpRank(1, 30, ''),
getCharacterArena(id),
getPvpCurrency(id),
getBattlegroundHistory(id),
getAchievementOverview(id, factionOf(character.race), locale),
getRaidProgress(id, locale),
getDungeonProgress(id, locale),
getRealmName(),
])
const qGrand = questCounts.rewarded + questCounts.complete + questCounts.inprogress + questCounts.failed
const icons = await getItemIcons(equipment.map((e) => e.entry))
const spellIcons = await getSpellIcons(talentGroups.spellIds)
const items: SheetItem[] = equipment.map((e) => ({
slot: e.slot,
entry: e.entry,
name: e.name,
quality: e.quality,
itemLevel: e.itemLevel,
inventoryType: e.inventoryType,
displayId: e.displayId,
transmogDisplayId: e.transmogDisplayId,
ench: e.ench,
gems: e.gems,
icon: icons[e.entry] ?? null,
}))
const gear = equipment.filter((e) => e.slot !== 3 && e.slot !== 18 && e.itemLevel > 0)
const avgItemLevel = gear.length ? Math.round(gear.reduce((s, e) => s + e.itemLevel, 0) / gear.length) : 0
const faction = factionOf(character.race)
const factionLabel = faction === 'alliance' ? t('alliance') : faction === 'horde' ? t('horde') : ''
const power = classPower(character.class, locale)
const xpNext = character.level < MAX_LEVEL ? XP_FOR_LEVEL[character.level] ?? 0 : 0
const xpPct =
character.level >= MAX_LEVEL ? 100 : xpNext > 0 ? Math.min(100, Math.round((character.xp / xpNext) * 100)) : 0
const statRows = stats
? [
{ label: t('strength'), value: `${stats.strength}` },
{ label: t('agility'), value: `${stats.agility}` },
{ label: t('stamina'), value: `${stats.stamina}` },
{ label: t('intellect'), value: `${stats.intellect}` },
{ label: t('armor'), value: `${stats.armor}` },
{ label: t('attackPower'), value: `${stats.attackPower}` },
{ label: t('rangedAttackPower'), value: `${stats.rangedAttackPower}` },
{ label: t('spellPower'), value: `${stats.spellPower}` },
{ label: t('critChance'), value: `${stats.critPct.toFixed(2)}%` },
{ label: t('spellCrit'), value: `${stats.spellCritPct.toFixed(2)}%` },
{ label: t('dodge'), value: `${stats.dodgePct.toFixed(2)}%` },
{ label: t('parry'), value: `${stats.parryPct.toFixed(2)}%` },
{ label: t('block'), value: `${stats.blockPct.toFixed(2)}%` },
{ label: t('resilience'), value: `${stats.resilience}` },
]
: []
// ---- Pestaña Equipación: modelo + spec + stats/profesiones/PvP ----
const equipTab = (
<>
{t('statsPending')}
)}{t('noProfessions')}
)}{t('noTalents')}
← {t('backToArmory')}