'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, Send, Trash2, Upload } from 'lucide-react';
import { api } from '@/lib/api';

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

export default function CreateProductPage() {
  const router = useRouter();
  const { locale } = useParams<{ locale: string }>();
  const [categories, setCategories] = useState<Category[]>([]);
  const [name, setName] = useState(''); const [slug, setSlug] = useState(''); const [categoryId, setCategoryId] = useState('');
  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 [uploadingImages, setUploadingImages] = useState(false);
  const [variants, setVariants] = useState<Variant[]>([{ name: 'Mặc định', price: '', stock: '', inventoryZip: null }]);
  const [error, setError] = useState(''); const [loading, setLoading] = useState(false);
  const automatic = [AUTO_ZIP, AUTO_TXT].includes(deliveryMethod);
  const textInventory = deliveryMethod === AUTO_TXT;

  useEffect(() => { api.get('/categories/flat').then((res) => { const rows = res.data?.data || res.data || []; setCategories(rows); if (!rows.length) setError('Cơ sở dữ liệu chưa có danh mục.'); }).catch(() => setError('Không thể kết nối API danh mục.')); }, []);
  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.every((item) => Number(item.price) > 0) },
    { label: automatic ? 'Mỗi SKU đã có file kho ZIP hoặc TXT riêng' : 'Đã chọn cách giao hàng', ready: !automatic || variants.every((item) => item.inventoryZip) }, { label: 'Đã thêm mô tả sản phẩm', ready: description.trim().length >= 20 },
  ], [categoryId, name, slug, variants, automatic, 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 (uploadError: any) { setError(uploadError.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ể đăng sản phẩm: ${missing.label.toLowerCase()}.`);
    setLoading(true);
    try {
      const payload = { name: name.trim(), slug, categoryId, 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) => ({ name: item.name.trim() || 'Mặc định', price: Number(item.price), stock: automatic ? 0 : Number(item.stock) || 0 })) };
      const created = await api.post('/products', payload);
      if (automatic) for (const [index, variant] of variants.entries()) { const body = new FormData(); const file = variant.inventoryZip as File; body.append('file', file); await api.post(`/seller/products/${created.data.id}/${textInventory ? 'inventory-txt' : 'inventory-zip'}`, body, { params: { variantId: created.data.variants[index].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ể đăng sản phẩm.'); } finally { setLoading(false); }
  };

  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">Tạo sản phẩm mới</h1><p className="mt-1 text-sm text-gray-500">Thiết lập thông tin bán hàng, SKU và kho ZIP riêng theo từng biến thể.</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)); }} placeholder="Ví dụ: Key bản quyền Windows 11 Pro" /></Field><Field label="Danh mục" required><select className="input" disabled={!categories.length} value={categoryId} onChange={(event) => setCategoryId(event.target.value)}><option value="">{categories.length ? 'Chọn danh mục' : 'Đang tải danh mục...'}</option>{categories.map((item) => <option key={item.id} value={item.id}>{item.name}</option>)}</select><p className="mt-2 text-xs text-gray-500">Dữ liệu lấy trực tiếp từ MySQL.</p></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="Nền tảng"><div className="flex flex-wrap gap-2 rounded-xl border border-white/10 bg-black/30 p-2">{['PC', 'Android', 'iOS', 'VN'].map((item) => <button type="button" key={item} onClick={() => setPlatform(item)} className={`rounded-lg px-3 py-1.5 text-xs font-semibold ${platform === item ? 'bg-teal-400 text-black' : 'bg-white/5 text-gray-400'}`}>{item}</button>)}</div></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_ZIP}>Giao tự động bằng ZIP</option><option value={AUTO_TXT}>Giao tự động bằng TXT</option></select><p className="mt-2 text-xs leading-5 text-gray-500">{deliveryMethod === AUTO_ZIP ? 'ZIP gồm các thư mục; mỗi thư mục là một tài khoản.' : deliveryMethod === AUTO_TXT ? 'TXT: mỗi dòng abc|pass|thông tin là một tài khoản.' : 'Seller xác nhận bàn giao đơn hàng.'}</p></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="Loại kho"><div className={`rounded-xl border px-3 py-3 text-sm font-semibold ${automatic ? 'border-teal-400/30 bg-teal-400/10 text-teal-300' : 'border-white/10 bg-black/30 text-gray-400'}`}>{deliveryMethod === AUTO_ZIP ? 'Kho ZIP theo SKU' : deliveryMethod === AUTO_TXT ? 'Kho TXT theo SKU' : 'Tồn kho thủ công'}</div></Field></div></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">Mỗi SKU có giá và kho tách biệt.</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>Kho ZIP / TXT riêng</span><span /></div><div className="divide-y divide-white/10">{variants.map((variant, index) => <div key={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)} placeholder="49000" /><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 ? 'Theo kho' : '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 || 'Chọn ZIP hoặc TXT cho SKU'}</span><input className="hidden" type="file" accept=".zip,.txt,application/zip,text/plain" 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)} placeholder="Mô tả chi tiết, hướng dẫn sử dụng và chính sách bảo hành..." /></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 gửi</h2><span className="text-lg font-black text-teal-300">{progress}%</span></div><div className="mt-3 h-1.5 overflow-hidden rounded-full bg-white/10"><div className="h-full bg-gradient-to-r from-rose-400 to-teal-400" style={{ width: `${progress}%` }} /></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={loading || 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">{loading ? <Loader2 className="h-5 w-5 animate-spin" /> : <Send className="h-5 w-5" />}{loading ? 'Đang đăng sản phẩm...' : 'Đăng sản phẩm'}</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>; }
