// ============ Accounts data model + context ============

const ACCOUNT_SEED = [
  { id:'main',   name:'Main',        broker:'IBKR',    type:'personal',       currency:'USD', assetClass:'Equities', startingCapital:25000,  color:'#10b981', notes:'Primary stock account', rules:null },
  { id:'prop1',  name:'FTMO 100k',   broker:'MT5',     type:'prop_challenge', currency:'USD', assetClass:'Futures',  startingCapital:100000, color:'#f59e0b', notes:'Phase 1 challenge', rules:{ maxDailyLoss:5, maxTotalLoss:10, profitTarget:10, deadline:'2026-05-15' } },
  { id:'prop2',  name:'Apex Funded', broker:'MT5',     type:'prop_funded',    currency:'USD', assetClass:'Futures',  startingCapital:50000,  color:'#3b82f6', notes:'Funded account', rules:{ maxDailyLoss:5, maxTotalLoss:8, profitTarget:0, deadline:null } },
  { id:'crypto', name:'Binance',     broker:'Binance', type:'personal',       currency:'USD', assetClass:'Crypto',   startingCapital:8000,   color:'#8b5cf6', notes:'Crypto swing account', rules:null },
  { id:'demo',   name:'Paper',       broker:'Tradovate', type:'paper',        currency:'USD', assetClass:'Futures',  startingCapital:50000,  color:'#6b6b6b', notes:'Paper trading', rules:null },
];

// Stable pseudo-assign of trades to accounts
const _hashStr = (s) => { let h=0; for (let i=0;i<s.length;i++) h=((h<<5)-h+s.charCodeAt(i))|0; return Math.abs(h); };
TRADES.forEach(t => {
  const accIds = ['main','main','main','prop1','prop2','crypto','demo'];
  t.accountId = accIds[_hashStr(t.ticker + t.id) % accIds.length];
});

const AccountContext = React.createContext({
  accounts:[], active:'all', setActive:()=>{}, addAccount:()=>{}, updateAccount:()=>{}, deleteAccount:()=>{},
  accountsById:{}, filteredTrades:[], statsFor:()=>({}), todayPnlFor:()=>0,
});

const AccountProvider = ({ children }) => {
  const [accounts, setAccounts] = useState(() => {
    try { const s = localStorage.getItem('edgebook:accounts'); if (s) return JSON.parse(s); } catch {}
    return ACCOUNT_SEED;
  });
  const [active, setActiveRaw] = useState(() => {
    try { return localStorage.getItem('edgebook:active_acct') || 'all'; } catch { return 'all'; }
  });
  const setActive = (v) => { setActiveRaw(v); try { localStorage.setItem('edgebook:active_acct', v); } catch {} };
  useEffect(() => { try { localStorage.setItem('edgebook:accounts', JSON.stringify(accounts)); } catch {} }, [accounts]);

  const accountsById = useMemo(() => Object.fromEntries(accounts.map(a => [a.id, a])), [accounts]);

  const filteredTrades = useMemo(() => active==='all' ? TRADES : TRADES.filter(t => t.accountId===active), [active]);

  const statsFor = (accId) => {
    const pool = accId==='all' ? TRADES : TRADES.filter(t => t.accountId===accId);
    const closed = pool.filter(t=>t.status==='closed');
    const wins = closed.filter(t=>t.pnl>0);
    const losses = closed.filter(t=>t.pnl<0);
    const netPnl = closed.reduce((s,t)=>s+t.pnl,0);
    const gw = wins.reduce((s,t)=>s+t.pnl,0);
    const gl = Math.abs(losses.reduce((s,t)=>s+t.pnl,0));
    const openCount = pool.filter(t=>t.status==='open').length;
    return {
      netPnl: +netPnl.toFixed(2),
      winRate: closed.length ? wins.length/closed.length : 0,
      profitFactor: gl ? +(gw/gl).toFixed(2) : 0,
      avgR: closed.length ? +(closed.reduce((s,t)=>s+t.r,0)/closed.length).toFixed(2) : 0,
      trades: closed.length,
      wins: wins.length, losses: losses.length,
      openTrades: openCount,
    };
  };

  // Today's P&L (fake "today" = most recent trade date of that account)
  const todayPnlFor = (accId) => {
    const pool = accId==='all' ? TRADES : TRADES.filter(t => t.accountId===accId);
    const closed = pool.filter(t=>t.status==='closed');
    if (!closed.length) return 0;
    const latest = closed.reduce((m,t)=> t.date>m?t.date:m, closed[0].date);
    const k = latest.toISOString().slice(0,10);
    return closed.filter(t=>t.date.toISOString().slice(0,10)===k).reduce((s,t)=>s+t.pnl,0);
  };

  const addAccount = (a) => setAccounts(prev => [...prev, { ...a, id: 'a_' + Date.now() }]);
  const updateAccount = (id, patch) => setAccounts(prev => prev.map(a => a.id===id ? { ...a, ...patch } : a));
  const deleteAccount = (id) => { setAccounts(prev => prev.filter(a => a.id!==id)); if (active===id) setActive('all'); };

  return (
    <AccountContext.Provider value={{ accounts, active, setActive, addAccount, updateAccount, deleteAccount, accountsById, filteredTrades, statsFor, todayPnlFor }}>
      {children}
    </AccountContext.Provider>
  );
};
const useAccounts = () => React.useContext(AccountContext);

// Equity-curve of a specific account (returns array of {date, equity, pnl})
const equityCurveFor = (accId) => {
  const pool = accId==='all' ? TRADES : TRADES.filter(t => t.accountId===accId);
  const byDay = new Map();
  pool.filter(t=>t.status==='closed').sort((a,b)=>a.date-b.date).forEach(t=>{
    const k = t.date.toISOString().slice(0,10);
    byDay.set(k, (byDay.get(k)||0) + t.pnl);
  });
  const arr = [];
  let eq = accId==='all' ? 25000 : ((ACCOUNT_SEED.find(a=>a.id===accId)||{startingCapital:25000}).startingCapital);
  for (const [k,v] of [...byDay].sort()) { eq += v; arr.push({ date:k, equity:+eq.toFixed(2), pnl:+v.toFixed(2) }); }
  return arr;
};

const accountTypeLabel = (t) => ({
  personal:'Personal', prop_challenge:'Prop challenge', prop_funded:'Prop funded',
  demo:'Demo', paper:'Paper',
}[t] || t);

const accountTypeColor = (t) => ({
  personal:'#10b981', prop_challenge:'#f59e0b', prop_funded:'#3b82f6', demo:'#a3a3a3', paper:'#a3a3a3',
}[t] || '#a3a3a3');

Object.assign(window, { ACCOUNT_SEED, AccountContext, AccountProvider, useAccounts, equityCurveFor, accountTypeLabel, accountTypeColor });
