'use client';

import { useEffect, useState, type ReactNode } from 'react';
import { api } from '@/lib/api';

type Tab = 'overview' | 'config' | 'menu' | 'payment' | 'catalog' | 'users' | 'audit';
type BotConfig = {
  displayName: string;
  botUsername: string;
  backendBaseUrl: string;
  internalApiUrl: string;
  pollingEnabled: boolean;
  botEnabled: boolean;
  tokenConfigured: boolean;
  hmacConfigured: boolean;
};
type PaymentConfig = {
  enabled: boolean;
  providerCode: string;
  paymentAccountId: string | null;
  currency: string;
  depositPrefix: string;
  minDepositAmount: number;
  maxDepositAmount: number;
  depositExpiryMinutes: number;
  qrEnabled: boolean;
  paymentAccountStatus: string;
  providerStatus: string;
  paymentAccountMasked: string | null;
};
type Account = { id: string; accountName: string; accountNumber: string | null; providerCode: string; currency: string; status: string; isDefault: boolean };
type CatalogCategory = { id: string; name: string; slug: string; description?: string | null; icon?: string | null; status: string; enabled: boolean; productCount: number };
type Product = { id: string; categoryId: string; category: { id: string; name: string }; name: string; price: number; currency: string; stock: number; status: string; enabled: boolean; pinned: boolean; shortDescription?: string | null; deliveryType: string };
type User = { telegramUserId: string | null; telegramUsername: string | null; linkedAt?: string | null; isActive: boolean; user: { id: string; username: string | null; name: string | null; role: { name: string } } };
type UserDetail = {
  telegram: { telegramUserId: string; username: string | null; linkedAt: string; isActive: boolean };
  user: { id: string; username: string | null; name: string | null; role: string; joinedAt: string };
  wallets: {
    account: { availableBalance: number; lockedBalance: number; currency: string; status: string } | null;
    seller: { availableBalance: number; pendingBalance: number; currency: string; status: string } | null;
  };
  deposits: Array<{ id: string; depositCode: string; amount: number; matchedAmount: number; currency: string; status: string; createdAt: string; completedAt: string | null }>;
  orders: Array<{ id: string; totalAmount: number; status: string; role: string; createdAt: string; items: Array<{ quantity: number; price: number; product: { name: string } }> }>;
};

const tabs: Array<[Tab, string]> = [
  ['overview', 'Tổng quan'],
  ['config', 'Cấu hình bot'],
  ['menu', 'Menu Telegram'],
  ['payment', 'Nạp tiền'],
  ['catalog', 'Sản phẩm'],
  ['users', 'Người dùng'],
  ['audit', 'Lịch sử thao tác'],
];

export default function AdminTelegramPage() {
  const [tab, setTab] = useState<Tab>('overview');
  const [config, setConfig] = useState<BotConfig | null>(null);
  const [menu, setMenu] = useState<Record<string, string>>({});
  const [payment, setPayment] = useState<PaymentConfig | null>(null);
  const [readiness, setReadiness] = useState<{ status: string; failed: string[] } | null>(null);
  const [accounts, setAccounts] = useState<Account[]>([]);
  const [products, setProducts] = useState<Product[]>([]);
  const [categories, setCategories] = useState<CatalogCategory[]>([]);
  const [catalogSection, setCatalogSection] = useState<'categories' | 'products' | 'inventory' | 'orders'>('categories');
  const [selectedCatalogProduct, setSelectedCatalogProduct] = useState<string | null>(null);
  const [inventory, setInventory] = useState<{ batches: Array<{ id: string; batchCode: string; status: string; totalItems: number; availableItems: number; soldItems: number }>; items: Array<{ id: string; inventoryCode: string; status: string; checksum: string | null }> }>({ batches: [], items: [] });
  const [categoryForm, setCategoryForm] = useState({ name: '', description: '', icon: '📁' });
  const [productForm, setProductForm] = useState({ categoryId: '', name: '', price: '', description: '', deliveryType: 'AUTO_TEXT', minQuantity: '1', maxQuantity: '10', quantityStep: '1', allowCustomQuantity: true, maxQuantityPerUserPerDay: '' });
  const [inventoryText, setInventoryText] = useState('');
  const [inventoryZip, setInventoryZip] = useState<File | null>(null);
  const [users, setUsers] = useState<User[]>([]);
  const [selectedUser, setSelectedUser] = useState<string | null>(null);
  const [userDetail, setUserDetail] = useState<UserDetail | null>(null);
  const [audit, setAudit] = useState<Array<{ id: string; action: string; entity: string; createdAt: string }>>([]);
  const [secret, setSecret] = useState({ botToken: '', hmacSecret: '' });
  const [newAccount, setNewAccount] = useState({ providerCode: 'SEPAY', accountName: '', accountNumber: '', bankCode: '', bankName: '', currency: 'VND' });
  const [message, setMessage] = useState('');
  const [error, setError] = useState('');

  const load = async () => {
    try {
      const [configRes, menuRes, paymentRes, readinessRes, accountsRes, categoriesRes, productsRes, usersRes, auditRes] = await Promise.all([
        api.get('/admin/telegram/config'),
        api.get('/admin/telegram/menu'),
        api.get('/admin/telegram/payment'),
        api.post('/admin/telegram/payment/readiness'),
        api.get('/admin/telegram/payment-accounts'),
        api.get('/admin/telegram/catalog/categories'),
        api.get('/admin/telegram/catalog/products'),
        api.get('/admin/telegram/users'),
        api.get('/admin/telegram/audit'),
      ]);
      setConfig(configRes.data);
      setMenu(menuRes.data || {});
      setPayment(paymentRes.data);
      setReadiness(readinessRes.data);
      setAccounts(accountsRes.data || []);
      setCategories(categoriesRes.data || []);
      setProducts(productsRes.data || []);
      setUsers(usersRes.data || []);
      setAudit(auditRes.data || []);
      setError('');
    } catch {
      setError('Không thể tải quản lý Bot Telegram. Hãy đăng nhập bằng tài khoản quản trị.');
    }
  };

  useEffect(() => { void load(); }, []);

  const saveConfig = async () => {
    try { if (!config) return; await api.patch('/admin/telegram/config', config); setMessage('Đã lưu cấu hình bot.'); await load(); }
    catch { setError('Không lưu được cấu hình bot.'); }
  };
  const saveSecrets = async () => {
    try { if (!secret.botToken && !secret.hmacSecret) return; await api.patch('/admin/telegram/config/secrets', secret); setSecret({ botToken: '', hmacSecret: '' }); setMessage('Đã lưu khóa bảo mật.'); await load(); }
    catch { setError('Không lưu được khóa bảo mật.'); }
  };
  const saveMenu = async () => {
    try { await api.patch('/admin/telegram/menu', menu); setMessage('Đã lưu menu Telegram.'); await load(); }
    catch { setError('Không lưu được menu Telegram.'); }
  };
  const savePayment = async () => {
    try { if (!payment) return; await api.patch('/admin/telegram/payment', payment); setMessage('Đã lưu cấu hình nạp tiền.'); await load(); }
    catch { setError('Không lưu được cấu hình nạp tiền.'); }
  };
  const createAccount = async () => {
    try {
      const response = await api.post('/admin/telegram/payment-accounts', newAccount);
      const accountId = response.data?.id as string | undefined;
      if (accountId && payment) await api.patch('/admin/telegram/payment', { ...payment, paymentAccountId: accountId });
      setNewAccount({ providerCode: 'SEPAY', accountName: '', accountNumber: '', bankCode: '', bankName: '', currency: 'VND' });
      setMessage(accountId ? 'Đã thêm và chọn tài khoản nhận tiền.' : 'Đã thêm tài khoản ngân hàng.');
      await load();
    }
    catch { setError('Không lưu được tài khoản ngân hàng hoặc chưa thể chọn tài khoản này.'); }
  };
  const updateConfig = <K extends keyof BotConfig>(key: K, value: BotConfig[K]) => setConfig((current) => current ? { ...current, [key]: value } : current);
  const updatePayment = <K extends keyof PaymentConfig>(key: K, value: PaymentConfig[K]) => setPayment((current) => current ? { ...current, [key]: value } : current);
  const toggleProduct = async (product: Product) => { await api.patch(`/admin/telegram/catalog/products/${product.id}`, { enabled: !product.enabled, status: product.enabled ? 'HIDDEN' : 'ACTIVE' }); await load(); };
  const deleteCategory = async (category: CatalogCategory) => { if (!window.confirm(`Xoá danh mục “${category.name}”? Chỉ danh mục không còn sản phẩm mới được xoá.`)) return; try { await api.delete(`/admin/telegram/catalog/categories/${category.id}`); setMessage('Đã xoá danh mục.'); await load(); } catch { setError('Không thể xoá danh mục đang có sản phẩm.'); } };
  const deleteProduct = async (product: Product) => { if (!window.confirm(`Xoá sản phẩm “${product.name}” và toàn bộ kho chưa bán?`)) return; try { await api.delete(`/admin/telegram/catalog/products/${product.id}`); setMessage('Đã xoá sản phẩm và kho chưa bán.'); if (selectedCatalogProduct === product.id) { setSelectedCatalogProduct(null); setInventory({ batches: [], items: [] }); } await load(); } catch { setError('Không thể xoá sản phẩm đã phát sinh đơn hàng. Hãy ẩn sản phẩm.'); } };
  const deleteInventoryItem = async (itemId: string) => { if (!selectedCatalogProduct || !window.confirm('Xoá hàng này khỏi kho Telegram?')) return; try { await api.delete(`/admin/telegram/catalog/products/${selectedCatalogProduct}/inventory/${itemId}`); setMessage('Đã xoá hàng khỏi kho.'); await loadInventory(selectedCatalogProduct); await load(); } catch { setError('Không thể xoá hàng đã bán hoặc đang được giữ chỗ.'); } };
  const createCategory = async () => { await api.post('/admin/telegram/catalog/categories', { ...categoryForm, status: 'ACTIVE' }); setCategoryForm({ name: '', description: '', icon: '📁' }); await load(); };
  const createProduct = async () => { const minQuantity = Number(productForm.minQuantity); const maxQuantity = Number(productForm.maxQuantity); const quantityStep = Number(productForm.quantityStep); if (!Number.isInteger(minQuantity) || !Number.isInteger(maxQuantity) || !Number.isInteger(quantityStep) || minQuantity < 1 || maxQuantity < minQuantity || quantityStep < 1) { setError('Thiết lập số lượng không hợp lệ'); return; } await api.post('/admin/telegram/catalog/products', { ...productForm, price: Number(productForm.price), minQuantity, maxQuantity, quantityStep, maxQuantityPerUserPerDay: productForm.maxQuantityPerUserPerDay ? Number(productForm.maxQuantityPerUserPerDay) : null, productType: 'ZIP_ITEM', deliveryType: 'AUTO_ZIP', status: 'ACTIVE', enabled: true }); setProductForm({ categoryId: '', name: '', price: '', description: '', deliveryType: 'AUTO_TEXT', minQuantity: '1', maxQuantity: '10', quantityStep: '1', allowCustomQuantity: true, maxQuantityPerUserPerDay: '' }); await load(); };
  const loadInventory = async (productId: string) => { setSelectedCatalogProduct(productId); setInventory((await api.get(`/admin/telegram/catalog/products/${productId}/inventory`)).data); };
  const importInventory = async () => { if (!selectedCatalogProduct || !inventoryText.trim()) return; await api.post(`/admin/telegram/catalog/products/${selectedCatalogProduct}/inventory/text`, { content: inventoryText }); setInventoryText(''); await loadInventory(selectedCatalogProduct); await load(); };
  const importInventoryZip = async () => { if (!selectedCatalogProduct || !inventoryZip) return; const form = new FormData(); form.append('file', inventoryZip); await api.post(`/admin/telegram/catalog/products/${selectedCatalogProduct}/inventory/zip`, form, { headers: { 'Content-Type': 'multipart/form-data' } }); setInventoryZip(null); await loadInventory(selectedCatalogProduct); await load(); };
  const toggleUser = async (user: User) => { if (user.telegramUserId) { await api.patch(`/admin/telegram/users/${user.telegramUserId}`, { isActive: !user.isActive }); await load(); } };
  const showUserDetail = async (user: User) => { if (!user.telegramUserId) return; setSelectedUser(user.telegramUserId); setUserDetail((await api.get(`/admin/telegram/users/${user.telegramUserId}`)).data); };

  return <main className="space-y-6 p-5 text-white sm:p-8">
    <header><p className="text-xs font-bold uppercase tracking-[.2em] text-cyan-400">SHOPMMO ADMIN</p><h1 className="mt-2 text-3xl font-black">Quản lý Bot Telegram</h1><p className="mt-2 text-sm text-zinc-400">Quản lý bot, menu, tài khoản nhận tiền và sản phẩm được phép hiển thị.</p></header>
    {error && <p className="rounded-lg border border-red-400/30 bg-red-400/10 p-3 text-sm text-red-200">{error}</p>}
    {message && <p className="rounded-lg border border-emerald-400/30 bg-emerald-400/10 p-3 text-sm text-emerald-200">{message}</p>}
    <nav className="flex flex-wrap gap-2">{tabs.map(([key, label]) => <button key={key} type="button" onClick={() => setTab(key)} className={`rounded-lg px-3 py-2 text-sm font-bold ${tab === key ? 'bg-cyan-500 text-slate-950' : 'bg-white/10 text-zinc-300'}`}>{label}</button>)}</nav>

    {tab === 'overview' && <section className="grid gap-4 md:grid-cols-3"><Card title="Trạng thái bot"><Status label="Mã bot" ok={Boolean(config?.tokenConfigured)} /><Status label="Khóa kết nối" ok={Boolean(config?.hmacConfigured)} /><Status label="Đang bật" ok={Boolean(config?.botEnabled)} /></Card><Card title="Mức sẵn sàng"><p className={`text-2xl font-black ${readiness?.status === 'READY' ? 'text-emerald-300' : 'text-amber-300'}`}>{readiness?.status || 'Đang kiểm tra'}</p><p className="mt-2 text-xs text-zinc-400">{readiness?.failed?.join(', ') || 'Đã đạt điều kiện cơ bản.'}</p></Card><Card title="Tài khoản nhận tiền"><p className="text-2xl font-black">{payment?.paymentAccountStatus || 'Chưa có'}</p><p className="mt-2 text-xs text-zinc-400">{payment?.paymentAccountMasked || 'Chưa chọn tài khoản nhận tiền'}</p></Card></section>}

    {tab === 'config' && <section className="space-y-4 rounded-2xl border border-white/10 bg-[#121315] p-5"><h2 className="font-black">Cấu hình bot</h2><p className="text-sm text-zinc-400">Mã bot là tên người dùng trên Telegram. Địa chỉ máy chủ là URL API công khai; địa chỉ nội bộ là URL backend trong Docker. Khóa bảo mật là HMAC dùng để ký request giữa bot và backend, không phải mật khẩu hay token Telegram.</p>{config && <div className="grid gap-3 md:grid-cols-2"><TextField label="Tên hiển thị" value={config.displayName} onChange={(value) => updateConfig('displayName', value)} /><TextField label="Tên người dùng Bot" value={config.botUsername} onChange={(value) => updateConfig('botUsername', value)} /><TextField label="Địa chỉ máy chủ" value={config.backendBaseUrl} onChange={(value) => updateConfig('backendBaseUrl', value)} /><TextField label="Địa chỉ kết nối nội bộ" value={config.internalApiUrl} onChange={(value) => updateConfig('internalApiUrl', value)} /><Check label="Tự động nhận tin nhắn" checked={config.pollingEnabled} onChange={(value) => updateConfig('pollingEnabled', value)} /><Check label="Bật bot" checked={config.botEnabled} onChange={(value) => updateConfig('botEnabled', value)} /></div>}<button type="button" onClick={() => void saveConfig()} className="rounded-lg bg-cyan-500 px-4 py-2 font-bold text-slate-950">Lưu cấu hình</button><div className="border-t border-white/10 pt-4"><h3 className="font-bold">Thay khóa bảo mật</h3><p className="mt-1 text-xs text-zinc-400">Token Telegram lấy từ BotFather. Khóa HMAC phải giống nhau ở bot và backend. Không dán các giá trị này vào báo cáo hoặc chat.</p><div className="mt-3 grid gap-3 md:grid-cols-2"><label className="space-y-1 text-sm"><span className="text-zinc-400">Mã bot Telegram (token BotFather)</span><input className="w-full rounded-lg border border-white/10 bg-black/30 p-3" type="password" placeholder="Dán token BotFather tại đây" value={secret.botToken} onChange={(event) => setSecret({ ...secret, botToken: event.target.value })} /></label><label className="space-y-1 text-sm"><span className="text-zinc-400">Khóa HMAC kết nối bot</span><input className="w-full rounded-lg border border-white/10 bg-black/30 p-3" type="password" placeholder="Nhập khóa HMAC dùng chung" value={secret.hmacSecret} onChange={(event) => setSecret({ ...secret, hmacSecret: event.target.value })} /></label></div><button type="button" onClick={() => void saveSecrets()} className="mt-3 rounded-lg bg-amber-400 px-4 py-2 font-bold text-slate-950">Lưu khóa bảo mật</button></div></section>}

    {tab === 'menu' && <section className="space-y-4 rounded-2xl border border-white/10 bg-[#121315] p-5"><h2 className="font-black">Chỉnh sửa chữ trên menu Telegram</h2><p className="text-xs text-zinc-400">Bạn có thể đổi biểu tượng và nội dung từng nút. Bot sẽ dùng nội dung mới từ lần mở menu tiếp theo.</p><div className="grid gap-3 md:grid-cols-2">{Object.entries(menu).map(([key, value]) => <TextField key={key} label={key} value={value} onChange={(next) => setMenu({ ...menu, [key]: next })} />)}</div><button type="button" onClick={() => void saveMenu()} className="rounded-lg bg-cyan-500 px-4 py-2 font-bold text-slate-950">Lưu menu</button></section>}

    {tab === 'payment' && <section className="space-y-4 rounded-2xl border border-white/10 bg-[#121315] p-5"><h2 className="font-black">Cấu hình QR nạp tiền</h2>{payment && <div className="grid gap-3 md:grid-cols-3"><TextField label="Mã nội dung chuyển khoản" value={payment.depositPrefix} onChange={(value) => updatePayment('depositPrefix', value)} /><TextField label="Mức nạp tối thiểu (VNĐ)" value={String(payment.minDepositAmount)} onChange={(value) => updatePayment('minDepositAmount', Number(value))} /><TextField label="Mức nạp tối đa (VNĐ)" value={String(payment.maxDepositAmount)} onChange={(value) => updatePayment('maxDepositAmount', Number(value))} /><TextField label="Thời hạn (phút)" value={String(payment.depositExpiryMinutes)} onChange={(value) => updatePayment('depositExpiryMinutes', Number(value))} /><label className="space-y-1 text-sm"><span className="text-zinc-400">Tài khoản nhận tiền</span><select className="w-full rounded-lg border border-white/10 bg-black/30 p-3" value={payment.paymentAccountId || ''} onChange={(event) => updatePayment('paymentAccountId', event.target.value || null)}><option value="">Chưa chọn</option>{accounts.map((account) => <option key={account.id} value={account.id} disabled={account.status !== 'ACTIVE'}>{account.accountName} · {account.providerCode} · {account.status}</option>)}</select></label><Check label="Bật nạp tiền" checked={payment.enabled} onChange={(value) => updatePayment('enabled', value)} /><Check label="Hiển thị mã QR VietQR" checked={payment.qrEnabled} onChange={(value) => updatePayment('qrEnabled', value)} /></div>}<button type="button" onClick={() => void savePayment()} className="rounded-lg bg-cyan-500 px-4 py-2 font-bold text-slate-950">Lưu cấu hình nạp tiền</button><p className="text-xs text-zinc-400">Mã QR cần tài khoản nhận tiền đang hoạt động, có mã ngân hàng VietQR và số tài khoản.</p><h3 className="border-t border-white/10 pt-4 font-bold">Thêm tài khoản ngân hàng</h3><div className="grid gap-3 md:grid-cols-3"><TextField label="Tên chủ tài khoản" value={newAccount.accountName} onChange={(value) => setNewAccount({ ...newAccount, accountName: value })} /><TextField label="Số tài khoản" value={newAccount.accountNumber} onChange={(value) => setNewAccount({ ...newAccount, accountNumber: value })} /><TextField label="Mã ngân hàng VietQR" value={newAccount.bankCode} onChange={(value) => setNewAccount({ ...newAccount, bankCode: value.toUpperCase() })} /><TextField label="Tên ngân hàng" value={newAccount.bankName} onChange={(value) => setNewAccount({ ...newAccount, bankName: value })} /></div><button type="button" onClick={() => void createAccount()} className="rounded-lg bg-emerald-500 px-4 py-2 font-bold text-slate-950">Thêm tài khoản</button><h3 className="border-t border-white/10 pt-4 font-bold">Tài khoản nhận tiền hiện có</h3>{accounts.map((account) => <Row key={account.id} title={`${account.accountName} · ${account.providerCode}`} detail={`${account.accountNumber || 'Đã ẩn'} · ${account.currency}`} action={<span className={account.status === 'ACTIVE' ? 'text-emerald-300' : 'text-zinc-500'}>{account.status === 'ACTIVE' ? 'Đang dùng' : account.status}</span>} />)}</section>}

    {tab === 'catalog' && <section className="space-y-4 rounded-2xl border border-white/10 bg-[#121315] p-5"><div><h2 className="font-black">Danh mục và kho riêng của Telegram</h2><p className="mt-1 text-sm text-zinc-400">Các sản phẩm tại đây do Admin quản lý riêng, không lấy từ gian hàng người bán trên website.</p></div><nav className="flex flex-wrap gap-2">{([['categories', 'Danh mục'], ['products', 'Sản phẩm'], ['inventory', 'Kho hàng'], ['orders', 'Đơn Telegram']] as const).map(([key, label]) => <button key={key} type="button" onClick={() => setCatalogSection(key)} className={`rounded-lg px-3 py-2 text-sm font-bold ${catalogSection === key ? 'bg-cyan-500 text-slate-950' : 'bg-white/10 text-zinc-300'}`}>{label}</button>)}</nav>{catalogSection === 'categories' && <div className="space-y-3"><div className="grid gap-3 md:grid-cols-3"><TextField label="Tên danh mục" value={categoryForm.name} onChange={(value) => setCategoryForm({ ...categoryForm, name: value })} /><TextField label="Biểu tượng" value={categoryForm.icon} onChange={(value) => setCategoryForm({ ...categoryForm, icon: value })} /><TextField label="Mô tả" value={categoryForm.description} onChange={(value) => setCategoryForm({ ...categoryForm, description: value })} /></div><button type="button" onClick={() => void createCategory()} className="rounded-lg bg-emerald-500 px-4 py-2 font-bold text-slate-950">Tạo danh mục</button>{categories.map((category) => <Row key={category.id} title={`${category.icon || '📁'} ${category.name}`} detail={`${category.productCount} sản phẩm · ${category.status}`} action={<span className={category.enabled ? 'text-emerald-300' : 'text-zinc-500'}>{category.enabled ? 'Đang hiện' : 'Đã ẩn'}</span>} />)}</div>}{catalogSection === 'products' && <div className="space-y-3"><div className="grid gap-3 md:grid-cols-2"><label className="space-y-1 text-sm"><span className="text-zinc-400">Danh mục</span><select className="w-full rounded-lg border border-white/10 bg-black/30 p-3" value={productForm.categoryId} onChange={(event) => setProductForm({ ...productForm, categoryId: event.target.value })}><option value="">Chọn danh mục</option>{categories.map((category) => <option key={category.id} value={category.id}>{category.name}</option>)}</select></label><TextField label="Tên sản phẩm" value={productForm.name} onChange={(value) => setProductForm({ ...productForm, name: value })} /><TextField label="Giá (VNĐ)" value={productForm.price} onChange={(value) => setProductForm({ ...productForm, price: value })} /><TextField label="Mô tả" value={productForm.description} onChange={(value) => setProductForm({ ...productForm, description: value })} /><TextField label="Số lượng tối thiểu" value={productForm.minQuantity} onChange={(value) => setProductForm({ ...productForm, minQuantity: value })} /><TextField label="Số lượng tối đa" value={productForm.maxQuantity} onChange={(value) => setProductForm({ ...productForm, maxQuantity: value })} /><TextField label="Bước số lượng" value={productForm.quantityStep} onChange={(value) => setProductForm({ ...productForm, quantityStep: value })} /><TextField label="Giới hạn mỗi user/ngày (tùy chọn)" value={productForm.maxQuantityPerUserPerDay} onChange={(value) => setProductForm({ ...productForm, maxQuantityPerUserPerDay: value })} /><label className="flex items-center gap-2 text-sm text-zinc-300"><input type="checkbox" checked={productForm.allowCustomQuantity} onChange={(event) => setProductForm({ ...productForm, allowCustomQuantity: event.target.checked })} /> Cho phép khách tự nhập số lượng</label></div><button type="button" onClick={() => void createProduct()} className="rounded-lg bg-emerald-500 px-4 py-2 font-bold text-slate-950">Tạo sản phẩm</button>{products.map((product) => <Row key={product.id} title={product.name} detail={`${product.category.name} · ${Number(product.price).toLocaleString('vi-VN')} ${product.currency} · Kho ${product.stock}`} action={<button type="button" onClick={() => void toggleProduct(product)} className="rounded-lg bg-white/10 px-3 py-2 text-xs">{product.enabled ? 'Đang hiện' : 'Đã ẩn'}</button>} />)}</div>}{catalogSection === 'inventory' && <div className="space-y-3"><label className="space-y-1 text-sm"><span className="text-zinc-400">Chọn sản phẩm</span><select className="w-full rounded-lg border border-white/10 bg-black/30 p-3" value={selectedCatalogProduct || ''} onChange={(event) => void loadInventory(event.target.value)}><option value="">Chọn sản phẩm</option>{products.map((product) => <option key={product.id} value={product.id}>{product.name}</option>)}</select></label><textarea className="min-h-40 w-full rounded-lg border border-white/10 bg-black/30 p-3" placeholder="Mỗi dòng là một sản phẩm giao cho khách" value={inventoryText} onChange={(event) => setInventoryText(event.target.value)} /><button type="button" onClick={() => void importInventory()} className="rounded-lg bg-emerald-500 px-4 py-2 font-bold text-slate-950">Nhập kho từ văn bản</button><label className="space-y-1 text-sm"><span className="text-zinc-400">Hoặc nhập kho từ tệp ZIP (mỗi thư mục là một sản phẩm)</span><input type="file" accept=".zip,application/zip" onChange={(event) => setInventoryZip(event.target.files?.[0] || null)} /></label><button type="button" onClick={() => void importInventoryZip()} disabled={!inventoryZip} className="rounded-lg bg-cyan-500 px-4 py-2 font-bold text-slate-950 disabled:opacity-50">Nhập kho từ ZIP</button>{inventory.batches.map((batch) => <Row key={batch.id} title={batch.batchCode} detail={`${batch.status} · Tổng ${batch.totalItems} · Còn ${batch.availableItems} · Đã bán ${batch.soldItems}`} />)}{inventory.items.map((item) => <Row key={item.id} title={item.inventoryCode} detail={`Mã kiểm tra: ${item.checksum || 'Không có'}`} action={<span className="text-xs text-zinc-400">{item.status}</span>} />)}</div>}{catalogSection === 'orders' && <List title="Đơn hàng Telegram"><p className="text-sm text-zinc-400">Danh sách đơn hàng Telegram được hiển thị qua API quản trị. Không cho phép chỉnh sửa số dư trực tiếp từ màn hình này.</p></List>}</section>}
    {tab === 'users' && <div className="space-y-4"><List title="Người dùng Telegram">{users.map((user) => <Row key={user.telegramUserId || user.user.username} title={user.user.name || user.user.username || 'Người dùng'} detail={`${user.telegramUsername ? `@${user.telegramUsername} · ` : ''}${user.user.role.name}`} action={<div className="flex gap-2">{user.telegramUserId && <button type="button" onClick={() => void showUserDetail(user)} className="rounded-lg bg-cyan-500/20 px-3 py-2 text-xs text-cyan-200">Xem chi tiết</button>}{user.telegramUserId && <button type="button" onClick={() => void toggleUser(user)} className="rounded-lg bg-white/10 px-3 py-2 text-xs">{user.isActive ? 'Khóa' : 'Mở khóa'}</button>}</div>} />)}</List>{selectedUser && userDetail && <UserDetails detail={userDetail} />}</div>}
    {tab === 'audit' && <List title="Lịch sử thao tác">{audit.map((item) => <Row key={item.id} title={item.action} detail={`${item.entity} · ${new Date(item.createdAt).toLocaleString('vi-VN')}`} />)}</List>}
    {tab === 'catalog' && <CatalogDeletePanel />}
  </main>;
}

function UserDetails({ detail }: { detail: UserDetail }) {
  const account = detail.wallets.account;
  const seller = detail.wallets.seller;
  const [amount, setAmount] = useState('');
  const [note, setNote] = useState('');
  const [saving, setSaving] = useState(false);
  const adjust = async (direction: 'CREDIT' | 'DEBIT') => {
    const value = Number(amount);
    if (!Number.isSafeInteger(value) || value <= 0 || saving) return;
    setSaving(true);
    try {
      await api.post(`/admin/telegram/users/${detail.telegram.telegramUserId}/balance-adjustment`, { direction, amount: value, note });
      window.location.reload();
    } finally { setSaving(false); }
  };
  return <section className="space-y-4 rounded-2xl border border-cyan-400/20 bg-[#121315] p-5"><div><h2 className="font-black">Chi tiết người dùng</h2><p className="mt-1 text-sm text-zinc-400">{detail.user.name || detail.user.username || 'Người dùng'} · {detail.user.role}</p><p className="text-xs text-zinc-500">Tham gia: {new Date(detail.telegram.linkedAt || detail.user.joinedAt).toLocaleString('vi-VN')}</p></div><div className="grid gap-3 md:grid-cols-2"><Card title="Số dư tài khoản"><p className="text-xl font-black text-emerald-300">{Number(account?.availableBalance || 0).toLocaleString('vi-VN')} {account?.currency || 'VND'}</p><p className="mt-1 text-xs text-zinc-500">Đang khóa: {Number(account?.lockedBalance || 0).toLocaleString('vi-VN')}</p></Card><Card title="Ví người bán"><p className="text-xl font-black text-cyan-300">{Number(seller?.availableBalance || 0).toLocaleString('vi-VN')} {seller?.currency || 'VND'}</p><p className="mt-1 text-xs text-zinc-500">Đang chờ: {Number(seller?.pendingBalance || 0).toLocaleString('vi-VN')}</p></Card></div><section className="rounded-xl border border-amber-400/20 bg-amber-400/5 p-4"><h3 className="font-bold">Điều chỉnh số dư tài khoản</h3><p className="mt-1 text-xs text-zinc-400">Mọi thao tác đều ghi vào sổ ví. Chỉ dùng khi cần xử lý hỗ trợ và phải ghi lý do.</p><div className="mt-3 grid gap-3 md:grid-cols-2"><TextField label="Số tiền (VNĐ)" value={amount} onChange={setAmount} /><TextField label="Lý do" value={note} onChange={setNote} /></div><div className="mt-3 flex gap-2"><button type="button" disabled={saving} onClick={() => void adjust('CREDIT')} className="rounded-lg bg-emerald-500 px-4 py-2 font-bold text-slate-950 disabled:opacity-50">Cộng tiền</button><button type="button" disabled={saving} onClick={() => void adjust('DEBIT')} className="rounded-lg bg-red-500 px-4 py-2 font-bold text-white disabled:opacity-50">Trừ tiền</button></div></section><div className="grid gap-4 xl:grid-cols-2"><History title="Lịch sử nạp tiền"><div className="space-y-2">{detail.deposits.length ? detail.deposits.map((deposit) => <Row key={deposit.id} title={`${deposit.depositCode} · ${Number(deposit.amount).toLocaleString('vi-VN')} ${deposit.currency}`} detail={`${deposit.status} · ${new Date(deposit.createdAt).toLocaleString('vi-VN')}`} action={<span className="text-xs text-zinc-400">Đã khớp {Number(deposit.matchedAmount).toLocaleString('vi-VN')}</span>} />) : <p className="text-sm text-zinc-500">Chưa có lịch sử nạp.</p>}</div></History><History title="Lịch sử mua hàng"><div className="space-y-2">{detail.orders.length ? detail.orders.map((order) => <Row key={order.id} title={`#${order.id.slice(0, 8)} · ${Number(order.totalAmount).toLocaleString('vi-VN')} đ`} detail={`${order.role === 'BUYER' ? 'Mua hàng' : 'Bán hàng'} · ${order.status} · ${new Date(order.createdAt).toLocaleString('vi-VN')}`} action={<span className="text-xs text-zinc-400">{order.items.length} sản phẩm</span>} />) : <p className="text-sm text-zinc-500">Chưa có lịch sử mua hàng.</p>}</div></History></div></section>;
}

function History({ title, children }: { title: string; children: ReactNode }) { return <section className="rounded-xl border border-white/10 bg-black/20 p-4"><h3 className="font-bold">{title}</h3><div className="mt-3">{children}</div></section>; }
function Card({ title, children }: { title: string; children: ReactNode }) { return <section className="rounded-2xl border border-white/10 bg-[#121315] p-5"><h2 className="font-black">{title}</h2>{title === 'Mức sẵn sàng' && <p className="mt-2 text-xs text-zinc-400">BLOCKED nghĩa là chưa đủ điều kiện an toàn để bật nạp tiền hoặc vận hành bot. Hãy sửa từng mục đang thiếu bên dưới.</p>}{title === 'Tài khoản nhận tiền' && <p className="mt-2 text-xs text-zinc-400">MISSING nghĩa là chưa chọn tài khoản ngân hàng ACTIVE cho QR. Thêm tài khoản ở mục Nạp tiền, hệ thống sẽ tự chọn.</p>}<div className="mt-3">{children}</div></section>; }
function Status({ label, ok }: { label: string; ok: boolean }) { return <p className="flex justify-between border-b border-white/5 py-2 text-sm"><span>{label}</span><span className={ok ? 'text-emerald-300' : 'text-amber-300'}>{ok ? 'Đã cấu hình' : 'Chưa cấu hình'}</span></p>; }
function TextField({ label, value, onChange }: { label: string; value: string; onChange: (value: string) => void }) { const help = label === 'Địa chỉ máy chủ' ? 'Địa chỉ API công khai để website hoặc người dùng truy cập, ví dụ: https://api.shopmmo.com.vn.' : label === 'Địa chỉ kết nối nội bộ' ? 'Địa chỉ backend trong Docker, ví dụ: http://backend:3001/api. Không nhập email hoặc mật khẩu.' : label === 'Mã ngân hàng VietQR' ? 'Mã ngân hàng dùng để tạo QR VietQR, ví dụ VPB, VCB, TCB.' : undefined; return <label className="space-y-1 text-sm"><span className="text-zinc-400">{label}</span><input className="w-full rounded-lg border border-white/10 bg-black/30 p-3" value={value} onChange={(event) => onChange(event.target.value)} />{help && <span className="block text-xs text-zinc-500">{help}</span>}</label>; }
function Check({ label, checked, onChange }: { label: string; checked: boolean; onChange: (value: boolean) => void }) { return <label className="flex items-center gap-2 text-sm"><input type="checkbox" checked={checked} onChange={(event) => onChange(event.target.checked)} />{label}</label>; }
function List({ title, children }: { title: string; children: ReactNode }) { return <section className="rounded-2xl border border-white/10 bg-[#121315] p-5"><h2 className="font-black">{title}</h2><div className="mt-4 space-y-2">{children}</div></section>; }
function Row({ title, detail, action }: { title: string; detail?: string; action?: ReactNode }) { return <div className="flex items-center justify-between gap-4 rounded-lg border border-white/5 bg-black/20 p-3"><div><p className="font-bold">{title}</p><p className="text-xs text-zinc-500">{detail}</p></div>{action}</div>; }

function CatalogDeletePanel() {
  const [categories, setCategories] = useState<CatalogCategory[]>([]);
  const [products, setProducts] = useState<Product[]>([]);
  const [productId, setProductId] = useState('');
  const [items, setItems] = useState<Array<{ id: string; inventoryCode: string; status: string }>>([]);
  const [notice, setNotice] = useState('');

  const load = async () => {
    const [categoryResponse, productResponse] = await Promise.all([api.get('/admin/telegram/catalog/categories'), api.get('/admin/telegram/catalog/products')]);
    setCategories(categoryResponse.data || []);
    setProducts(productResponse.data || []);
  };
  useEffect(() => { void load(); }, []);

  const loadItems = async (id: string) => {
    setProductId(id);
    setItems(id ? ((await api.get(`/admin/telegram/catalog/products/${id}/inventory`)).data.items || []) : []);
  };
  const removeCategory = async (category: CatalogCategory) => {
    if (!window.confirm(`Xoá danh mục “${category.name}”? Danh mục phải không còn sản phẩm.`)) return;
    try { await api.delete(`/admin/telegram/catalog/categories/${category.id}`); setNotice('Đã xoá danh mục.'); await load(); } catch { setNotice('Không thể xoá danh mục đang có sản phẩm.'); }
  };
  const removeProduct = async (product: Product) => {
    if (!window.confirm(`Xoá sản phẩm “${product.name}” và toàn bộ hàng chưa bán?`)) return;
    try { await api.delete(`/admin/telegram/catalog/products/${product.id}`); setNotice('Đã xoá sản phẩm và kho chưa bán.'); if (productId === product.id) { setProductId(''); setItems([]); } await load(); } catch { setNotice('Không thể xoá sản phẩm đã phát sinh đơn hàng. Hãy ẩn sản phẩm.'); }
  };
  const removeItem = async (item: { id: string; status: string }) => {
    if (!productId || item.status === 'SOLD' || item.status === 'RESERVED' || !window.confirm('Xoá hàng này khỏi kho Telegram?')) return;
    try { await api.delete(`/admin/telegram/catalog/products/${productId}/inventory/${item.id}`); setNotice('Đã xoá hàng khỏi kho.'); await loadItems(productId); await load(); } catch { setNotice('Không thể xoá hàng đã bán hoặc đang được giữ chỗ.'); }
  };

  return <section className="space-y-4 rounded-2xl border border-red-400/20 bg-red-400/5 p-5"><div><h2 className="font-black">Xoá dữ liệu kho Telegram</h2><p className="mt-1 text-xs text-zinc-400">Chỉ xoá sau khi xác nhận. Danh mục có sản phẩm và sản phẩm đã phát sinh đơn hàng sẽ bị hệ thống chặn xoá.</p></div>{notice && <p className="rounded-lg bg-white/10 p-3 text-sm text-amber-200">{notice}</p>}<div className="space-y-2">{categories.map((category) => <Row key={category.id} title={category.name} detail={`${category.productCount} sản phẩm`} action={<button type="button" onClick={() => void removeCategory(category)} className="rounded-lg bg-red-500/15 px-3 py-2 text-xs text-red-300">Xoá danh mục</button>} />)}</div><div className="space-y-2">{products.map((product) => <Row key={product.id} title={product.name} detail={`${product.category.name} · Kho ${product.stock}`} action={<button type="button" onClick={() => void removeProduct(product)} className="rounded-lg bg-red-500/15 px-3 py-2 text-xs text-red-300">Xoá sản phẩm</button>} />)}</div><label className="block space-y-2 text-sm"><span className="text-zinc-400">Chọn sản phẩm để xoá từng hàng</span><select className="w-full rounded-lg border border-white/10 bg-black/30 p-3" value={productId} onChange={(event) => void loadItems(event.target.value)}><option value="">Chọn sản phẩm</option>{products.map((product) => <option key={product.id} value={product.id}>{product.name}</option>)}</select></label>{items.map((item) => <Row key={item.id} title={item.inventoryCode} detail={item.status} action={<button type="button" disabled={item.status === 'SOLD' || item.status === 'RESERVED'} onClick={() => void removeItem(item)} className="rounded-lg bg-red-500/15 px-3 py-2 text-xs text-red-300 disabled:opacity-40">Xoá hàng</button>} />)}</section>;
}
