'use client'

import { useEffect, useState } from 'react'
import Link from 'next/link'
import { useRouter } from 'next/navigation'
import { useLocale, useTranslations } from 'next-intl'
import {
  ArrowLeft,
  Ban,
  Briefcase,
  Calendar,
  CreditCard,
  DollarSign,
  FileText,
  Hash,
  Heart,
  Save,
  Shield,
  Trophy,
  AlertTriangle,
  CheckCircle2,
  Circle,
} from 'lucide-react'
import ProtectedRoute from '@/components/ProtectedRoute'
import Header from '@/components/Header'
import SkinAvatar from '@/components/SkinAvatar'
import { Button } from '@/components/ui/button'
import { useAuth } from '@/contexts/AuthContext'
import { authFetch } from '@/lib/fetchAuth'
import { BIOGRAPHY_MAX } from '@/lib/characterCreation'
import { MISSION_CATEGORIES } from '@/lib/characterProgress'

interface CharacterJob {
  slot: number
  id: number
  name: string
}

interface CharacterMission {
  id: number
  category: string
  categoryLabel: string
  title: string
  description: string
  value: number
  current: number
  target: number
  percent: number
  completed: boolean
}

interface AchievementCategory {
  id: string
  completed: number
  total: number
  percent: number
}

interface FactionProfile {
  id: number
  name: string
  logo: string
  role: 'leader' | 'subleader' | 'member'
  rank: number
  rankName: string
  leader: string
  subLeader: string
  memberCount: number
  salary: number
  type: number
  typeLabel: string
}

interface CharacterDetail {
  id: number
  name: string
  health: number
  skin: number
  gender: 'male' | 'female'
  age: number
  city?: string
  walkStyleName?: string
  biography?: string
  cash: number
  bank: number
  phone: string | null
  document: number
  level: number
  registeredAt: string | null
  lastConnection: string | null
  avatar: string
  posX?: number | null
  posY?: number | null
  posZ?: number | null
  MiembroFaccion?: number | null
  LiderFaccion?: number | null
  factionRank?: number
  faction?: FactionProfile | null
  banStatus?: number
  banReason?: string | null
  banDate?: string | null
  bannedBy?: string | null
  jobs: CharacterJob[]
  missions: CharacterMission[]
  achievementCategories: AchievementCategory[]
}

const FACTION_NAMES: Record<number, string> = {
  1: 'Los Santos Police Department',
}

function getFactionName(id?: number | null) {
  if (!id || !Number.isFinite(id)) return 'Civilian'
  return FACTION_NAMES[id] || `Faction #${id}`
}

function getRoleBadgeClass(role: FactionProfile['role']) {
  switch (role) {
    case 'leader':
      return 'bg-amber-500/15 text-amber-300 border-amber-500/35'
    case 'subleader':
      return 'bg-blue-500/15 text-blue-300 border-blue-500/35'
    default:
      return 'bg-slate-500/15 text-slate-300 border-slate-500/35'
  }
}

function formatMySqlDate(input: string | null): string {
  if (!input || input === 'none') return '—'
  const raw = String(input).trim()
  const dmY = raw.match(/(?:\d{2}:\d{2}:\d{2}\s*-\s*)?(\d{2})\/(\d{2})\/(\d{4})$/)
  if (dmY) {
    const [, dd, mm, yyyy] = dmY
    const dt = new Date(Number(yyyy), Number(mm) - 1, Number(dd))
    return isNaN(dt.getTime()) ? `${dd}/${mm}/${yyyy}` : dt.toLocaleDateString()
  }
  const yMd = raw.match(/^(\d{4})-(\d{2})-(\d{2})(?:\s+\d{2}:\d{2}:\d{2})?$/)
  if (yMd) {
    const [, yyyy, mm, dd] = yMd
    const dt = new Date(Number(yyyy), Number(mm) - 1, Number(dd))
    return isNaN(dt.getTime()) ? `${dd}/${mm}/${yyyy}` : dt.toLocaleDateString()
  }
  const t = Date.parse(raw)
  if (!Number.isNaN(t)) return new Date(t).toLocaleDateString()
  return raw
}

export default function CharacterProfilePage({ characterId }: { characterId: number }) {
  const t = useTranslations('dashboard.characterProfile')
  const td = useTranslations('dashboard')
  const locale = useLocale()
  const router = useRouter()
  const { user, loading: authLoading } = useAuth()

  const [character, setCharacter] = useState<CharacterDetail | null>(null)
  const [loading, setLoading] = useState(true)
  const [error, setError] = useState<string | null>(null)
  const [biography, setBiography] = useState('')
  const [savingBio, setSavingBio] = useState(false)
  const [bioMessage, setBioMessage] = useState<string | null>(null)
  const [activeCategory, setActiveCategory] = useState<string>('welcome')

  useEffect(() => {
    if (authLoading) return
    if (!user) {
      router.replace(`/${locale}/login`)
      return
    }

    const loadCharacter = async () => {
      setLoading(true)
      setError(null)
      try {
        const response = await authFetch(`/api/user/characters/${characterId}`)
        const data = await response.json()
        if (!response.ok) {
          setError(data.error || t('error'))
          return
        }
        setCharacter(data.character)
        setBiography(data.character.biography || '')
      } catch {
        setError(t('error'))
      } finally {
        setLoading(false)
      }
    }

    loadCharacter()
  }, [authLoading, user, characterId, locale, router, t])

  const handleSaveBiography = async () => {
    if (!user || !character) return
    setSavingBio(true)
    setBioMessage(null)
    try {
      const response = await authFetch(`/api/user/characters/${characterId}`, {
        method: 'PATCH',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ biography }),
      })
      const data = await response.json()
      if (!response.ok) {
        setBioMessage(data.error || t('bioSaveError'))
        return
      }
      setCharacter(data.character)
      setBiography(data.character.biography || '')
      setBioMessage(t('bioSaved'))
    } catch {
      setBioMessage(t('bioSaveError'))
    } finally {
      setSavingBio(false)
    }
  }

  const filteredMissions =
    character?.missions.filter((mission) => mission.category === activeCategory) ?? []

  return (
    <ProtectedRoute>
      <>
        <Header />
        <main className="min-h-screen bg-[#070b12] pt-24 pb-16">
          <div className="container mx-auto px-4 max-w-5xl">
            <Link
              href={`/${locale}/dashboard`}
              className="inline-flex items-center gap-2 text-[#8ab4ff] hover:text-white transition-colors mb-6"
            >
              <ArrowLeft className="w-4 h-4" />
              {t('back')}
            </Link>

            {loading ? (
              <div className="rounded-2xl border border-[#0087FF]/20 bg-[#0c1320]/80 p-12 text-center text-gray-400">
                {t('loading')}
              </div>
            ) : error || !character ? (
              <div className="rounded-2xl border border-red-500/30 bg-red-950/20 p-12 text-center">
                <p className="text-red-300">{error || t('error')}</p>
                <Button
                  onClick={() => router.push(`/${locale}/dashboard`)}
                  className="mt-4"
                  variant="outline"
                >
                  {t('back')}
                </Button>
              </div>
            ) : (
              <div className="space-y-6">
                {/* Header */}
                <section className="rounded-2xl border border-[#0087FF]/20 bg-gradient-to-br from-[#0f1620] to-[#0c1320] p-6 md:p-8">
                  <div className="flex flex-col md:flex-row gap-6">
                    <SkinAvatar
                      src={character.avatar}
                      alt={character.gender}
                      gender={character.gender}
                      className="w-24 h-24 md:w-28 md:h-28 rounded-2xl border-2 border-[#0087FF]/30 shrink-0"
                    />
                    <div className="flex-1 min-w-0">
                      <h1 className="text-2xl md:text-3xl font-bold text-white truncate">
                        {character.name}
                      </h1>
                      <div className="flex flex-wrap gap-3 mt-2 text-xs text-gray-300">
                        <span className="inline-flex items-center gap-1">
                          <Hash className="w-3 h-3" /> ID #{character.id}
                        </span>
                        <span className="inline-flex items-center gap-1">
                          <Shield className="w-3 h-3" />{' '}
                          {character.faction?.name || getFactionName(character.MiembroFaccion)}
                        </span>
                        {character.document > 0 && (
                          <span className="inline-flex items-center gap-1">
                            <FileText className="w-3 h-3" /> {t('document', { id: character.document })}
                          </span>
                        )}
                        <span className="inline-flex items-center gap-1">
                          <Trophy className="w-3 h-3" /> {t('level', { level: character.level })}
                        </span>
                      </div>

                      <div className="grid grid-cols-1 sm:grid-cols-3 gap-3 mt-5">
                        <div className="rounded-xl border border-[#0087FF]/15 bg-[#0c1320]/60 p-3">
                          <p className="text-xs text-gray-400 flex items-center gap-1">
                            <DollarSign className="w-3 h-3 text-emerald-400" /> {td('characters.details.cash')}
                          </p>
                          <p className="text-lg font-bold text-emerald-400">${character.cash.toLocaleString()}</p>
                        </div>
                        <div className="rounded-xl border border-[#0087FF]/15 bg-[#0c1320]/60 p-3">
                          <p className="text-xs text-gray-400 flex items-center gap-1">
                            <CreditCard className="w-3 h-3 text-blue-300" /> {td('characters.details.bank')}
                          </p>
                          <p className="text-lg font-bold text-blue-300">${character.bank.toLocaleString()}</p>
                        </div>
                        <div className="rounded-xl border border-[#0087FF]/15 bg-[#0c1320]/60 p-3">
                          <p className="text-xs text-gray-400 flex items-center gap-1">
                            <Heart className="w-3 h-3 text-red-400" /> {td('characters.details.health')}
                          </p>
                          <p className="text-lg font-bold text-white">{character.health}</p>
                        </div>
                      </div>
                    </div>
                  </div>
                </section>

                {character.faction && (
                  <section className="rounded-2xl border border-[#0087FF]/25 bg-gradient-to-br from-[#101a28] to-[#0c1320] p-6">
                    <div className="flex flex-col sm:flex-row sm:items-start gap-4 mb-5">
                      <div className="w-14 h-14 rounded-2xl bg-[#0087FF]/15 border border-[#0087FF]/30 flex items-center justify-center shrink-0">
                        <span className="text-sm font-bold text-[#8ab4ff] tracking-wide">
                          {character.faction.logo}
                        </span>
                      </div>
                      <div className="flex-1 min-w-0">
                        <div className="flex flex-wrap items-center gap-2">
                          <h2 className="text-lg font-semibold text-white">{character.faction.name}</h2>
                          <span className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-semibold border ${getRoleBadgeClass(character.faction.role)}`}>
                            {character.faction.role === 'leader'
                              ? t('roleLeader')
                              : character.faction.role === 'subleader'
                                ? t('roleSubLeader')
                                : t('roleMember')}
                          </span>
                        </div>
                        <p className="text-sm text-gray-400 mt-1">
                          {character.faction.rankName} · {character.faction.typeLabel}
                        </p>
                      </div>
                    </div>
                    <div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
                      <FactionStat label={t('factionRank')} value={character.faction.rankName} />
                      <FactionStat label={t('factionType')} value={character.faction.typeLabel} />
                      <FactionStat label={t('factionLeader')} value={character.faction.leader} />
                      <FactionStat label={t('factionSubLeader')} value={character.faction.subLeader} />
                      <FactionStat label={t('factionMembers')} value={String(character.faction.memberCount)} />
                      {character.faction.salary > 0 && (
                        <FactionStat label={t('factionSalary')} value={`$${character.faction.salary.toLocaleString()}`} />
                      )}
                    </div>
                  </section>
                )}

                <section className="rounded-2xl border border-[#0087FF]/20 bg-[#0c1320]/80 p-6">
                  <div className="mb-3">
                    <h2 className="text-lg font-semibold text-white">{t('biographyTitle')}</h2>
                  </div>
                  <textarea
                    value={biography}
                    onChange={(e) => setBiography(e.target.value.slice(0, BIOGRAPHY_MAX))}
                    maxLength={BIOGRAPHY_MAX}
                    rows={3}
                    placeholder={t('biographyPlaceholder')}
                    className="w-full rounded-xl border border-[#0087FF]/20 bg-[#070b12] px-4 py-3 text-white placeholder-gray-500 focus:outline-none focus:border-[#0087FF] resize-none"
                  />
                  <div className="flex flex-wrap items-center justify-between gap-3 mt-3">
                    <span className="text-xs text-gray-400">
                      {biography.length}/{BIOGRAPHY_MAX}
                    </span>
                    <div className="flex items-center gap-3">
                      {bioMessage && (
                        <span className={`text-xs ${bioMessage === t('bioSaved') ? 'text-emerald-400' : 'text-red-400'}`}>
                          {bioMessage}
                        </span>
                      )}
                      <Button
                        onClick={handleSaveBiography}
                        disabled={savingBio}
                        className="gap-2"
                      >
                        <Save className="w-4 h-4" />
                        {savingBio ? t('saving') : t('saveBiography')}
                      </Button>
                    </div>
                  </div>
                </section>

                {/* Details grid */}
                <section className="rounded-2xl border border-[#0087FF]/20 bg-[#0c1320]/80 p-6">
                  <h2 className="text-lg font-semibold text-white mb-4">{td('characters.details.title')}</h2>
                  <div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3">
                    <DetailRow label={td('characters.details.phoneNumber')} value={character.phone || '—'} />
                    <DetailRow label={td('characters.details.age')} value={String(character.age)} />
                    <DetailRow label={td('characters.details.city')} value={character.city || '—'} />
                    <DetailRow label={td('characters.details.walkStyle')} value={character.walkStyleName || '—'} />
                    <DetailRow label={td('characters.details.gender')} value={character.gender === 'female' ? td('characters.details.female') : td('characters.details.male')} />
                    <DetailRow label={td('characters.details.skin')} value={`#${character.skin}`} />
                    {!character.faction && (
                      <>
                        <DetailRow label={td('characters.details.faction')} value={getFactionName(character.MiembroFaccion)} />
                        <DetailRow label={td('characters.details.leader')} value={character.LiderFaccion ? td('characters.details.yes') : td('characters.details.no')} />
                      </>
                    )}
                    <DetailRow label={t('registeredAt')} value={formatMySqlDate(character.registeredAt)} />
                    <DetailRow label={t('lastConnection')} value={formatMySqlDate(character.lastConnection)} />
                    <DetailRow
                      label={td('characters.details.coordinates')}
                      value={
                        typeof character.posX === 'number'
                          ? `${character.posX.toFixed(2)}, ${character.posY?.toFixed(2)}, ${character.posZ?.toFixed(2)}`
                          : '—'
                      }
                    />
                  </div>
                </section>

                {/* Jobs */}
                <section className="rounded-2xl border border-[#0087FF]/20 bg-[#0c1320]/80 p-6">
                  <h2 className="text-lg font-semibold text-white mb-4 flex items-center gap-2">
                    <Briefcase className="w-5 h-5 text-[#8ab4ff]" />
                    {t('jobsTitle')}
                  </h2>
                  {character.jobs.length > 0 ? (
                    <div className="grid grid-cols-1 sm:grid-cols-3 gap-3">
                      {character.jobs.map((job) => (
                        <div
                          key={job.slot}
                          className="rounded-xl border border-[#0087FF]/15 bg-[#070b12]/60 p-4"
                        >
                          <p className="text-xs text-gray-400 mb-1">{t('jobSlot', { slot: job.slot })}</p>
                          <p className="text-white font-semibold">{job.name}</p>
                        </div>
                      ))}
                    </div>
                  ) : (
                    <p className="text-gray-400 text-sm">{t('noJobs')}</p>
                  )}
                </section>

                {/* Achievements / Missions */}
                <section className="rounded-2xl border border-[#0087FF]/20 bg-[#0c1320]/80 p-6">
                  <h2 className="text-lg font-semibold text-white mb-4 flex items-center gap-2">
                    <Trophy className="w-5 h-5 text-amber-400" />
                    {t('achievementsTitle')}
                  </h2>

                  <div className="grid grid-cols-2 sm:grid-cols-5 gap-2 mb-6">
                    {character.achievementCategories.map((category) => {
                      const label = MISSION_CATEGORIES.find((item) => item.id === category.id)
                      return (
                        <button
                          key={category.id}
                          type="button"
                          onClick={() => setActiveCategory(category.id)}
                          className={`rounded-xl border p-3 text-left transition-colors ${
                            activeCategory === category.id
                              ? 'border-[#0087FF]/50 bg-[#0087FF]/10'
                              : 'border-[#0087FF]/15 bg-[#070b12]/40 hover:border-[#0087FF]/30'
                          }`}
                        >
                          <p className="text-xs text-gray-300 truncate">
                            {label ? label.label[locale as 'es' | 'en'] : category.id}
                          </p>
                          <p className="text-sm font-bold text-white mt-1">
                            {category.completed}/{category.total}
                          </p>
                          <div className="h-1.5 rounded-full bg-slate-700 mt-2 overflow-hidden">
                            <div
                              className="h-full bg-gradient-to-r from-amber-500 to-amber-400"
                              style={{ width: `${category.percent}%` }}
                            />
                          </div>
                        </button>
                      )
                    })}
                  </div>

                  <div className="space-y-3">
                    {filteredMissions.map((mission) => (
                      <div
                        key={mission.id}
                        className={`rounded-xl border p-4 ${
                          mission.completed
                            ? 'border-emerald-500/30 bg-emerald-950/10'
                            : 'border-[#0087FF]/15 bg-[#070b12]/40'
                        }`}
                      >
                        <div className="flex items-start gap-3">
                          {mission.completed ? (
                            <CheckCircle2 className="w-5 h-5 text-emerald-400 shrink-0 mt-0.5" />
                          ) : (
                            <Circle className="w-5 h-5 text-gray-500 shrink-0 mt-0.5" />
                          )}
                          <div className="flex-1 min-w-0">
                            <div className="flex flex-wrap items-center justify-between gap-2">
                              <h3 className="font-semibold text-white">{mission.title}</h3>
                              <span className={`text-xs font-medium ${mission.completed ? 'text-emerald-400' : 'text-gray-400'}`}>
                                {mission.completed
                                  ? t('completed')
                                  : t('progress', { current: mission.current, target: mission.target })}
                              </span>
                            </div>
                            <p className="text-sm text-gray-400 mt-1">{mission.description}</p>
                            {!mission.completed && (
                              <div className="h-1.5 rounded-full bg-slate-700 mt-3 overflow-hidden">
                                <div
                                  className="h-full bg-gradient-to-r from-[#0087FF] to-[#8ab4ff]"
                                  style={{ width: `${mission.percent}%` }}
                                />
                              </div>
                            )}
                          </div>
                        </div>
                      </div>
                    ))}
                  </div>
                </section>

                {/* Ban info */}
                {character.banStatus && character.banStatus > 0 && (
                  <section className="rounded-2xl border-2 border-red-500/50 bg-red-950/20 p-6">
                    <div className="flex items-start gap-4">
                      <Ban className="w-8 h-8 text-red-400 shrink-0" />
                      <div>
                        <h3 className="text-lg font-bold text-red-300 flex items-center gap-2">
                          <AlertTriangle className="w-5 h-5" />
                          {td('characters.bannedTitle')}
                        </h3>
                        {character.banReason && (
                          <p className="text-sm text-red-200 mt-2">
                            {td('characters.bannedReason')}: {character.banReason}
                          </p>
                        )}
                        {character.bannedBy && (
                          <p className="text-sm text-red-200 mt-1">
                            {td('characters.bannedBy')}: {character.bannedBy}
                          </p>
                        )}
                        {character.banDate && (
                          <p className="text-sm text-red-200 mt-1 flex items-center gap-1">
                            <Calendar className="w-3 h-3" />
                            {td('characters.bannedDate')}: {formatMySqlDate(character.banDate)}
                          </p>
                        )}
                      </div>
                    </div>
                  </section>
                )}
              </div>
            )}
          </div>
        </main>
      </>
    </ProtectedRoute>
  )
}

function DetailRow({ label, value }: { label: string; value: string }) {
  return (
    <div className="flex items-center justify-between border-b border-white/10 py-2 gap-4">
      <span className="text-gray-400 text-sm">{label}</span>
      <span className="text-white text-sm font-medium text-right truncate">{value}</span>
    </div>
  )
}

function FactionStat({ label, value }: { label: string; value: string }) {
  return (
    <div className="rounded-xl border border-[#0087FF]/10 bg-[#070b12]/50 px-4 py-3">
      <p className="text-xs text-gray-500 mb-1">{label}</p>
      <p className="text-sm font-medium text-white truncate">{value}</p>
    </div>
  )
}
