﻿'use client';

import { useEffect, useMemo, useState } from 'react';
import Link from 'next/link';
import { useParams, useRouter } from 'next/navigation';
import { AlertTriangle, CheckCircle2, ChevronLeft, CircleAlert, FileArchive, ImagePlus, Loader2, Package, Plus, Save, Trash2, Upload } from 'lucide-react';
import { api } from '@/lib/api';

type Category = { id: string; name: string };
type Variant = { id?: string; name: string; price: string; stock: string; inventoryZip: File | null };
const AUTO = 'AUTO_ZIP';
const AUTO_TXT = 'AUTO_TXT';

export default function EditProductPage() {
  const router = useRouter(); const { locale, id } = useParams<{ locale: string; id: string }>();
  const [categories, setCategories] = useState<Category[]>([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [uploadingImages, setUploadingImages] = useState(false); const [error, setError] = useState('');
  const [name, setName] = useState(''); const [slug, setSlug] = useState(''); const [categoryId, setCategoryId] = useState(''); const [status, setStatus] = useState('ACTIVE');
  const [deliveryMethod, setDeliveryMethod] = useState('MANUAL'); const [deliveryTime, setDeliveryTime] = useState('1 - 24 giờ'); const [warranty, setWarranty] = useState('24 giờ'); const [platform, setPlatform] = useState('PC'); const [description, setDescription] = useState(''); const [images, setImages] = useState<string[]>([]);
  const [variants, setVariants] = useState<Variant[]>([]); const automatic = [AUTO, AUTO_TXT].includes(deliveryMethod); const textInventory = deliveryMethod === AUTO_TXT;

  useEffect(() => {
    Promise.all([api.get('/categories/flat'), api.get(`/products/my/${id}`)]).then(([categoryResponse, productResponse]) => {
      setCategories(categoryResponse.data?.data || categoryResponse.data || []);
      const product = productResponse.data; setName(product.name || ''); setSlug(product.slug || ''); setCategoryId(product.categoryId || ''); setStatus(product.status || 'ACTIVE'); setDeliveryMethod(product.deliveryMethod === 'AUTO' ? AUTO : (product.deliveryMethod || 'MANUAL')); setDeliveryTime(product.deliveryTime || '1 - 24 giờ'); setWarranty(product.warranty || '24 giờ'); setPlatform(product.platform || 'PC'); setDescription(product.description || ''); setImages(product.images?.map((item: any) => item.url) || []);
      setVariants(product.variants?.map((item: any) => ({ id: item.id, name: item.name, price: String(item.price), stock: String(item.stock || 0), inventoryZip: null })) || [{ name: 'Mặc định', price: '', stock: '', inventoryZip: null }]);
    }).catch((requestError: any) => setError(requestError.response?.data?.message || 'Không thể tải sản phẩm.')).finally(() => setLoading(false));
  }, [id]);

  const slugify = (value: string) => value.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/đ/gi, 'd').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');
  const updateVariant = (index: number, key: keyof Variant, value: string | File | null) => {
    if (key === 'inventoryZip' && value instanceof File) {
      const valid = textInventory ? value.name.toLowerCase().endsWith('.txt') : value.name.toLowerCase().endsWith('.zip');
      if (!valid) { setError(textInventory ? 'Kho TXT chỉ nhận tệp .txt.' : 'Kho ZIP chỉ nhận tệp .zip.'); return; }
    }
    setVariants((current) => current.map((item, itemIndex) => itemIndex === index ? { ...item, [key]: value } : item));
  };
  const checks = useMemo(() => [{ label: 'Đã chọn danh mục', ready: Boolean(categoryId) }, { label: 'Tiêu đề sản phẩm rõ ràng', ready: name.trim().length >= 6 }, { label: 'Slug URL hợp lệ', ready: /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug) }, { label: 'Mỗi SKU có giá bán', ready: variants.length > 0 && variants.every((item) => Number(item.price) > 0) }, { label: 'Đã thêm mô tả sản phẩm', ready: description.trim().length >= 20 }], [categoryId, name, slug, variants, description]);
  const progress = Math.round(checks.filter((item) => item.ready).length * 100 / checks.length);

  const uploadImages = async (files: FileList | null) => {
    if (!files?.length) return; const selected = [...files];
    if (images.length + selected.length > 8) return setError('Mỗi sản phẩm tối đa 8 ảnh.');
    if (selected.some((file) => !['image/jpeg', 'image/png', 'image/webp', 'image/gif'].includes(file.type))) return setError('Chỉ nhận ảnh JPG, PNG, WEBP hoặc GIF.');
    if (selected.some((file) => file.size > 10 * 1024 * 1024)) return setError('Mỗi ảnh tối đa 10 MB.');
    setUploadingImages(true); setError('');
    try { for (const file of selected) { const body = new FormData(); body.append('file', file); const url = (await api.post('/upload', body)).data.url as string; setImages((current) => [...current, url]); } } catch (requestError: any) { setError(requestError.response?.data?.message || 'Không thể tải ảnh lên.'); } finally { setUploadingImages(false); }
  };

  const submit = async (event: React.FormEvent) => {
    event.preventDefault(); setError(''); const missing = checks.find((item) => !item.ready); if (missing) return setError(`Chưa thể lưu: ${missing.label.toLowerCase()}.`);
    setSaving(true);
    try {
      const payload = { name: name.trim(), slug, categoryId, status, description: description.trim(), price: Number(variants[0].price), stock: automatic ? 0 : Number(variants[0].stock) || 0, image: images[0] || '', images, deliveryMethod, deliveryTime, warranty, platform, variants: variants.map((item) => ({ id: item.id, name: item.name.trim() || 'Mặc định', price: Number(item.price), stock: automatic ? 0 : Number(item.stock) || 0 })) };
      const updated = await api.patch(`/products/${id}`, payload);
      if (automatic) for (const variant of variants) if (variant.inventoryZip) {
        const savedVariant = variant.id
          ? updated.data.variants.find((item: { id: string }) => item.id === variant.id)
          : updated.data.variants.find((item: { name: string }) => item.name === variant.name);
        if (!savedVariant) throw new Error(`Không tìm thấy SKU ${variant.name} sau khi lưu.`);
        const body = new FormData(); body.append('file', variant.inventoryZip);
        await api.post(`/seller/products/${id}/${textInventory ? 'inventory-txt' : 'inventory-zip'}`, body, { params: { variantId: savedVariant.id } });
      }
      router.push(`/${locale}/seller/products`);
    } catch (requestError: any) { const message = requestError.response?.data?.message; setError(Array.isArray(message) ? message.join(', ') : message || 'Không thể cập nhật sản phẩm.'); } finally { setSaving(false); }
  };

  if (loading) return <div className="flex min-h-[50vh] items-center justify-center"><Loader2 className="animate-spin text-teal-400" /></div>;
  return <form onSubmit={submit} className="mx-auto max-w-[1540px] pb-24 text-white"><div className="mb-6 flex items-center gap-3"><Link href={`/${locale}/seller/products`} className="rounded-lg border border-white/10 bg-white/[0.03] p-2 text-gray-300 hover:bg-white/10"><ChevronLeft className="h-5 w-5" /></Link><div><h1 className="text-2xl font-bold">Chỉnh sửa sản phẩm</h1><p className="mt-1 text-sm text-gray-500">Cùng bố cục với tạo sản phẩm. Kho ZIP hoặc TXT hiện có được giữ nguyên khi lưu.</p></div></div><div className="grid gap-6 xl:grid-cols-[minmax(0,1fr)_330px]"><main className="space-y-5">
    <section className="rounded-2xl border border-white/10 bg-[#121315] p-5"><Step n="1" title="Thông tin cơ bản" /><div className="mt-5 grid gap-4 md:grid-cols-2"><Field label="Tên sản phẩm" required><input className="input" value={name} onChange={(event) => { setName(event.target.value); setSlug(slugify(event.target.value)); }} /></Field><Field label="Danh mục" required><select className="input" value={categoryId} onChange={(event) => setCategoryId(event.target.value)}><option value="">Chọn danh mục</option>{categories.map((item) => <option key={item.id} value={item.id}>{item.name}</option>)}</select></Field><Field label="Slug URL" required><div className="flex overflow-hidden rounded-xl border border-white/10 bg-black/30"><span className="px-3 py-3 text-xs text-gray-500">shopmmo.vn/</span><input className="min-w-0 flex-1 bg-transparent px-3 text-sm outline-none" value={slug} onChange={(event) => setSlug(slugify(event.target.value))} /></div></Field><Field label="Trạng thái"><select className="input" value={status} onChange={(event) => setStatus(event.target.value)}><option value="ACTIVE">Đang bán</option><option value="INACTIVE">Tạm ẩn</option><option value="PENDING">Chờ duyệt</option></select></Field></div></section>
    <section className="rounded-2xl border border-white/10 bg-[#121315] p-5"><Step n="2" title="Giao hàng / tồn kho" /><div className="mt-5 grid gap-4 md:grid-cols-2 xl:grid-cols-4"><Field label="Cách giao hàng"><select className="input" value={deliveryMethod} onChange={(event) => setDeliveryMethod(event.target.value)}><option value="MANUAL">Giao thủ công</option><option value={AUTO}>Giao tự động bằng ZIP</option><option value={AUTO_TXT}>Giao tự động bằng TXT</option></select></Field><Field label="Thời gian giao"><select className="input" value={deliveryTime} onChange={(event) => setDeliveryTime(event.target.value)}><option>Ngay lập tức</option><option>1 - 24 giờ</option><option>1 - 3 ngày</option></select></Field><Field label="Bảo hành"><input className="input" value={warranty} onChange={(event) => setWarranty(event.target.value)} /></Field><Field label="Nền tảng"><input className="input" value={platform} onChange={(event) => setPlatform(event.target.value)} /></Field></div>{automatic && <p className="mt-3 text-xs text-teal-300">{textInventory ? 'TXT: mỗi dòng abc|pass|thông tin là một tài khoản.' : 'ZIP: mỗi thư mục cấp một là một tài khoản.'} Kho cũ không bị ghi đè.</p>}</section>
    <section className="overflow-hidden rounded-2xl border border-white/10 bg-[#121315]"><div className="flex items-center justify-between gap-3 border-b border-white/10 p-5"><div><Step n="3" title="Giá / SKU" /><p className="mt-2 text-sm text-gray-500">SKU cũ giữ nguyên liên kết kho; chỉ SKU chưa có hàng mới có thể xóa.</p></div><button type="button" onClick={() => setVariants((current) => [...current, { name: '', price: '', stock: '', inventoryZip: null }])} className="inline-flex items-center gap-2 rounded-xl border border-white/15 bg-white/5 px-4 py-2 text-sm font-bold"><Plus className="h-4 w-4" />Thêm SKU</button></div><div className="hidden grid-cols-[minmax(130px,1.2fr)_120px_115px_180px_42px] gap-3 border-b border-white/10 px-5 py-3 text-xs font-bold uppercase text-gray-500 md:grid"><span>Tên biến thể</span><span>Giá (VND)</span><span>Tồn kho</span><span>{textInventory ? 'Kho TXT riêng' : 'Kho ZIP riêng'}</span><span /></div><div className="divide-y divide-white/10">{variants.map((variant, index) => <div key={variant.id || index} className="grid gap-3 p-5 md:grid-cols-[minmax(130px,1.2fr)_120px_115px_180px_42px]"><input className="input" value={variant.name} onChange={(event) => updateVariant(index, 'name', event.target.value)} placeholder="Tên biến thể" /><input className="input" type="number" min="1" value={variant.price} onChange={(event) => updateVariant(index, 'price', event.target.value)} /><input className="input disabled:text-gray-600" type="number" disabled={automatic} value={automatic ? '' : variant.stock} onChange={(event) => updateVariant(index, 'stock', event.target.value)} placeholder={automatic ? (textInventory ? 'Theo TXT' : 'Theo ZIP') : '0'} />{automatic ? <label className="flex cursor-pointer items-center gap-2 rounded-xl border border-dashed border-teal-400/40 bg-teal-400/5 px-3 py-3 text-xs text-teal-200"><FileArchive className="h-4 w-4 shrink-0" /><span className="truncate">{variant.inventoryZip?.name || (textInventory ? 'Bổ sung TXT (tùy chọn)' : 'Bổ sung ZIP (tùy chọn)')}</span><input className="hidden" type="file" accept={textInventory ? '.txt,text/plain' : '.zip,application/zip'} onChange={(event) => updateVariant(index, 'inventoryZip', event.target.files?.[0] || null)} /></label> : <span className="rounded-xl border border-white/10 bg-black/30 px-3 py-3 text-xs text-gray-500">Kho thủ công</span>}<button type="button" disabled={variants.length === 1} onClick={() => setVariants((current) => current.length > 1 ? current.filter((_, itemIndex) => itemIndex !== index) : current)} className="rounded-lg p-2 text-gray-500 hover:text-red-400 disabled:opacity-30"><Trash2 className="h-4 w-4" /></button></div>)}</div></section>
    <section className="rounded-2xl border border-white/10 bg-[#121315] p-5"><Step n="4" title="Mô tả / hình ảnh" /><div className="mt-5 grid gap-5 lg:grid-cols-2"><Field label="Mô tả sản phẩm" required><textarea className="input resize-y" rows={7} value={description} onChange={(event) => setDescription(event.target.value)} /></Field><div><Field label="Ảnh sản phẩm từ máy tính"><label className="flex cursor-pointer items-center justify-center gap-2 rounded-xl border border-dashed border-teal-400/40 bg-teal-400/5 px-4 py-5 text-sm font-semibold text-teal-200 hover:bg-teal-400/10"><Upload className="h-5 w-5" />{uploadingImages ? 'Đang tải ảnh lên...' : 'Chọn ảnh từ máy tính'}<input className="hidden" type="file" accept="image/*" multiple disabled={uploadingImages} onChange={(event) => { void uploadImages(event.target.files); event.currentTarget.value = ''; }} /></label><p className="mt-2 text-xs text-gray-500">JPG, PNG, WEBP; tối đa 10 MB mỗi ảnh.</p></Field><div className="mt-3 grid grid-cols-3 gap-2">{images.map((url) => <div key={url} className="group relative aspect-video overflow-hidden rounded-lg border border-white/10"><img src={url} alt="" className="h-full w-full object-cover" /><button type="button" onClick={() => setImages((current) => current.filter((item) => item !== url))} className="absolute right-1 top-1 hidden rounded bg-black/70 p-1 text-red-300 group-hover:block"><Trash2 className="h-3 w-3" /></button></div>)}{!images.length && <div className="col-span-3 flex aspect-video items-center justify-center rounded-xl border border-dashed border-white/10 text-xs text-gray-600"><ImagePlus className="mr-2 h-4 w-4" />Chưa có ảnh</div>}</div></div></div></section>
  </main><aside className="space-y-5 xl:sticky xl:top-5 xl:self-start"><section className="rounded-2xl border border-white/10 bg-[#121315] p-5"><h2 className="font-bold">Xem trước sản phẩm</h2><div className="mt-4 rounded-xl border border-white/10 bg-black/30 p-3"><div className="flex gap-3"><div className="flex h-20 w-20 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-white/5">{images[0] ? <img src={images[0]} alt="" className="h-full w-full object-cover" /> : <Package className="h-7 w-7 text-gray-600" />}</div><div className="min-w-0"><p className="line-clamp-2 text-sm font-bold">{name || 'Tên sản phẩm'}</p><p className="mt-2 font-bold text-red-400">{variants[0]?.price ? `${Number(variants[0].price).toLocaleString('vi-VN')} đ` : 'Đặt giá'}</p><span className="mt-2 inline-block rounded bg-white/10 px-2 py-1 text-[10px] text-gray-300">{automatic ? 'Giao tự động' : 'Giao thủ công'}</span></div></div></div></section><section className="rounded-2xl border border-white/10 bg-[#121315] p-5"><div className="flex items-center justify-between"><h2 className="font-bold">Kiểm tra trước khi lưu</h2><span className="text-lg font-black text-teal-300">{progress}%</span></div><ul className="mt-4 space-y-2">{checks.map((item) => <li key={item.label} className={`flex gap-2 text-xs ${item.ready ? 'text-teal-300' : 'text-amber-300'}`}>{item.ready ? <CheckCircle2 className="h-4 w-4" /> : <AlertTriangle className="h-4 w-4" />}{item.label}</li>)}</ul></section>{error && <div className="flex gap-2 rounded-xl border border-red-500/30 bg-red-500/10 p-4 text-sm text-red-200"><CircleAlert className="h-5 w-5 shrink-0" />{error}</div>}<button type="submit" disabled={saving || uploadingImages} className="flex w-full items-center justify-center gap-2 rounded-xl bg-gradient-to-r from-rose-500 to-red-500 py-4 font-bold text-white disabled:opacity-60">{saving ? <Loader2 className="h-5 w-5 animate-spin" /> : <Save className="h-5 w-5" />}{saving ? 'Đang lưu...' : 'Lưu thay đổi'}</button></aside></div></form>;
}

function Step({ n, title }: { n: string; title: string }) { return <h2 className="flex items-center gap-2 text-lg font-bold"><span className="flex h-6 w-6 items-center justify-center rounded-full bg-rose-500 text-xs">{n}</span>{title}</h2>; }
function Field({ label, required, children }: { label: string; required?: boolean; children: React.ReactNode }) { return <label className="block text-sm font-semibold text-gray-200"><span className="mb-2 block">{label}{required && <span className="ml-1 text-rose-400">*</span>}</span>{children}</label>; }
