import { useState, useEffect, useMemo } from "react"; const C = { base: "#1e1e2e", mantle: "#181825", crust: "#11111b", surface0: "#313244", surface1: "#45475a", surface2: "#585b70", overlay0: "#6c7086", overlay1: "#7f849c", overlay2: "#9399b2", subtext0: "#a6adc8", subtext1: "#bac2de", text: "#cdd6f4", lavender: "#b4befe", blue: "#89b4fa", sapphire: "#74c7ec", sky: "#89dceb", teal: "#94e2d5", green: "#a6e3a1", yellow: "#f9e2af", peach: "#fab387", maroon: "#eba0ac", red: "#f38ba8", mauve: "#cba6f7", pink: "#f5c2e7", flamingo: "#f2cdcd", rosewater: "#f5e0dc", }; const PHP_TO_USD = 0.0175; const PHP_TO_DKK = 0.12; const VENUES = { okada: { name: "Okada Manila (PokerStars LIVE)", short: "Okada", color: C.blue, area: "Entertainment City", type: "tournament", note: "Main series venue — Okada Manila Millions" }, metro: { name: "Metro Card Club", short: "Metro CC", color: C.teal, area: "Ortigas Center, Pasig", type: "tournament", note: "35 tables, amazing food nearby, live music area. Early bird promo: +20% chips if registered before 2PM, +10% before end of lvl 1. 5% service charge on prize pool." }, letsin: { name: "Let's All In Poker Club", short: "Let's All In", color: C.peach, area: "Macapagal Blvd, Pasay", type: "both", note: "Daily tournaments ~6PM, ₱250+ buy-in. Cash from 10/20. PAGCOR licensed." }, masters: { name: "Masters Poker Club", short: "Masters", color: C.flamingo, area: "J. Bocobo St, Malate", type: "cash", note: "Cash games from late afternoon into early hours. Malate = great nightlife district. Occasional small tourneys." }, dynasty: { name: "Dynasty Poker Club", short: "Dynasty", color: C.pink, area: "Malate, Manila", type: "cash", note: "Cash games from late afternoon. Same Malate area as Masters." }, solaire: { name: "Solaire Resort & Casino", short: "Solaire", color: C.mauve, area: "Entertainment City", type: "cash", note: "24hr cash room (Poker King Club). Stakes 50/100 to 500/1000+ PHP. High-stakes action. Near Okada." }, cod: { name: "City of Dreams Manila", short: "CoD Manila", color: C.yellow, area: "Entertainment City", type: "cash", note: "APT venue historically. Cash games may run — verify on arrival. Poker room status unclear in 2026." }, newport: { name: "Newport World Resorts", short: "Newport", color: C.sapphire, area: "Pasay (across NAIA T3)", type: "cash", note: "24/7 cash games, 50/100 and 100/200 PHP. Literally across from the airport." }, nineD: { name: "9D Poker Club", short: "9D PC", color: C.sky, area: "Aseana Business Park, Parañaque", type: "both", note: "Luxury club near Entertainment City. Opens 2PM–6AM daily. Cash 50/100–200+. Daily tournaments with GTDs (check FB for schedule). Reopened Jan 2026. Bad Beat Jackpot running. Ph: +63 917 184 9417" }, prime: { name: "Prime Poker Club", short: "Prime", color: C.rosewater, area: "Macapagal Blvd, Pasay", type: "cash", note: "Cash games. HK SunPlaza location. Ph: +63 917 722 8667" }, twoace: { name: "2Ace Poker Manila", short: "2Ace", color: C.overlay2, area: "Manila", type: "both", note: "Community-focused club with lower rakes. Local tournaments and cash games. Check socials for schedule." }, }; const DAYS = [ { date: "2026-05-04", label: "Monday, May 4", short: "Mon 4", dow: "Monday" }, { date: "2026-05-05", label: "Tuesday, May 5", short: "Tue 5", dow: "Tuesday" }, { date: "2026-05-06", label: "Wednesday, May 6", short: "Wed 6", dow: "Wednesday" }, { date: "2026-05-07", label: "Thursday, May 7", short: "Thu 7", dow: "Thursday" }, { date: "2026-05-08", label: "Friday, May 8", short: "Fri 8", dow: "Friday" }, { date: "2026-05-09", label: "Saturday, May 9", short: "Sat 9", dow: "Saturday" }, { date: "2026-05-10", label: "Sunday, May 10", short: "Sun 10", dow: "Sunday" }, ]; const METRO_DAILY = { Monday: { buyin: 750, guarantee: 50000, chips: 8000, fee: "700+50" }, Tuesday: { buyin: 1100, guarantee: 75000, chips: 10000, fee: "1,000+100" }, Wednesday: { buyin: 1500, guarantee: 100000, chips: 10000, fee: "1,400+100" }, Thursday: { buyin: 1750, guarantee: 120000, chips: 10000, fee: "1,600+150" }, Friday: { buyin: 1500, guarantee: 100000, chips: 10000, fee: "1,400+100" }, Saturday: { buyin: 1750, guarantee: 120000, chips: 10000, fee: "1,600+150" }, Sunday: { buyin: 1750, guarantee: 120000, chips: 10000, fee: "1,600+150" }, }; function buildTournaments() { const ts = []; let id = 0; const nid = () => `t${id++}`; const ok = (date, time, event, name, buyin, guarantee, format, notes, md, mdInfo) => ts.push({ id: nid(), date, time, venue: "okada", event, name, buyin, guarantee, format, notes, multiDay: !!md, multiDayInfo: mdInfo || null }); // MAY 4 Mon ok("2026-05-04","12:00","#21","Ultra Stack",10000,780000,"NLH","₱780K GTD",false); ok("2026-05-04","17:00","#22","Deepstack Turbo",8000,null,"NLH","Turbo",false); ok("2026-05-04","20:00","#23","Okada Millions Qualifier",1900,null,"NLH","WYS at 25K Chips",false); ok("2026-05-04","21:00","#24","Win the Button Hyper",4000,null,"NLH","Hyper Turbo",false); // MAY 5 Tue ok("2026-05-05","12:00","#25","Knockout [₱5K Bounty]",10000,780000,"NLH PKO","₱780K GTD · ₱5K bounty per KO",false); ok("2026-05-05","17:00","#26","6 Handed Turbo",8000,null,"NLH","6-Max Turbo",false); ok("2026-05-05","20:00","#27","Millions Qualifier",1900,null,"NLH","WYS at 25K Chips",false); ok("2026-05-05","21:00","#28","Run it Twice Hyper",4000,null,"NLH","Hyper Turbo",false); // MAY 6 Wed ok("2026-05-06","12:00","#29A","Okada Millions Flt A ★",8000,6000000,"NLH","₱6M GTD — MAIN EVENT Flight A",true,"Day 2: May 9 · Final: May 10"); ok("2026-05-06","15:00","#30","NLH Freezeout",10000,null,"NLH","Freezeout — no re-entry",false); ok("2026-05-06","17:00","#29B","Okada Millions Flt B ★",8000,6000000,"NLH","₱6M GTD — Flt B [20min lvls]",true,"Day 2: May 9 · Final: May 10"); ok("2026-05-06","19:00","#31","Megastack Turbo",5000,null,"NLH","Turbo",false); ok("2026-05-06","20:00","#32","Millions Qualifier",1900,null,"NLH","WYS at 25K Chips",false); // MAY 7 Thu ok("2026-05-07","12:00","#29C","Okada Millions Flt C ★",8000,6000000,"NLH","₱6M GTD — Flight C",true,"Day 2: May 9 · Final: May 10"); ok("2026-05-07","15:00","#33","Shot Clock",10000,null,"NLH","Shot Clock format",false); ok("2026-05-07","17:00","#29D","Okada Millions Flt D ★",8000,6000000,"NLH","₱6M GTD — Flt D [20min lvls]",true,"Day 2: May 9 · Final: May 10"); ok("2026-05-07","19:00","#34","KO Turbo [₱1K Bounty]",5000,null,"NLH PKO","₱1K Bounty Turbo",false); ok("2026-05-07","20:00","#35","Millions Qualifier",1900,null,"NLH","WYS at 25K Chips",false); // MAY 8 Fri ok("2026-05-08","12:00","#29E","Okada Millions Flt E ★",8000,6000000,"NLH","₱6M GTD — Flight E",true,"Day 2: May 9 · Final: May 10"); ok("2026-05-08","15:00","#36A","Mystery Bounty Flt A",15000,2000000,"NLH MB","₱2M GTD — Mystery Bounty",true,"Day 2 Final: May 10"); ok("2026-05-08","15:00","#37","Millions Qualifier",1900,null,"NLH","WYS at 25K Chips",false); ok("2026-05-08","17:00","#29F","Okada Millions Flt F ★",8000,6000000,"NLH","₱6M GTD — Flt F [20min]",true,"Day 2: May 9 · Final: May 10"); ok("2026-05-08","19:00","#38","SuperStack Turbo FO",5000,null,"NLH","Turbo Freezeout",false); ok("2026-05-08","21:00","#29G","Okada Millions Flt G ★",8000,6000000,"NLH","₱6M GTD — Turbo Flight G",true,"Day 2: May 9 · Final: May 10"); ok("2026-05-08","22:00","#39","Mystery Bounty Qual",3000,null,"NLH","WYS at 30K Chips",false); // MAY 9 Sat ok("2026-05-09","12:00","#36B","Mystery Bounty Flt B",15000,2000000,"NLH MB","₱2M GTD",true,"Day 2 Final: May 10"); ok("2026-05-09","12:00","#40","Superstack Freezeout",8000,null,"NLH","Freezeout",false); ok("2026-05-09","13:00","#29 D2","Millions — Day 2",0,6000000,"NLH","Day 2 — qualified only",true,"Final 9: May 10"); ok("2026-05-09","15:00","#41","Pot Limit Omaha",8000,null,"PLO","",false); ok("2026-05-09","15:00","#42","Mystery Bounty Qual",3000,null,"NLH","WYS at 30K",false); ok("2026-05-09","17:00","#36C","Mystery Bounty Flt C",15000,2000000,"NLH MB","₱2M GTD [20/15min]",true,"Day 2 Final: May 10"); ok("2026-05-09","20:00","#43","Swap Hold'em Turbo",5000,null,"Swap","Turbo",false); ok("2026-05-09","21:00","#44","NLH 10/10/10",10000,null,"NLH","10/10/10 format",false); // MAY 10 Sun ok("2026-05-10","12:00","#45","Survivor KO [₱25K!]",12500,1000000,"NLH PKO","₱1M GTD · ₱25K bounty!",false); ok("2026-05-10","12:00","#36 Fin","Mystery Bounty Final",0,2000000,"NLH MB","Day 2 Final — qualified only",true,"FINAL DAY"); ok("2026-05-10","13:00","#29 Fin","Millions — Final 9",0,6000000,"NLH","Final Table — qualified only",true,"FINAL DAY"); ok("2026-05-10","17:00","#46","6 Handed Turbo",8000,null,"NLH","6-Max Turbo",false); ok("2026-05-10","19:00","#47","Last Chance Super Hyper",5000,null,"NLH","LAST EVENT of the series!",false); // Metro Card Club dailies DAYS.forEach(d => { const m = METRO_DAILY[d.dow]; ts.push({ id: nid(), date: d.date, time: "15:00", venue: "metro", event: "Daily", name: `${d.dow} ${(m.guarantee/1000)}K GTD`, buyin: m.buyin, guarantee: m.guarantee, format: "NLH", notes: `${m.fee} PHP · ${m.chips.toLocaleString()} chips · 20min blinds · Late reg thru lvl 9 · Early bird: +20% chips before 2PM`, multiDay: false, multiDayInfo: null }); }); // Let's All In dailies DAYS.forEach(d => { ts.push({ id: nid(), date: d.date, time: "18:00", venue: "letsin", event: "Daily", name: "Evening Tournament", buyin: 500, guarantee: null, format: "NLH", notes: "~₱250-₱500 range (varies day-to-day). Cash games also from 10/20 PHP.", multiDay: false, multiDayInfo: null }); }); // 9D Poker Club dailies (schedule varies — check FB) DAYS.forEach(d => { ts.push({ id: nid(), date: d.date, time: "17:00", venue: "nineD", event: "Daily", name: "Daily GTD Tournament", buyin: 2000, guarantee: 50000, format: "NLH", notes: "~₱1K-₱3K range (varies). GTDs from ₱50K–₱500K+ depending on day. Check 9D FB page for exact schedule. Opens 2PM.", multiDay: false, multiDayInfo: null }); }); return ts; } const ALL_T = buildTournaments(); const STATUS = { upcoming: { label: "Upcoming", color: C.overlay1, icon: "⏳" }, registered: { label: "Registered", color: C.yellow, icon: "🎫" }, playing: { label: "Playing", color: C.green, icon: "🃏" }, busted: { label: "Busted", color: C.red, icon: "💀" }, cashed: { label: "Cashed!", color: C.teal, icon: "💰" }, day2: { label: "Made Day 2", color: C.mauve, icon: "🌟" }, skipped: { label: "Skipped", color: C.surface2, icon: "⏭️" }, }; const SK = "manila-poker-v3"; const load = () => { try { return JSON.parse(localStorage.getItem(SK)); } catch { return null; } }; const save = s => { try { localStorage.setItem(SK, JSON.stringify(s)); } catch {} }; const cv = (php, cur) => { if (php == null) return "—"; if (cur==="USD") return `$${Math.round(php*PHP_TO_USD).toLocaleString()}`; if (cur==="DKK") return `${Math.round(php*PHP_TO_DKK).toLocaleString()} kr`; return `₱${php.toLocaleString()}`; }; export default function App() { const sv = load(); const [day, setDay] = useState("2026-05-04"); const [sts, setSts] = useState(sv?.sts || {}); const [prizes, setPrizes] = useState(sv?.prizes || {}); const [places, setPlaces] = useState(sv?.places || {}); const [reents, setReents] = useState(sv?.reents || {}); const [editId, setEditId] = useState(null); const [showBudget, setShowBudget] = useState(false); const [cur, setCur] = useState("PHP"); const [vf, setVf] = useState("all"); const [showCash, setShowCash] = useState(false); const [dimOthers, setDimOthers] = useState(true); useEffect(() => { save({ sts, prizes, places, reents }); }, [sts, prizes, places, reents]); const gs = id => sts[id] || "upcoming"; const ss = (id, s) => { setSts(p => ({...p,[id]:s})); if(s==="cashed") setEditId(id); else setEditId(null); }; const dayTs = useMemo(() => { let t = ALL_T.filter(t => t.date === day); if (vf !== "all") t = t.filter(t => t.venue === vf); return t.sort((a,b) => a.time.localeCompare(b.time) || a.venue.localeCompare(b.venue)); }, [day, vf]); const hasActive = dayTs.some(t => ["playing","registered"].includes(gs(t.id))); const budget = useMemo(() => { let sp=0, wn=0, cnt=0, cs=0; ALL_T.forEach(t => { const s = gs(t.id); if (["registered","playing","busted","cashed","day2"].includes(s)) { sp += t.buyin*(1+(reents[t.id]||0)); cnt++; } if (s==="cashed" && prizes[t.id]) { wn += prizes[t.id]; cs++; } }); return { sp, wn, net: wn-sp, cnt, cs }; }, [sts, prizes, reents]); const dStats = date => { const t = ALL_T.filter(t => t.date === date); const p = t.filter(t => !["upcoming","skipped"].includes(gs(t.id))); const w = t.filter(t => gs(t.id)==="cashed"); return { tot: t.length, pl: p.length, wn: w.length }; }; const $cv = php => cv(php, cur); return (
MAY 4–10 · OKADA MILLIONS + METRO CC + LOCAL ROOMS