'use client';
import {useCallback,useEffect,useState} from 'react';
import {Anchor,Users,Coins,Gem,Store,ScrollText,ArrowLeft,Shield,RefreshCw,Settings,Check,X,Package} from 'lucide-react';
import type {Ship,World} from '../lib/engine';
import {ContentEditor} from './content-editor';
import {DEFAULT_CONTENT,type Content} from '../lib/content';
import {FLEET} from '../lib/fleet';
import {DEFAULT_PACKS} from './shop';
type Order={merchant_oid?:string;refund_status?:string;reference_no?:string;id:string;user_name:string;diamonds:number;amount:number;status:string;created_at:number};
type Data={now?:number;purchases?:NonNullable<World['purchases']>;content?:Content;mode:string;players:Ship[];catalog:typeof FLEET;settings:NonNullable<World['settings']>;audit:NonNullable<World['audit']>;orders:Order[];packages:typeof DEFAULT_PACKS;transferEnabled:boolean;bankInfo:string};
export default function AdminConsole({endpoint='/api/admin',csrf='',homePath='/'}:{endpoint?:string;csrf?:string;homePath?:string}){
 const [data,setData]=useState<Data|null>(null),[tab,setTab]=useState('dashboard'),[message,setMessage]=useState(''),[busy,setBusy]=useState(false),[search,setSearch]=useState('');
 const [wallet,setWallet]=useState({target:'',currency:'diamonds',amount:100,reason:''}),[announcement,setAnnouncement]=useState(''),[bank,setBank]=useState(''),[enabled,setEnabled]=useState(false),[packs,setPacks]=useState(DEFAULT_PACKS),[prices,setPrices]=useState<Record<string,number>>({}),[confirmation,setConfirmation]=useState<{label:string;action:Record<string,unknown>}|null>(null);
 const load=useCallback(async()=>{try{const r=await fetch(endpoint);const d=await r.json() as Data&{error?:string};if(!r.ok)throw new Error(d.error);setData(d);setAnnouncement(d.settings.announcement);setPrices(d.settings.shipPrices);setBank(d.bankInfo);setEnabled(d.transferEnabled);if(d.packages.length)setPacks(d.packages);}catch(e){setMessage(e instanceof Error?e.message:'Yüklenemedi.');}},[endpoint]);
 useEffect(()=>{void load();},[load]);
 async function mutate(action:Record<string,unknown>){setBusy(true);setMessage('');try{const r=await fetch(endpoint,{method:'POST',headers:{'Content-Type':'application/json','X-CSRF-Token':csrf},body:JSON.stringify({...action,nonce:crypto.randomUUID()})});const d=await r.json() as {message?:string;error?:string};if(!r.ok)throw new Error(d.error);setMessage(d.message??'Kaydedildi.');setConfirmation(null);await load();}catch(e){setMessage(e instanceof Error?e.message:'İşlem başarısız.');}finally{setBusy(false);}}
 const contentTabs:Record<string,keyof Content>={ships:'ships',designs:'designs',cannons:'cannons',sails:'sails',npcs:'npcs',maps:'maps',quests:'quests',levels:'levels',products:'products',campaigns:'products',events:'events',rules:'rules',crew:'crew',flags:'flags',ammo:'ammo',spawns:'spawns'};
 const tabs=[{id:'dashboard',title:'Genel Dashboard',icon:Anchor},{id:'players',title:'Oyuncu yönetimi',icon:Users},{id:'ships',title:'Gemi yönetimi',icon:Store},{id:'designs',title:'Gemi tasarımları',icon:Store},{id:'cannons',title:'Top yönetimi',icon:Settings},{id:'crew',title:'Topçu & mürettebat',icon:Users},{id:'sails',title:'Yelken yönetimi',icon:Settings},{id:'npcs',title:'NPC yönetimi',icon:Shield},{id:'spawns',title:'NPC doğma grupları',icon:Anchor},{id:'maps',title:'Harita editörü',icon:Anchor},{id:'quests',title:'Görev yönetimi',icon:ScrollText},{id:'levels',title:'Seviye & XP',icon:Settings},{id:'products',title:'Mağaza & ürünler',icon:Store},{id:'payments',title:'Elmas & ödemeler',icon:Gem},{id:'reports',title:'Satış raporları',icon:Coins},{id:'campaigns',title:'Kampanyalar',icon:Store},{id:'events',title:'Etkinlikler',icon:Anchor},{id:'penalties',title:'Ceza & ban',icon:Shield},{id:'rules',title:'Oyun dengesi',icon:Settings},{id:'server',title:'Canlı sunucu',icon:RefreshCw},{id:'audit',title:'İşlem kayıtları',icon:ScrollText},{id:'flags',title:'Bayraklar',icon:Anchor},{id:'ammo',title:'Mühimmat',icon:Package},{id:'settings',title:'Duyuru',icon:Settings}];
 return <main className="admin-shell"><aside className="admin-sidebar"><a className="admin-brand" href={homePath}><Anchor/><span>KARAYEL<small>YÖNETİM GÜVERTESİ</small></span></a><div className="admin-nav">{tabs.map(t=><button className={tab===t.id?'selected':''} onClick={()=>setTab(t.id)} key={t.id}><t.icon size={18}/>{t.title}</button>)}</div><a className="back-game" href={homePath}><ArrowLeft size={16}/> Oyuna dön</a><div className="admin-environment"><Shield size={15}/>{data?.mode??'Güvenli yönetim'}</div></aside><section className="admin-main"><header><div><small>KAPTANIN KÖŞKÜ</small><h1>{tabs.find(t=>t.id===tab)?.title}</h1></div><button onClick={()=>void load()} className="admin-refresh" aria-label="Verileri yenile"><RefreshCw size={17}/> Yenile</button></header><div className="admin-metrics"><div><Users/><span>Toplam kaptan<strong>{data?.players.length??'—'}</strong></span></div><div><Coins/><span>Oyundaki altın<strong>{data?.players.reduce((n,p)=>n+p.gold,0).toLocaleString('tr-TR')??'—'}</strong></span></div><div><Gem/><span>Oyundaki elmas<strong>{data?.players.reduce((n,p)=>n+(p.diamonds??0),0).toLocaleString('tr-TR')??'—'}</strong></span></div><div><Package/><span>Bekleyen sipariş<strong>{data?.orders.filter(o=>o.status==='pending').length??'—'}</strong></span></div></div>{message&&<div className="admin-message" role="status">{message}<button onClick={()=>setMessage('')}><X size={15}/></button></div>}
 {contentTabs[tab]&&data&&<ContentEditor key={tab} initialGroup={contentTabs[tab]} content={data.content??DEFAULT_CONTENT} save={mutate} busy={busy}/>}
 {(tab==='players'||tab==='penalties')&&<><div className="admin-section"><div className="section-top"><h2>Kaptan sicili</h2><input placeholder="Kaptan ara…" value={search} onChange={e=>setSearch(e.target.value)}/></div><div className="table-scroll"><table><thead><tr><th>Kaptan</th><th>Altın</th><th>Elmas</th><th>Zafer</th><th>Durum</th><th>Yönet</th></tr></thead><tbody>{data?.players.filter(p=>p.name.toLowerCase().includes(search.toLowerCase())).map(p=><tr key={p.id}><td><strong>{p.name}</strong><small>{p.id.slice(0,8)}</small></td><td>{p.gold.toLocaleString('tr-TR')}</td><td>{p.diamonds??0}</td><td>{p.kills+p.pvpKills}</td><td><span className={`badge ${p.banned?'red':''}`}>{p.banned?'Askıda':'Aktif'}</span></td><td><button className="table-button" onClick={()=>setWallet(w=>({...w,target:p.id}))}>Bakiye</button><button className="table-button" onClick={()=>setConfirmation({label:`${p.name} hesabı ${p.banned?'yeniden açılsın':'askıya alınsın'} mı?`,action:{type:'ban',target:p.id,value:!p.banned}})}>{p.banned?'Aç':'Askıya al'}</button></td></tr>)}</tbody></table>{data?.players.length===0&&<p className="admin-empty">Henüz kayıtlı kaptan yok. Oyunda hesabını oluşturduğunda burada görünecek.</p>}</div></div><form className="admin-section wallet-form" onSubmit={e=>{e.preventDefault();setConfirmation({label:'Bakiye değişikliği kaydedilsin mi?',action:{type:'wallet',...wallet}});}}><h2>Bakiyeyi düzenle</h2><p>Her değişiklik açıklamasıyla birlikte işlem defterine yazılır. Eksi tutar bakiye düşürür.</p><div className="form-grid"><label>Kaptan<select required value={wallet.target} onChange={e=>setWallet(w=>({...w,target:e.target.value}))}><option value="">Kaptan seç</option>{data?.players.map(p=><option value={p.id} key={p.id}>{p.name}</option>)}</select></label><label>Birim<select value={wallet.currency} onChange={e=>setWallet(w=>({...w,currency:e.target.value}))}><option value="diamonds">Elmas</option><option value="gold">Altın</option><option value="xp">Deneyim (XP)</option></select></label><label>Değişim<input type="number" required min={-1000000} max={1000000} value={wallet.amount} onChange={e=>setWallet(w=>({...w,amount:Number(e.target.value)}))}/></label></div><label>Açıklama<input required minLength={5} maxLength={200} placeholder="Örn. etkinlik ödülü / destek düzeltmesi" value={wallet.reason} onChange={e=>setWallet(w=>({...w,reason:e.target.value}))}/></label><button className="gold-button" disabled={busy}>Değişikliği incele</button></form></>}

 {(tab==='dashboard'||tab==='server')&&<div className="admin-section"><h2>{tab==='server'?'Canlı deniz durumu':'Kaptanın kontrol merkezi'}</h2><p>Son görüntü: {new Date(data?.now??Date.now()).toLocaleString('tr-TR')} · Yenile düğmesiyle güncelle.</p><div className="admin-metrics"><div><span>Çevrimiçi<strong>{data?.players.filter(p=>(data.now??Date.now())-p.lastSeen<12000).length??0}</strong></span></div><div><span>NPC zaferleri<strong>{data?.players.reduce((n,p)=>n+p.kills,0)??0}</strong></span></div><div><span>PvP zaferleri<strong>{data?.players.reduce((n,p)=>n+p.pvpKills,0)??0}</strong></span></div><div><span>Görev ödülleri<strong>{data?.players.reduce((n,p)=>n+Object.keys(p.claimed??{}).length,0)??0}</strong></span></div></div><p>Bağlantı: varsayılan 800 ms HTTP senkronizasyonu. PHP paketinde isteğe bağlı WebSocket servisi bulunur; ayrı VPS ve TLS kurulumu gerekir. Savaş ve ekonomi sunucu otoritesinde. Yüksek eşzamanlılık için harita sunucularına ayrıştırma ve yük testi gerekir.</p><p>{data?.content?.ships.length??12} gemi · {data?.content?.maps.length??20} harita · {data?.content?.npcs.length??7} NPC türü</p></div>}
 {tab==='reports'&&<div className="admin-section"><h2>Satış ve ekonomi raporu</h2><p>Onaylı ödeme toplamı (listelenen siparişler): {((data?.orders.filter(o=>o.status==='approved').reduce((n,o)=>n+o.amount,0)??0)/100).toLocaleString('tr-TR')} ₺</p><div className="table-scroll"><table><thead><tr><th>Zaman</th><th>Oyuncu</th><th>Ürün</th><th>Tutar</th></tr></thead><tbody>{data?.purchases?.slice(-200).reverse().map((p,i)=><tr key={i}><td>{new Date(p.at).toLocaleString('tr-TR')}</td><td>{data.players.find(x=>x.id===p.player)?.name??p.player}</td><td>{p.item}</td><td>{p.amount} {p.currency}</td></tr>)}</tbody></table></div><p>v0.3 öncesi oyun içi alışverişler satış günlüğü tutmadığı için burada görünmez; oyuncuların sahipliği korunur.</p></div>}
 {(tab==='players'||tab==='crew')&&data&&<div className="admin-section"><h2>Oyuncu donanımı & ödül</h2><select value={wallet.target} onChange={e=>setWallet(w=>({...w,target:e.target.value}))}><option value="">Kaptan seç</option>{data.players.map(p=><option key={p.id} value={p.id}>{p.name}</option>)}</select>{data.players.filter(p=>p.id===wallet.target).map(p=><div key={p.id}><p>XP: {p.xp} · Gemi: {p.model} · Topçu: {p.gunners} · Aktif top: {p.activeCannons} · Yelken: {p.equipment?.sail||'Yok'}</p><p>Filo: {p.owned.join(', ')}</p><p>Envanter: {Object.entries(p.inventory??{}).map(([k,v])=>`${k}: ${v}`).join(' · ')}</p><form onSubmit={e=>{e.preventDefault();const f=new FormData(e.currentTarget);setConfirmation({label:p.name+' hesabına ödül eklensin mi?',action:{type:'grant',target:p.id,value:String(f.get('item')),amount:Number(f.get('quantity'))}});}}><div className="form-grid"><label>Ödül<select name="item"><option value="gunners">Topçu</option>{[...(data.content??DEFAULT_CONTENT).crew,...(data.content??DEFAULT_CONTENT).ships,...(data.content??DEFAULT_CONTENT).cannons,...(data.content??DEFAULT_CONTENT).sails,...(data.content??DEFAULT_CONTENT).ammo].map(v=><option key={v.id} value={v.id}>{v.name}</option>)}</select></label><label>Adet<input name="quantity" type="number" defaultValue={1} min={1} max={200}/></label></div><button className="gold-button" disabled={busy}>Ödülü incele</button></form></div>)}</div>}
 {tab==='fleet'&&<div className="admin-section"><h2>Gemi fiyatları</h2><p>Gemi para birimleri sabittir. Yeni fiyat hemen mağazaya yansır.</p>{FLEET.filter(m=>m.price>0).map(m=><form className="admin-price-row" key={m.id} onSubmit={e=>{e.preventDefault();void mutate({type:'price',target:m.id,amount:prices[m.id]??m.price});}}><span className="ship-color" style={{background:m.sail}}/><div><strong>{m.name}</strong><small>{m.currency==='gold'?'ALTIN':'ELMAS'} · {m.class}</small></div><input type="number" aria-label={`${m.name} fiyatı`} min={1} max={10000000} required value={prices[m.id]??m.price} onChange={e=>setPrices(p=>({...p,[m.id]:Number(e.target.value)}))}/><button className="table-button" disabled={busy}>Kaydet</button></form>)}</div>}
 {tab==='payments'&&<><div className="admin-section"><h2>Ödeme & elmas yükleme</h2>{data?.mode==='Sites önizlemesi'?<div className="payment-notice"><Shield/><p>Gerçek ödeme ve sipariş işlemleri PHP sunucunda yönetilir. Bu önizlemede elmas bakiyesini Kaptanlar bölümünden test edebilirsin.</p></div>:<><p>Bu sürümde ödeme yöntemi, yönetici onaylı banka havalesidir. PayTR kart ödeme modülü PHP paketindedir; config/paytr.php ile etkinleştirilir. Test modu kullanılabilir elmas yüklemez.</p><form onSubmit={e=>{e.preventDefault();void mutate({type:'paymentSettings',packages:packs,transferEnabled:enabled,bankInfo:bank});}}><label className="checkbox-row"><input type="checkbox" checked={enabled} onChange={e=>setEnabled(e.target.checked)}/> Havale siparişlerini aç</label><label>Alıcı / banka / IBAN bilgileri<textarea value={bank} maxLength={1000} onChange={e=>setBank(e.target.value)} placeholder="Kendi banka bilgilerini buraya gir. Oyuncuya gösterilir."/></label><div className="pack-edit-grid">{packs.map((p,i)=><div key={p.id}><label>Paket adı<input required maxLength={80} value={p.name} onChange={e=>setPacks(ps=>ps.map((q,j)=>j===i?{...q,name:e.target.value}:q))}/></label><label>Elmas<input required type="number" min={1} max={1000000} value={p.diamonds} onChange={e=>setPacks(ps=>ps.map((q,j)=>j===i?{...q,diamonds:Number(e.target.value)}:q))}/></label><label>Fiyat (kuruş)<input required type="number" min={100} max={100000000} value={p.price} onChange={e=>setPacks(ps=>ps.map((q,j)=>j===i?{...q,price:Number(e.target.value)}:q))}/></label><small>{(p.price/100).toLocaleString('tr-TR',{style:'currency',currency:'TRY'})}</small><button type="button" className="text-button" disabled={packs.length<=1} onClick={()=>setPacks(ps=>ps.filter(q=>q.id!==p.id))}>Paketi satıştan kaldır</button></div>)}</div><button type="button" className="text-button" disabled={packs.length>=30} onClick={()=>setPacks(ps=>[...ps,{id:'p-'+crypto.randomUUID().slice(0,8),name:'Yeni elmas paketi',diamonds:100,price:9900}])}>+ Elmas paketi ekle</button><button className="gold-button" disabled={busy}>Ödeme ayarlarını kaydet</button></form></>}</div><div className="admin-section"><h2>Elmas siparişleri</h2><p>“Ödemeyi doğruladım” yalnızca banka hesabındaki tahsilatı kontrol ettikten sonra kullanılmalıdır. Aynı sipariş ikinci kez elmas yüklemez.</p><div className="table-scroll"><table><thead><tr><th>Sipariş</th><th>Kaptan</th><th>Elmas</th><th>Tutar</th><th>Durum</th><th>İşlem</th></tr></thead><tbody>{data?.orders.map(o=><tr key={o.id}><td>{o.id.slice(0,8)}</td><td>{o.user_name}</td><td>{o.diamonds}</td><td>{(o.amount/100).toFixed(2)} ₺</td><td>{({pending:'Bekliyor',awaiting:'PayTR bekliyor',test_paid:'Test başarılı',approved:'Yüklendi',rejected:'Reddedildi',refunded:'İade edildi',refund_pending:'İade doğrulanıyor'} as Record<string,string>)[o.status]}</td><td>{o.status==='approved'&&!o.refund_status&&<button className="table-button" disabled={busy} onClick={()=>setConfirmation({label:o.merchant_oid?'PayTR üzerinden tam tutar iadesi talep edilsin mi? Paket elmasları bakiyeden ayrılacak.':'Banka iadesini tamamladığını onaylıyor musun? Paket elmasları geri alınacak.',action:{type:o.merchant_oid?'paytrRefund':'refundOrder',target:o.id}})}>{o.merchant_oid?'PayTR iade talebi':'Banka iadesini kaydet'}</button>}{o.status==='refund_pending'&&<button className="table-button" disabled={busy} onClick={()=>void mutate({type:'checkRefund',target:o.id})}>Sağlayıcıdan sorgula</button>}{o.refund_status&&<small>{({unknown:'Sonuç belirsiz; tekrar iade gönderilmez',accepted:'Talep kabul edildi; tamamlanması bekleniyor',completed:'İade doğrulandı',failed:'Talep reddedildi; elmaslar geri verildi'} as Record<string,string>)[o.refund_status]} · {o.reference_no}</small>}{o.status==='pending'&&<><button className="table-button" onClick={()=>setConfirmation({label:`${o.user_name} için ${(o.amount/100).toFixed(2)} TL tahsil edildi mi? Onay ${o.diamonds} elmas yükler.`,action:{type:'approveOrder',target:o.id}})}>Ödemeyi doğruladım</button><button className="table-button" onClick={()=>setConfirmation({label:'Sipariş reddedilsin mi?',action:{type:'rejectOrder',target:o.id}})}>Reddet</button></>}</td></tr>)}</tbody></table>{!data?.orders.length&&<p className="admin-empty">Henüz sipariş yok.</p>}</div></div></>}
 {tab==='settings'&&<form className="admin-section" onSubmit={e=>{e.preventDefault();void mutate({type:'announcement',value:announcement});}}><h2>Deniz duyurusu</h2><p>Oyun ekranındaki tüm kaptanlara gösterilir. Boş bırakmak duyuruyu kaldırır.</p><label>Duyuru<textarea maxLength={180} value={announcement} onChange={e=>setAnnouncement(e.target.value)}/></label><button className="gold-button" disabled={busy}>Duyuruyu kaydet</button></form>}
 {tab==='audit'&&<div className="admin-section"><h2>Yönetici işlem defteri</h2><p>Son 300 yönetim işlemi. Kalıcı finansal sipariş kayıtları ayrıca veritabanında saklanır.</p>{data?.audit.map((a,i)=><div className="audit-row" key={`${a.at}-${i}`}><span>{new Date(a.at).toLocaleString('tr-TR')}</span><strong>{a.actor} · {a.action}</strong><p>{a.detail}</p></div>)}{!data?.audit.length&&<p className="admin-empty">Henüz yönetim işlemi yok.</p>}</div>}
 {confirmation&&<div className="admin-confirm"><section><Shield size={28}/><h2>İşlemi onayla</h2><p>{confirmation.label}</p><div><button onClick={()=>setConfirmation(null)}>Vazgeç</button><button className="gold-button" disabled={busy} onClick={()=>void mutate(confirmation.action)}>{busy?'İşleniyor…':'Onayla'}<Check size={15}/></button></div></section></div>}
 </section></main>;
}
