(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,18471,(e,t,r)=>{"use strict";var s=e.r(46146),a="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=s.useState,n=s.useEffect,i=s.useLayoutEffect,l=s.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!a(e,r)}catch(e){return!0}}var c="u"<typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var r=t(),s=o({inst:{value:r,getSnapshot:t}}),a=s[0].inst,c=s[1];return i(function(){a.value=r,a.getSnapshot=t,u(a)&&c({inst:a})},[e,r,t]),n(function(){return u(a)&&c({inst:a}),e(function(){u(a)&&c({inst:a})})},[e]),l(r),r};r.useSyncExternalStore=void 0!==s.useSyncExternalStore?s.useSyncExternalStore:c},62408,(e,t,r)=>{"use strict";t.exports=e.r(18471)},94386,(e,t,r)=>{"use strict";var s=e.r(46146),a=e.r(62408),o="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},n=a.useSyncExternalStore,i=s.useRef,l=s.useEffect,u=s.useMemo,c=s.useDebugValue;r.useSyncExternalStoreWithSelector=function(e,t,r,s,a){var d=i(null);if(null===d.current){var g={hasValue:!1,value:null};d.current=g}else g=d.current;var p=n(e,(d=u(function(){function e(e){if(!l){if(l=!0,n=e,e=s(e),void 0!==a&&g.hasValue){var t=g.value;if(a(t,e))return i=t}return i=e}if(t=i,o(n,e))return t;var r=s(e);return void 0!==a&&a(t,r)?(n=e,t):(n=e,i=r)}var n,i,l=!1,u=void 0===r?null:r;return[function(){return e(t())},null===u?void 0:function(){return e(u())}]},[t,r,s,a]))[0],d[1]);return l(function(){g.hasValue=!0,g.value=p},[p]),c(p),p}},45093,(e,t,r)=>{"use strict";t.exports=e.r(94386)},99901,e=>{"use strict";let t={get url(){return`file://${e.P("node_modules/.pnpm/zustand@4.5.7_@types+react@19.1.17_react@19.1.0/node_modules/zustand/esm/vanilla.mjs")}`}},r=e=>{let r,s=new Set,a=(e,t)=>{let a="function"==typeof e?e(r):e;if(!Object.is(a,r)){let e=r;r=(null!=t?t:"object"!=typeof a||null===a)?a:Object.assign({},r,a),s.forEach(t=>t(r,e))}},o=()=>r,n={setState:a,getState:o,getInitialState:()=>i,subscribe:e=>(s.add(e),()=>s.delete(e)),destroy:()=>{(t.env?t.env.MODE:void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),s.clear()}},i=r=e(a,o,n);return n};var s=e.i(46146),a=e.i(45093);let o={get url(){return`file://${e.P("node_modules/.pnpm/zustand@4.5.7_@types+react@19.1.17_react@19.1.0/node_modules/zustand/esm/index.mjs")}`}},{useDebugValue:n}=s.default,{useSyncExternalStoreWithSelector:i}=a.default,l=!1,u=e=>{(o.env?o.env.MODE:void 0)!=="production"&&"function"!=typeof e&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");let t="function"==typeof e?e?r(e):r:e,s=(e,r)=>(function(e,t=e=>e,r){(o.env?o.env.MODE:void 0)!=="production"&&r&&!l&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),l=!0);let s=i(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,r);return n(s),s})(t,e,r);return Object.assign(s,t),s},c=e=>e?u(e):u;e.s(["create",()=>c],99901)},20125,43360,71768,38599,78515,e=>{"use strict";let t;function r(e,t,r){if(t){let r=t.find(t=>t.category===e);if(r?.categoryMaxRank)return r.categoryMaxRank}return"coffee"===e||"baseball"===e?73:"pro_sports_championships"===e?24:"usa"===r?50:100}function s(e){let t=e.length;if(0===t)return[];let r=Number.MAX_SAFE_INTEGER,s=Array(t+1).fill(0),a=Array(t+1).fill(0),o=Array(t+1).fill(0),n=Array(t+1).fill(0);for(let i=1;i<=t;i++){o[0]=i;let l=0,u=Array(t+1).fill(r),c=Array(t+1).fill(!1);do{c[l]=!0;let i=o[l],d=r,g=0;for(let r=1;r<=t;r++)if(!c[r]){let t=e[i-1][r-1]-s[i]-a[r];t<u[r]&&(u[r]=t,n[r]=l),u[r]<d&&(d=u[r],g=r)}for(let e=0;e<=t;e++)c[e]?(s[o[e]]+=d,a[e]-=d):u[e]-=d;l=g}while(0!==o[l])for(;0!==l;){let e=n[l];o[l]=o[e],l=e}}let i=Array(t).fill(-1);for(let e=1;e<=t;e++)0!==o[e]&&(i[o[e]-1]=e-1);return i}function a(e,t){let s=[...new Set(e.map(e=>e.category))],a=new Set,o=[];for(let n of e){let i,l,u=s.filter(e=>!a.has(e)),c=n.country,d=1/0,g=null;for(let s of u){let a=c.rankings[s],o=r(s,e,t);void 0!==a&&a<=o&&a<d&&(d=a,g=s)}null!==g?(i=g,l=d):l=r(i=u[0],e,t),o.push({country:c,category:i,rank:l,countryEmoji:n.countryEmoji}),a.add(i)}let n=o.reduce((e,t)=>e+t.rank,0);return{assignments:o,optimalScore:n}}function o(e,t){let{assignments:s}=a(e,t),o=[],n=0;for(let a=0;a<e.length;a++){let i=e[a],l=s[a],u=r(i.category,e,t),c=l?r(l.category,e,t):u,d=l&&i.category===l.category||i.rank>=u&&void 0!==l&&l.rank>=c;d&&n++,o.push(d?"optimal":"suboptimal")}return{optimalCount:n,totalRounds:e.length,statuses:o}}function n(e,t){let a=[...new Set(e.map(e=>e.category))],o=Math.min(e.length,a.length);if(0===o)return{assignments:[],optimalScore:0};let n=[];for(let s=0;s<o;s++){let i=[],l=e[s].country;for(let s=0;s<o;s++){let o=a[s],n=r(o,e,t),u=l.rankings[o];i.push(void 0!==u&&u<=n?u:n+1)}n.push(i)}let i=s(n),l=[];for(let s=0;s<o;s++){let o=i[s],u=a[o],c=n[s][o],d=r(u,e,t),g=c>d?d:c;l.push({country:e[s].country,category:u,rank:g,countryEmoji:e[s].countryEmoji})}let u=l.reduce((e,t)=>e+t.rank,0);return{assignments:l,optimalScore:u}}function i(e,t,a){if(!t)return{...n(e,a),skippedCountry:null};let o=[...new Set(e.map(e=>e.category))],i=o.length;if(0===i)return{assignments:[],optimalScore:0,skippedCountry:null};let l=[...e.map(e=>({country:e.country,countryEmoji:e.countryEmoji})),{country:t.country,countryEmoji:t.countryEmoji}],u=l.length,c=[];for(let t=0;t<u;t++){let s=l[t].country,n=[];for(let t=0;t<u;t++)if(t<i){let i=o[t],l=r(i,e,a),u=s.rankings[i];n.push(void 0!==u&&u<=l?u:l+1)}else n.push(0);c.push(n)}let d=s(c),g=[],p=null;for(let t=0;t<u;t++){let s=d[t];if(s>=i){p={name:l[t].country.name,emoji:l[t].countryEmoji||l[t].country.emoji||"🌍"};continue}let n=o[s],u=c[t][s],f=r(n,e,a),m=u>f?f:u;g.push({country:l[t].country,category:n,rank:m,countryEmoji:l[t].countryEmoji})}let f=g.reduce((e,t)=>e+t.rank,0);return{assignments:g,optimalScore:f,skippedCountry:p}}function l(e,t=100){let r=e/t;return r<=.05?"#4ade80":r<=.15?"#34d399":r<=.3?"#60a5fa":r<=.5?"#fbbf24":r<=.65?"#fb923c":"#ef4444"}function u(e){return({canada:13,usa:50,europe:44,empires:40,"world-cup":48,"world-cup-ko":48})[e]??100}function c(e){return`supabase_data_v5_${e}`}async function d(e){if(!t)return null;try{let r=await Promise.resolve(t.get(e));if(!r)return null;let s=JSON.parse(r);if(5!==s.v||Date.now()-s.ts>36e5)return null;return{countries:s.countries,categories:s.categories??[],rankCaps:s.rankCaps}}catch{return null}}async function g(e,r){if(t)try{let s={v:5,ts:Date.now(),countries:r.countries,categories:r.categories,rankCaps:r.rankCaps};await Promise.resolve(t.set(e,JSON.stringify(s)))}catch{}}async function p(e,t,r={}){let s=c(e);if(!r.skipCache){let e=await d(s);if(e)return e}try{let{data:r,error:a}=await t.from("game_mode_categories").select("category_id, rank_cap, display_order").eq("game_mode",e).order("display_order");if(a||!r?.length)return console.warn(`[SupabaseDataLoader] No categories found for mode "${e}":`,a?.message),null;let o=r.map(e=>e.category_id),n=Object.fromEntries(r.map(e=>[e.category_id,e.rank_cap??100])),i=Object.fromEntries(r.map(e=>[e.category_id,e.display_order??0])),{data:l}=await t.from("categories").select("id, name, emoji, description").in("id",o),u=(l??[]).map(e=>({id:e.id,name:e.name.replace(/\s*\((?:States|Provinces|Countries|Sports)\)\s*$/u,""),icon:e.emoji??"",description:e.description??""}));u.sort((e,t)=>(i[e.id]??0)-(i[t.id]??0));let{data:c,error:d}=await t.from("country_category_rankings").select(`
        country_id,
        category_id,
        rank,
        countries!inner (
          id,
          name,
          emoji,
          flag_url,
          is_usa_state,
          is_active
        )
      `).in("category_id",o).eq("countries.is_active",!0).eq("countries.is_usa_state","usa"===e);if(d||!c?.length)return console.warn(`[SupabaseDataLoader] No rankings found for mode "${e}":`,d?.message),null;let p=new Map;for(let e of c){let t=e.countries;if(!t)continue;let r=t.id,s=e.category_id,a=n[s]??100,o=Math.min(e.rank,a);if(!p.has(r)){let e=t.emoji;if(!e){let r=(t.id||"").toUpperCase().slice(0,2);e=2===r.length?String.fromCodePoint(...r.split("").map(e=>127397+e.charCodeAt(0))):"🌍"}p.set(r,{name:t.name,flag:t.flag_url||`/flags/${t.id}.png`,emoji:e,rankings:{}})}let i=p.get(r);(void 0===i.rankings[s]||o<i.rankings[s])&&(i.rankings[s]=o)}let f=Array.from(p.values());for(let e of f)for(let t of o)void 0===e.rankings[t]&&(e.rankings[t]=(n[t]??100)+1);f.sort((e,t)=>e.name.localeCompare(t.name));let m={countries:f,categories:u,rankCaps:n};return await g(s,m),m}catch(e){return console.warn("[SupabaseDataLoader] Unexpected error:",e),null}}async function f(e,t={}){let r="footy-clubs",s=c(r);if(!t.skipCache){let e=await d(s);if(e)return e}try{let{data:t,error:a}=await e.from("game_mode_categories").select("category_id, rank_cap, display_order").eq("game_mode",r).order("display_order");if(a||!t?.length)return console.warn(`[SupabaseDataLoader] No categories found for mode "${r}":`,a?.message),null;let o=t.map(e=>e.category_id),n=Object.fromEntries(t.map(e=>[e.category_id,e.rank_cap??100])),i=Object.fromEntries(t.map(e=>[e.category_id,e.display_order??0])),{data:l}=await e.from("categories").select("id, name, emoji, description").in("id",o),u=(l??[]).map(e=>({id:e.id,name:e.name,icon:e.emoji??"",description:e.description??""}));u.sort((e,t)=>(i[e.id]??0)-(i[t.id]??0));let{data:c,error:d}=await e.from("club_category_rankings").select(`
        club_id,
        category_id,
        rank,
        football_clubs!inner (
          id,
          name,
          emoji,
          kit_asset,
          is_active
        )
      `).in("category_id",o).eq("football_clubs.is_active",!0);if(d||!c?.length)return console.warn(`[SupabaseDataLoader] No rankings found for mode "${r}":`,d?.message),null;let p=new Map;for(let e of c){let t=e.football_clubs;if(!t)continue;let r=t.id,s=e.category_id,a=n[s]??100,o=Math.min(e.rank,a);p.has(r)||p.set(r,{name:t.name,flag:`/footy-clubs/kits/${t.kit_asset||`${t.id}.png`}`,emoji:t.emoji||"⚽",kitAsset:t.kit_asset||`${t.id}.png`,rankings:{}});let i=p.get(r);(void 0===i.rankings[s]||o<i.rankings[s])&&(i.rankings[s]=o)}let f=Array.from(p.values());for(let e of f)for(let t of o)void 0===e.rankings[t]&&(e.rankings[t]=(n[t]??100)+1);f.sort((e,t)=>e.name.localeCompare(t.name));let m={countries:f,categories:u,rankCaps:n};return await g(s,m),m}catch(e){return console.warn("[SupabaseDataLoader] loadClubModeData unexpected error:",e),null}}e.s(["computeNormalModeOptimalPicks",()=>o,"computeOptimalAssignment",()=>n,"computeOptimalAssignmentWithSkip",()=>i,"computeSequentialOptimal",()=>a,"getMaxRankForMode",()=>u,"getRankColor",()=>l,"hungarianAlgorithm",()=>s],43360),e.i(41580),new TextEncoder,new TextDecoder,e.s(["loadClubModeData",()=>f,"loadGameModeData",()=>p],71768);let m=[16,185,129],y=[234,179,8],h=[239,68,68];function b(e){return"number"==typeof e&&e>0&&e<999}function _(e,t,r){return Math.round(e+(t-e)*Math.max(0,Math.min(1,r)))}function S(e){return"#"+e.map(e=>e.toString(16).padStart(2,"0")).join("")}function w(e,t,r){return S([_(e[0],t[0],r),_(e[1],t[1],r),_(e[2],t[2],r)])}function v(e){let t,r,s,a=Math.max(0,e.currentScore),o=(s=[],"daily"===e.gameMode?b(e.dailyOptimal)&&s.push({target:e.dailyOptimal,tier:"daily_optimal"}):b(e.personalBest)&&s.push({target:e.personalBest,tier:"personal_best"}),s.some(e=>200===e.target)||s.push({target:200,tier:"standard_200"}),s.sort((e,t)=>e.target-t.target),s),{target:n,tier:i}=(()=>{for(let e of o)if(a<e.target)return e;return o[o.length-1]})(),l=Math.max(0,Math.min(100,Math.round(a/n*100)));if(0===e.usedCount)t="neutral",r="#ffffff";else{let s=a/e.usedCount*Math.max(1,e.totalCountries),n=o[o.length-1].target,i=Math.min(1,3*(e.usedCount/Math.max(1,e.totalCountries))),l=s/n*i+(1-i)*1;r=l<=.7?S(m):l<=1.2?w(m,y,(l-.7)/.5):l<=2?w(y,h,(l-1.2)/.8):S(h),t=l<=.95?"green":l<=1.2?"yellow":"red"}return{target:n,tier:i,fillPercent:l,color:t,colorHex:r,overshotBy:Math.max(0,a-n)}}function k(e){let{profileStatus:t,isPaying:r}=e;switch(t){case"loaded":return!r;case"absent":return!0;default:return!1}}e.s(["computeTargetBar",()=>v],38599),e.i(24856),e.s(["computeAdsAllowed",()=>k],78515),e.s([],20125)},18738,e=>{"use strict";let t="geohunter:device_id",r="geohunter:session_id";function s(){return"u">typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}let a=null;function o(){return a||(a=(async()=>{try{let{createClient:t}=await e.A(22005);return t("https://fxyarvoootmvlrveblfx.supabase.co","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImZ4eWFydm9vb3RtdmxydmVibGZ4Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTUxMTQzMDIsImV4cCI6MjA3MDY5MDMwMn0.4HM_RihHjvAz-ETTKXJFRH5Ea2_2ueHXl3GV1h_vmgA")}catch{return null}})()),a}let n=[],i=null,l=!1;async function u(){if(0===n.length)return;let e=n;n=[];try{let t=await o();if(!t)return;await t.from("app_events").insert(e)}catch{}}async function c(e,a){try{if(!l){l=!0;try{document.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&u()}),window.addEventListener("pagehide",()=>{u()})}catch{}}let c=null;try{let e=await o();if(e){let{data:{session:t}}=await e.auth.getSession();c=t?.user?.id??null}}catch{c=null}n.push({device_id:function(){try{let e=window.localStorage.getItem(t);return e||(e=s(),window.localStorage.setItem(t,e)),e}catch{return null}}(),user_id:c,session_id:function(){try{let e=window.sessionStorage.getItem(r);return e||(e=s(),window.sessionStorage.setItem(r,e)),e}catch{return null}}(),event_name:e,properties:a??{},platform:"web",app_version:null,created_at:new Date().toISOString()}),n.length>=10?(i&&(clearTimeout(i),i=null),u()):i||(i=setTimeout(()=>{i=null,u()},5e3))}catch{}}function d(e,t){return c("paywall_shown",{source:e,...t})}function g(e,t){return c("paywall_cta",{source:e,...t})}let p={pageView:e=>{window.gtag&&window.gtag("config","G-17MR8FVFZ7",{page_location:e})},event:(e,t)=>{window.gtag&&window.gtag("event",e,t)},game:{start:e=>{p.event("game_start",{event_category:"Game",event_label:e,custom_parameter_1:e})},complete:(e,t,r)=>{p.event("game_complete",{event_category:"Game",event_label:e,value:t,custom_parameter_1:e,custom_parameter_2:r})},dailyChallenge:(e,t)=>{p.event(`daily_challenge_${e}`,{event_category:"Daily Challenge",event_label:e,value:t})},leaderboard:(e,t)=>{p.event(`leaderboard_${e}`,{event_category:"Leaderboard",event_label:t||"unknown"})},auth:e=>{p.event(`user_${e}`,{event_category:"Authentication",event_label:e})},pwa:e=>{p.event(`pwa_${e}`,{event_category:"PWA",event_label:e})}}};e.s(["analytics",0,p,"trackEvent",()=>c,"trackPaywall",()=>d,"trackPaywallCta",()=>g,"useAnalytics",0,()=>p])},98355,e=>{"use strict";function t(e){let t=new Intl.DateTimeFormat("en-US",{timeZone:"America/New_York",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZoneName:"short"}).formatToParts(e),r={};for(let e of t)"literal"!==e.type&&(r[e.type]=e.value);let s=(r.timeZoneName||"GMT-5").match(/GMT([+-]\d{1,2})/),a=s?parseInt(s[1],10):-5,o=parseInt(r.year,10),n=parseInt(r.month,10),i=parseInt(r.day,10),l=parseInt(r.hour,10);return{year:o,month:n,day:i,hour:l,minute:parseInt(r.minute,10),second:parseInt(r.second,10),offsetHours:a}}function r(){let{year:e,month:r,day:s,hour:a,minute:o,second:n,offsetHours:i}=t(new Date);return new Date(Date.UTC(e,r-1,s,a-i,o,n))}function s(){return a(new Date)}function a(e){let{year:r,month:s,day:a}=t(e);return`${r}-${String(s).padStart(2,"0")}-${String(a).padStart(2,"0")}`}function o(e){if(!e)return!1;let t=s();if(e===t)return!0;let[r,a,o]=t.split("-").map(Number),n=new Date(r,a-1,o);return n.setDate(n.getDate()-1),e===`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}function n(){let{year:e,month:r,day:s,hour:a,minute:o,second:n,offsetHours:i}=t(new Date),l=Date.UTC(e,r-1,s,a-i,o,n),u=Date.UTC(e,r-1,s+1,0-i,0,0)-l;return{hours:Math.floor(u/36e5),minutes:Math.floor(u%36e5/6e4),seconds:Math.floor(u%6e4/1e3)}}e.s(["getEasternDateString",()=>s,"getEasternDateStringFrom",()=>a,"getEasternNow",()=>r,"getTimeUntilNextEasternMidnight",()=>n,"isStreakActive",()=>o])},73261,e=>{"use strict";class t{static setCookie(e,t,r=365){if("u"<typeof document)return;let s=new Date;s.setTime(s.getTime()+24*r*36e5),document.cookie=`${e}=${t};expires=${s.toUTCString()};path=/;SameSite=Lax`}static getCookie(e){if("u"<typeof document)return null;let t=e+"=",r=document.cookie.split(";");for(let e=0;e<r.length;e++){let s=r[e];for(;" "===s.charAt(0);)s=s.substring(1,s.length);if(0===s.indexOf(t))return s.substring(t.length,s.length)}return null}static deleteCookie(e){"u">typeof document&&(document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`)}static saveHighScore(e,t="original"){try{let r=this.getHighScore(t);e<r?(this.setCookie(`geohunter-best-${t}`,e.toString(),365),console.log(`✅ Cookie saved: geohunter-best-${t} = ${e}`)):console.log(`ℹ️ Score ${e} not better than current best ${r} for ${t}`)}catch(e){console.error("Failed to save high score to cookie:",e)}}static getHighScore(e="original"){try{let t=this.getCookie(`geohunter-best-${e}`);return t?Number.parseInt(t):999}catch(e){return console.error("Failed to get high score from cookie:",e),999}}static saveDailyScore(e,t){let r=t||new Date().toISOString().split("T")[0];this.setCookie(`geohunter-daily-${r}`,e.toString(),30)}static getDailyScore(e){let t=e||new Date().toISOString().split("T")[0],r=this.getCookie(`geohunter-daily-${t}`);return r?Number.parseInt(r):null}static getDailyBestScore(){let e=this.getCookie("geohunter-daily-best");return e?Number.parseInt(e):999}static saveDailyBestScore(e){e<this.getDailyBestScore()&&this.setCookie("geohunter-daily-best",e.toString(),365)}static saveDailyAttempt(e){let t=this.getDailyAttempts(),r=t.findIndex(t=>t.date===e.date);r>=0?t[r]=e:t.push(e);let s=new Date;s.setDate(s.getDate()-30);let a=s.toISOString().split("T")[0],o=t.filter(e=>e.date>=a);this.setCookie("geohunter-daily-attempts",JSON.stringify(o),30),this.saveDailyBestScore(e.score)}static getDailyAttempts(){let e=this.getCookie("geohunter-daily-attempts");return e?JSON.parse(e):[]}static hasDailyAttemptToday(){let e=new Date().toISOString().split("T")[0];return this.getDailyAttempts().some(t=>t.date===e&&t.completed)}static savePreferences(e){this.setCookie("geohunter-preferences",JSON.stringify(e),365)}static getPreferences(){let e={soundEnabled:!0,showCountryNames:!0,showHints:!0,showTargetBar:!0},t=this.getCookie("geohunter-preferences");if(t)try{return{...e,...JSON.parse(t)}}catch{}return e}static saveRememberMe(e){this.setCookie("geohunter-remember",e,30)}static getRememberedUser(){return this.getCookie("geohunter-remember")}static clearRememberMe(){this.deleteCookie("geohunter-remember")}}e.s(["CookieStorage",()=>t])},8519,12598,e=>{"use strict";var t=e.i(99901),r=e.i(61584);e.i(20125);var s=e.i(43360);e.i(24856);var a=e.i(34048),o=e.i(18738),n=e.i(98355);class i{static PENDING_BADGES_KEY="geohunter-pending-badges";static finalizationTimer=null;static async markPotentialBadge(e,t,r,s){let a=(0,n.getEasternDateString)(),o=this.getPendingBadges(),i=o.findIndex(t=>t.user_id===e&&t.challenge_date===a),l={user_id:e,username:t,score:r,rank:s,challenge_date:a,created_at:new Date().toISOString()};i>=0?s<o[i].rank&&(o[i]=l):o.push(l),localStorage.setItem(this.PENDING_BADGES_KEY,JSON.stringify(o)),this.scheduleFinalization()}static getPendingBadges(){try{let e=localStorage.getItem(this.PENDING_BADGES_KEY);return e?JSON.parse(e):[]}catch{return[]}}static scheduleFinalization(){if(this.finalizationTimer)return;let{hours:e,minutes:t,seconds:r}=(0,n.getTimeUntilNextEasternMidnight)(),s=(60*e*60+60*t+r)*1e3+5e3;console.log(`Badge finalization scheduled in ${e}h ${t}m ${r}s`),this.finalizationTimer=setTimeout(async()=>{await this.finalizeBadges(),this.finalizationTimer=null,this.scheduleFinalization()},s)}static async finalizeBadges(){console.log("🏆 Finalizing daily badges...");let e=this.getPendingBadges(),t=this.getYesterdayEasternDate(),r=e.filter(e=>e.challenge_date===t);if(0===r.length)return void console.log("No badges ready for finalization");for(let e of r)try{await this.awardBadgeToUser(e),console.log(`✅ Badge awarded to ${e.username} - Rank #${e.rank}`)}catch(t){console.error(`❌ Failed to award badge to ${e.username}:`,t)}let s=e.filter(e=>e.challenge_date!==t);localStorage.setItem(this.PENDING_BADGES_KEY,JSON.stringify(s)),console.log(`🎯 Finalized ${r.length} badges for ${t}`)}static async awardBadgeToUser(e){if(!r.supabase)throw Error("Supabase not configured");let{data:t}=await r.supabase.from("users").select("best_daily_rank").eq("id",e.user_id).single();if(!t||!t.best_daily_rank||e.rank<t.best_daily_rank){let{error:t}=await r.supabase.from("users").update({best_daily_rank:e.rank,best_daily_rank_date:e.challenge_date,best_daily_rank_score:e.score}).eq("id",e.user_id);if(t)throw t}}static getYesterdayEasternDate(){let e=new Date(new Date().getTime()-864e5),t=new Intl.DateTimeFormat("en-US",{timeZone:"America/New_York",year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(e),r=t.find(e=>"year"===e.type)?.value,s=t.find(e=>"month"===e.type)?.value,a=t.find(e=>"day"===e.type)?.value;return`${r}-${s}-${a}`}static initialize(){this.cleanupOldPendingBadges(),this.scheduleFinalization(),console.log("🎯 Daily badge finalizer initialized")}static cleanupOldPendingBadges(){let e=this.getPendingBadges(),t=new Date(Date.now()-6048e5),r=e.filter(e=>new Date(e.created_at)>t);localStorage.setItem(this.PENDING_BADGES_KEY,JSON.stringify(r))}static async forceFinalization(){await this.finalizeBadges()}static getPendingCount(){return this.getPendingBadges().length}}e.s(["DailyBadgeFinalizer",()=>i],12598);var l=e.i(73261);let u=e=>({bestOriginal:e?.bestOriginal??999,bestWorld:e?.bestWorld??999,bestSpecial:e?.bestSpecial??999,bestVoyage:e?.bestVoyage??999,bestAtlas:e?.bestAtlas??999,bestUSA:e?.bestUSA??999,bestSports:e?.bestSports??999,bestCanada:e?.bestCanada??999,bestEurope:e?.bestEurope??999,bestEmpires:e?.bestEmpires??999,bestWorldCup:e?.bestWorldCup??999,bestFootyClubs:e?.bestFootyClubs??999,bestWeeklyPro:e?.bestWeeklyPro??999,bestDaily:e?.bestDaily??999,gamesPlayed:e?.gamesPlayed??0,averageScore:e?.averageScore??0,dailyStreak:e?.dailyStreak??0,lastDailyPlay:e?.lastDailyPlay??null,totalPerfectRounds:e?.totalPerfectRounds??0,longestStreak:e?.longestStreak??0,totalPlayTime:e?.totalPlayTime??0});function c(e,t){let r=e.stats,s={bestOriginal:t.original,bestWorld:t.world,bestSpecial:t.special,bestVoyage:t.voyage,bestAtlas:t.atlas,bestUSA:t.usa,bestSports:t.sports,bestCanada:t.canada,bestEurope:t.europe,bestEmpires:t.empires,bestDaily:t.daily,longestStreak:e.stats.longestStreak,gamesPlayed:e.stats.gamesPlayed,dailyWins:r.dailyWins,weeklyProStreak:r.weeklyProStreak,bestReversePlus:r.bestReversePlus,duelWins:r.duelWins},o=!!e.isPro&&(!e.proExpiresAt||new Date(e.proExpiresAt)>new Date),n=!!e.isExplorer&&(!e.explorerExpiresAt||new Date(e.explorerExpiresAt)>new Date),i=(0,a.computeEarnedBadges)({stats:s,hasPro:o,hasExplorer:n,ownedProducts:e.ownedProducts});return t.empires<200&&i.push("empires_200"),t.worldCup<200&&i.push("world_cup_200"),t.footyClubs<200&&i.push("footy_clubs_200"),i}async function d(e,t=3){if(!r.supabase)return null;for(let s=0;s<t;s++){let{data:a,error:o}=await r.supabase.from("users").select("*").eq("id",e).single();if(a&&!o)return a;s<t-1&&await new Promise(e=>setTimeout(e,400*(s+1)))}return null}let g=(0,t.create)((e,t)=>({user:null,supabaseUser:null,isAuthenticated:!1,isLoading:!0,profileStatus:"pending",bestScores:{original:999,world:999,daily:999,special:999,voyage:999,atlas:999,usa:999,sports:999,canada:999,europe:999,empires:999,worldCup:999,footyClubs:999,weeklyPro:999,overall:999},bestDailyRankingBadge:null,statsSyncError:!1,syncFailedCount:0,lastSyncError:null,isRefreshingPurchase:!1,activeBadge:localStorage.getItem("@geohunter_active_badge"),followingCount:0,followersCount:0,pendingRequestsCount:0,fetchFollowingCount:async()=>{let{user:r}=t();if(r?.id)try{let t=await fetch(`/api/social/following?user_id=${r.id}&count_only=true`);if(t.ok){let r=await t.json();e({followingCount:r.count??0})}}catch{}},fetchFollowersCount:async()=>{let{user:r}=t();if(r?.id)try{let t=await fetch(`/api/social/followers?user_id=${r.id}&count_only=true`);if(t.ok){let r=await t.json();e({followersCount:r.count??0})}}catch{}},fetchPendingRequestsCount:async()=>{let{user:r}=t();if(r?.id)try{let t=await fetch(`/api/social/friend-requests?user_id=${r.id}&count_only=true`);if(t.ok){let r=await t.json();e({pendingRequestsCount:r.count??0})}}catch{}},setActiveBadge:s=>{e({activeBadge:s}),s?localStorage.setItem("@geohunter_active_badge",s):localStorage.removeItem("@geohunter_active_badge");let{user:a}=t();a&&r.supabase&&r.supabase.from("users").update({active_badge:s}).eq("id",a.id).then(()=>{})},initializeAuth:async()=>{console.log("🔄 Starting auth initialization..."),console.log("🌍 Environment check:",{hasWindow:!0,supabaseConfigured:(0,r.isSupabaseConfigured)(),userAgent:window.navigator?.userAgent});let s=setTimeout(()=>{console.log("⏰ Auth initialization timeout - setting loading to false"),e({isLoading:!1})},3e3);try{if(!(0,r.isSupabaseConfigured)()){console.log("[Auth] Supabase not configured - skipping auth initialization"),clearTimeout(s),e({isLoading:!1,isAuthenticated:!1,profileStatus:"absent"});return}console.log("🔍 Getting current user from Supabase...");let{data:{user:a},error:o}=await r.supabase.auth.getUser();if(o){clearTimeout(s),o.message?.includes("Auth session missing")?(console.log("👤 No active session (user not logged in)"),e({isLoading:!1,profileStatus:"absent"})):(console.error("❌ Error getting user:",o),e({isLoading:!1}));return}if(a){console.log("👤 Found authenticated user:",a.id);let r=await d(a.id);r?(console.log("✅ User profile loaded:",r.username),console.log("🔍 [DEBUG] owned_products from DB:",r.owned_products),console.log("🔍 [DEBUG] is_pro from DB:",r.is_pro),clearTimeout(s),e({user:{id:r.id,username:r.username,email:r.email,createdAt:r.created_at,displayName:r.display_name,avatarUrl:r.avatar_url,bio:r.bio,homeCountry:r.home_country??null,nationsCupPick:r.nations_cup_pick??null,subscriptionTier:r.subscription_tier||"free",ownedProducts:r.owned_products||[],footyTrialUsed:r.footy_trial_used??!1,isPro:r.is_pro||!1,proExpiresAt:r.pro_expires_at,isExplorer:r.is_explorer||!1,explorerExpiresAt:r.explorer_expires_at,stats:u(r.stats)},supabaseUser:a,isAuthenticated:!0,isLoading:!1,profileStatus:"loaded",statsSyncError:!1}),r.active_badge&&(e({activeBadge:r.active_badge}),localStorage.setItem("@geohunter_active_badge",r.active_badge)),await Promise.all([t().refreshBestScores().catch(e=>{console.error("Error refreshing best scores:",e)}),t().fetchFollowingCount().catch(()=>{}),t().fetchFollowersCount().catch(()=>{}),t().fetchPendingRequestsCount().catch(()=>{})])):(console.error("❌ Error loading user profile after retries"),clearTimeout(s),e({isLoading:!1}))}else console.log("👤 No authenticated user found"),clearTimeout(s),e({isLoading:!1,profileStatus:"absent"});r.supabase.auth.onAuthStateChange(async(s,a)=>{if(console.log("🔄 Auth state change:",s,a?.user?.id||"no user"),t().isRefreshingPurchase)return void console.log("🛡️ Ignoring auth change during purchase refresh");if("SIGNED_IN"===s&&a?.user){let{data:s}=await r.supabase.from("users").select("*").eq("id",a.user.id).single();s&&(e({user:{id:s.id,username:s.username,email:s.email,createdAt:s.created_at,homeCountry:s.home_country??null,nationsCupPick:s.nations_cup_pick??null,subscriptionTier:s.subscription_tier||"free",ownedProducts:s.owned_products||[],footyTrialUsed:s.footy_trial_used??!1,isPro:s.is_pro||!1,proExpiresAt:s.pro_expires_at,isExplorer:s.is_explorer||!1,explorerExpiresAt:s.explorer_expires_at,stats:u(s.stats)},supabaseUser:a.user,isAuthenticated:!0,isLoading:!1,profileStatus:"loaded"}),t().refreshBestScores().catch(()=>{}))}else"SIGNED_OUT"===s&&(console.log("🚪 User signed out"),e({user:null,supabaseUser:null,isAuthenticated:!1,profileStatus:"absent",statsSyncError:!1,syncFailedCount:0,lastSyncError:null,bestScores:{original:999,world:999,daily:999,special:999,voyage:999,atlas:999,usa:999,sports:999,canada:999,europe:999,empires:999,worldCup:999,footyClubs:999,weeklyPro:999,overall:999},bestDailyRankingBadge:null}))})}catch(t){console.error("❌ Auth initialization error:",t),clearTimeout(s),e({isLoading:!1,isAuthenticated:!1,user:null})}},login:async(s,a)=>{if(!(0,r.isSupabaseConfigured)())return console.log("[Auth] Cannot login - Supabase not configured"),!1;try{console.log("🔐 Login attempt for:",s),e({isLoading:!0});let{data:o,error:n}=await r.supabase.auth.signInWithPassword({email:s,password:a});if(n)return console.error("❌ Login error:",n.message,n.status),n.message.includes("Invalid login credentials")&&console.error('💡 Tip: Double-check your email and password. If you forgot your password, use "Forgot password?" link.'),e({isLoading:!1}),!1;if(o.user){console.log("✅ Auth successful, fetching user profile...");let{data:s,error:a}=await r.supabase.from("users").select("*").eq("id",o.user.id).single();if(a)return console.error("❌ User profile fetch error:",a),e({isLoading:!1}),!1;if(s)return console.log("✅ User profile loaded:",s.username),e({user:{id:s.id,username:s.username,email:s.email,createdAt:s.created_at,stats:u(s.stats)},supabaseUser:o.user,isAuthenticated:!0,isLoading:!1,profileStatus:"loaded"}),t().refreshBestScores().catch(()=>{}),t().syncLocalScoresToSupabase().catch(()=>{}),console.log("✅ Login complete"),!0}return console.error("❌ No user profile found"),e({isLoading:!1}),!1}catch(t){return console.error("❌ Login exception:",t),e({isLoading:!1}),!1}},signup:async(s,a,n)=>{if(!(0,r.isSupabaseConfigured)())return console.log("[Auth] Cannot signup - Supabase not configured"),!1;try{e({isLoading:!0});let{data:i}=await r.supabase.from("users").select("username").ilike("username",s).limit(1);if(i&&i.length>0)return console.log("[Auth] Username already taken (case-insensitive):",s),e({isLoading:!1}),!1;let{data:l,error:c}=await r.supabase.auth.signUp({email:a,password:n,options:{data:{username:s}}});if(c||!l.user)return console.error("Signup error:",c),e({isLoading:!1}),!1;(0,o.trackEvent)("account_created",{platform:"web"}).catch(()=>{}),await new Promise(e=>setTimeout(e,1e3));let{data:d}=await r.supabase.from("users").select("*").eq("id",l.user.id).single();return d&&(e({user:{id:d.id,username:d.username,email:d.email,createdAt:d.created_at,stats:u(d.stats)},supabaseUser:l.user,isAuthenticated:!0,isLoading:!1,profileStatus:"loaded"}),await t().refreshBestScores().catch(()=>{})),!0}catch(t){return console.error("Signup error:",t),e({isLoading:!1}),!1}},logout:async()=>{if(!(0,r.isSupabaseConfigured)()){console.log("[Auth] Cannot logout - Supabase not configured"),e({user:null,supabaseUser:null,isAuthenticated:!1,profileStatus:"absent",statsSyncError:!1,syncFailedCount:0,lastSyncError:null,bestScores:{original:999,world:999,daily:999,special:999,voyage:999,atlas:999,usa:999,sports:999,canada:999,europe:999,empires:999,worldCup:999,footyClubs:999,weeklyPro:999,overall:999}});return}try{let{error:e}=await r.supabase.auth.signOut({scope:"local"});e&&console.error("Logout error:",e)}catch(e){console.error("Logout error:",e)}finally{e({user:null,supabaseUser:null,isAuthenticated:!1,profileStatus:"absent",statsSyncError:!1,syncFailedCount:0,lastSyncError:null,bestScores:{original:999,world:999,daily:999,special:999,voyage:999,atlas:999,usa:999,sports:999,canada:999,europe:999,empires:999,worldCup:999,footyClubs:999,weeklyPro:999,overall:999}})}},updateUserStats:async(a,o,i,l={})=>{if(!(0,r.isSupabaseConfigured)())return void console.log("[Auth] Cannot update stats - Supabase not configured");let c=t();if(!c.user)return void console.error("❌ [updateUserStats] No user found, cannot save score");if(!o||"string"!=typeof o)return void console.error("❌ [updateUserStats] Invalid gameMode:",o);if(!["original","world","special","voyage","atlas","usa","daily","canada","europe","sports","empires","world-cup","world-cup-ko","footy-clubs","weekly-pro","mini-hunter","mini-hunter2","reverse","custom"].includes(o))return void console.error(`❌ [updateUserStats] Unknown gameMode "${o}" — refusing to save to avoid corrupting another mode's scores`);let d=l.isDaily??!1;try{let g,p=(0,n.getEasternDateString)(),f=d?"daily":o,m=d?"daily":o,y=`best${m.charAt(0).toUpperCase()+m.slice(1)}`,h=c.user.stats?.[y],b=!h||h>=999||a<h;if(console.log(`📊 [updateUserStats] Mode: ${o} (original: ${o}), Score: ${a}, StoredAs: ${f}, CurrentBest: ${h??"undefined"}, IsPersonalBest: ${b}`),!(d||b))return void console.log(`⏭️ Score ${a} is not a new personal best for ${f}. Skipping database save.`);console.log(`✅ Score ${a} is a personal best. Saving to database with mode=${f}.`);let _=d?l.dailyDate??p:null;if(console.log(`📅 [updateUserStats] Daily date info:`,{isDailyGame:d,optionsDailyDate:l.dailyDate,today:p,resultingDailyDate:_,dailyDateType:typeof _,dailyDateTruthy:!!_}),console.log(`🔐 [updateUserStats] Checking user_id... Type: ${typeof c.user.id}, Value: "${c.user.id}", Length: ${c.user.id?.length??"N/A"}`),!c.user.id||""===c.user.id.trim()){console.error("❌ Cannot save game session: user_id is empty or invalid",{userId:c.user.id,userIdType:typeof c.user.id,isUserObjectValid:!!c.user,hasIdProperty:"id"in c.user}),e({statsSyncError:!0,lastSyncError:"User ID invalid - cannot save score"});return}let S=c.user.id;console.log(`📤 [updateUserStats] About to insert with user_id:`,{value:S,type:typeof S,length:S?.length,isValid:/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(S),stringified:JSON.stringify({user_id:S})}),console.log(`📋 [updateUserStats] Selections array:`,{length:i?.length,isArray:Array.isArray(i),sample:i?.[0]});let w=[];try{w=i.map(e=>(console.log(`📝 Processing selection:`,{country:e.country.name,category:e.category}),{country:e.country.name,countryEmoji:e.country.emoji,category:e.category,rank:e.rank})),console.log(`✅ [updateUserStats] Processed ${w.length} selections successfully`)}catch(e){throw console.error("❌ [updateUserStats] Error processing selections:",e),e}let v=0;try{v=(0,s.computeNormalModeOptimalPicks)(i,f).optimalCount}catch{v=0}let k={user_id:S,game_mode:f,score:a,selections:w,perfect_rounds:v,is_daily:d,daily_date:_,duration_seconds:l.durationSeconds??null};console.log(`📤 [updateUserStats] Full insert payload:`,JSON.stringify(k)),console.log(`📤 [updateUserStats] Calling /api/save-game-session to insert with service role...`);let A=(await r.supabase.auth.getSession()).data.session?.access_token,C=await fetch("/api/save-game-session",{method:"POST",headers:{"Content-Type":"application/json",...A?{Authorization:`Bearer ${A}`}:{}},body:JSON.stringify(k)});try{g=await C.json()}catch(r){console.error("❌ Failed to parse API response as JSON:",r),console.error("❌ Response status:",C.status,"statusText:",C.statusText);let t=await C.text();console.error("❌ Response body:",t),e({statsSyncError:!0,lastSyncError:`API error: ${C.statusText}`});return}if(console.log(`📬 [updateUserStats] API Response:`,{status:C.status,ok:C.ok,result:g}),!C.ok){console.error("❌ API save-game-session error:",g),console.error("❌ Failed with user_id:",S,"Type:",typeof S,"Length:",S?.length),console.error("❌ Payload was:",JSON.stringify(k)),e({statsSyncError:!0,lastSyncError:g?.error||`API error: ${C.statusText}`});return}if(!d){let{data:e,error:t}=await r.supabase.from("game_sessions").select("id, score, completed_at").eq("user_id",c.user.id).eq("game_mode",f).eq("is_daily",!1).order("score",{ascending:!0}).order("completed_at",{ascending:!0});if(t)console.error("❌ Failed to fetch sessions for pruning:",t);else if(e&&e.length>2){let t=e.slice(2).map(e=>e.id);if(t.length>0){let{error:e}=await r.supabase.from("game_sessions").delete().in("id",t);e&&console.error("❌ Failed to prune extra sessions:",e)}}}console.log("⏳ Waiting for database trigger to complete...");let E=e=>new Promise(t=>setTimeout(t,e));await E(500);let D=null,x=null;for(let e=1;e<=4;e++){try{let{data:t,error:s}=await r.supabase.from("users").select("*").eq("id",c.user.id).single();if(s){console.error(`⚠️ Query error on attempt ${e}:`,s.message),x=s,e<4&&await E(300);continue}if(!t){console.warn(`⚠️ No user data returned on attempt ${e}`),e<4&&await E(300);continue}let a=c.user.stats?.[y],o=t.stats?.[y],n=void 0!==o&&(void 0===a||o<a);if(console.log(`📊 Attempt ${e}: oldBest=${a}, newBest=${o}, updated=${n}`),n||4===e){D=t,console.log(`✅ Stats verified successfully (attempt ${e})`);break}}catch(t){console.error(`❌ Exception on attempt ${e}:`,t),x=t,e<4&&await E(300);continue}e<4&&(console.log(`⏳ Stats not confirmed yet, retrying (attempt ${e}/4)...`),await E(300))}D?(e({user:{id:D.id,username:D.username,email:D.email,createdAt:D.created_at,displayName:D.display_name,avatarUrl:D.avatar_url,bio:D.bio,stats:u(D.stats)},statsSyncError:!1}),console.log(`✅ User state updated with new stats`),t().refreshBestScores().catch(()=>{})):(console.error(`❌ Failed to verify stats after 4 attempts. Last error:`,x),console.warn(`⚠️ Forcing refreshBestScores as fallback`),e({statsSyncError:!0}),t().refreshBestScores().catch(()=>{}))}catch(t){console.error("Update stats error:",t),e({statsSyncError:!0})}},getLeaderboard:async()=>{if(!(0,r.isSupabaseConfigured)())return console.log("[Auth] Cannot fetch leaderboard - Supabase not configured"),[];try{let{data:e,error:t}=await r.supabase.from("global_leaderboard").select("*").limit(100);if(t)return console.error("Leaderboard fetch error:",t),[];return e||[]}catch(e){return console.error("Leaderboard fetch error:",e),[]}},getModeLeaderboardScores:async e=>{if(!(0,r.isSupabaseConfigured)())return console.log("[Auth] Cannot fetch mode leaderboard - Supabase not configured"),[];try{let{data:t,error:s}=await r.supabase.from("leaderboard_scores").select("id, username, score, home_country, badges").eq("game_mode",e).order("score",{ascending:!0}).limit(5e3);if(s)return console.error(`${e} leaderboard scores fetch error:`,s),[];let a=(t||[]).filter(e=>(e?.score??999)>8),o=new Map;for(let e of a){let t=o.get(e.username);(!t||e.score<t.score)&&o.set(e.username,{id:e.id,username:e.username,score:e.score,home_country:e.home_country??null,badges:e.badges??[]})}return Array.from(o.values()).sort((e,t)=>e.score-t.score)}catch(t){return console.error(`${e} leaderboard scores fetch exception:`,t),[]}},getOriginalLeaderboardScores:async()=>await t().getModeLeaderboardScores("original"),getDailyLeaderboard:async()=>{try{console.log("🔍 [Daily Leaderboard] Fetching via API route...");let e=await fetch("/api/daily-leaderboard",{method:"GET",headers:{"Content-Type":"application/json"},credentials:"same-origin"});if(!e.ok)throw Error(`API returned ${e.status}: ${e.statusText}`);let t=await e.json();if(t.error)throw Error(t.error);let r=t.data||{},s=r.targetScore??null,a=Array.isArray(r.winners)?r.winners:[],o=Array.isArray(r.nearMisses)?r.nearMisses:[],n=Array.isArray(r.others)?r.others:[],i=e=>e.map(e=>{if(!e||"object"!=typeof e)return null;let t="string"==typeof e.username?e.username:null,r="number"==typeof e.score?e.score:Number(e.score??NaN);if(!t||!Number.isFinite(r))return null;let s="number"==typeof e.rank?e.rank:Number(e.rank??NaN),a=Number.isFinite(s)&&s>0?Math.trunc(s):0,o="string"==typeof e.completed_at?e.completed_at:null===e.completed_at?null:void 0,n="number"==typeof e.duration_seconds?e.duration_seconds:null,i="number"==typeof e.difference?e.difference:Number.isFinite(Number(e.difference))?Number(e.difference):void 0;return{username:t,score:r,rank:a,completed_at:o??void 0,duration_seconds:n,difference:Number.isFinite(i??NaN)?i:void 0,home_country:"string"==typeof e.home_country?e.home_country:null,badges:Array.isArray(e.badges)?e.badges:[]}}).filter(e=>null!==e),l=i(a),u=i(o),c=i(n);return console.log("✅ [Daily Leaderboard] API Success:",{winners:l.length,nearMisses:u.length,others:c.length,targetScore:s}),{targetScore:s,winners:l,nearMisses:u,others:c}}catch(e){return console.error("❌ [Daily Leaderboard] Failed to fetch:",e),{targetScore:null,winners:[],nearMisses:[],others:[]}}},hasAttemptedDailyToday:async()=>{if(!(0,r.isSupabaseConfigured)())return console.log("[Auth] Cannot check daily attempt - Supabase not configured"),!1;let e=t();if(!e.user)return!1;try{let t=(0,n.getEasternDateString)(),{data:s,error:a}=await r.supabase.from("game_sessions").select("id").eq("user_id",e.user.id).eq("is_daily",!0).eq("daily_date",t).not("completed_at","is",null).limit(1);if(a)return console.error("Daily attempt check error:",a),!1;return(s?.length||0)>0}catch(e){return console.error("Daily attempt check error:",e),!1}},refreshBestScores:async()=>{if(!(0,r.isSupabaseConfigured)())return void console.log("[Auth] Cannot refresh scores - Supabase not configured");let s=t();if(s.user)try{let{data:t,error:a}=await r.supabase.from("users").select("stats").eq("id",s.user.id).single();if(a){console.error("Best scores fetch error:",a),e({statsSyncError:!0});return}let o=u(t?.stats);console.log(`📊 [refreshBestScores] Fetched stats from user profile:`,o);let{data:n,error:i}=await r.supabase.from("user_mode_best_scores").select("game_mode, best_score").eq("user_id",s.user.id);i&&(console.error("Best score view fetch error:",i),e({statsSyncError:!0}));let c=new Map;if(n)for(let e of n)"number"==typeof e.best_score&&(c.set(e.game_mode,e.best_score),console.log(`📊 [refreshBestScores] View has ${e.game_mode}: ${e.best_score}`));let d=e=>{let t="original"===e?o.bestOriginal:"world"===e?o.bestWorld:"daily"===e?o.bestDaily:"special"===e?o.bestSpecial:"voyage"===e?o.bestVoyage:"atlas"===e?o.bestAtlas:"usa"===e?o.bestUSA:"sports"===e?o.bestSports:"canada"===e?o.bestCanada??999:"europe"===e?o.bestEurope??999:"empires"===e?o.bestEmpires??999:"world-cup"===e?o.bestWorldCup??999:"footy-clubs"===e?o.bestFootyClubs??999:o.bestWeeklyPro,r=[];if(t<999)r.push(t);else{let t=c.get(e);"number"==typeof t&&r.push(t)}if("special"===e||"voyage"===e||"atlas"===e){let t=l.CookieStorage.getHighScore(e);t<999&&!r.includes(t)&&r.push(t)}let s=r.length?Math.min(...r):999;return console.log(`📊 [refreshBestScores] ${e}: stat=${t}, best=${s}`),s},g=d("original"),p=d("world"),f=d("daily"),m=d("special"),y=d("voyage"),h=d("atlas"),b=d("usa"),_=d("sports"),S=d("canada"),w=d("europe"),v=d("empires"),k=d("world-cup"),A=d("footy-clubs"),C=d("weekly-pro"),E=Math.min(g,p,m,y,h),D={...o,bestOriginal:g,bestWorld:p,bestDaily:f,bestSpecial:m,bestVoyage:y,bestAtlas:h,bestUSA:b,bestSports:_,bestCanada:S,bestEurope:w,bestEmpires:v,bestWorldCup:k,bestFootyClubs:A,bestWeeklyPro:C};console.log(`✅ [refreshBestScores] Final scores - original:${g}, world:${p}, special:${m}, voyage:${y}, atlas:${h}, usa:${b}, sports:${_}, canada:${S}, europe:${w}, empires:${v}, worldCup:${k}, footyClubs:${A}, weeklyPro:${C}, daily:${f}`),e({user:{...s.user,stats:D},bestScores:{original:g,world:p,daily:f,special:m,voyage:y,atlas:h,usa:b,sports:_,canada:S,europe:w,empires:v,worldCup:k,footyClubs:A,weeklyPro:C,overall:E},statsSyncError:!1})}catch(t){console.error("refreshBestScores error:",t),e({statsSyncError:!0})}},syncLocalScoresToSupabase:async()=>{if(!(0,r.isSupabaseConfigured)())return void console.log("[Auth] Cannot sync scores - Supabase not configured");let e=t();if(e.user)try{console.log("🔄 [syncLocalScoresToSupabase] Checking for local scores to sync...");let r=l.CookieStorage.getHighScore("special"),s=l.CookieStorage.getHighScore("voyage"),a=e.user.stats?.bestSpecial,o=e.user.stats?.bestVoyage,n=[];if(r<999&&(!a||a>=999||r<a)&&(console.log(`📊 [syncLocalScoresToSupabase] Found better local Special score: ${r} vs ${a??999}`),n.push({gameMode:"special",score:r})),s<999&&(!o||o>=999||s<o)&&(console.log(`📊 [syncLocalScoresToSupabase] Found better local Voyage score: ${s} vs ${o??999}`),n.push({gameMode:"voyage",score:s})),n.length>0){for(let{gameMode:e,score:r}of(console.log(`✅ [syncLocalScoresToSupabase] Syncing ${n.length} local score(s) to Supabase...`),n))await t().updateUserStats(r,e,[],{isDaily:!1});console.log(`✅ [syncLocalScoresToSupabase] Local scores synced successfully`)}else console.log(`ℹ️ [syncLocalScoresToSupabase] No local scores better than Supabase scores`)}catch(e){console.error("❌ [syncLocalScoresToSupabase] Error syncing local scores:",e)}},getTodaysDailyScore:async()=>{if(!(0,r.isSupabaseConfigured)())return console.log("[Auth] Cannot get daily score - Supabase not configured"),null;let e=t();if(!e.user)return null;try{let t=(0,n.getEasternDateString)(),{data:s,error:a}=await r.supabase.from("game_sessions").select("score").eq("user_id",e.user.id).eq("is_daily",!0).eq("daily_date",t).limit(1).maybeSingle();if(a)return"PGRST116"!==a.code&&console.error("Todays daily score fetch error:",a),null;return s?s.score:null}catch(e){return console.error("getTodaysDailyScore error:",e),null}},submitLeaderboardScore:async(e,s)=>{if(("world-cup"===s||"world-cup-ko"===s)&&!t().hasProAccess())return void console.log("[Auth] Skipping Nations Cup leaderboard submission (Pro required)");if(!(0,r.isSupabaseConfigured)())return void console.log("[Auth] Cannot submit leaderboard score - Supabase not configured");let a=t();if(a.user)try{var o;let t,n="daily"===s?1e3:200;if(e>=n)return void console.log(`⏭️ Score ${e} doesn't qualify for leaderboard_scores (threshold: <${n}). Skipping.`);let i=Math.max(0,Math.floor(e)||0);console.log(`✅ Score ${i} qualifies for leaderboard_scores. Saving.`);let{error:l}=await r.supabase.from("leaderboard_scores").insert({user_id:a.user.id,username:a.user.username,score:i,game_mode:s,home_country:a.user.homeCountry??null,badges:(o=a.user,t=[],o.isPro&&(!o.proExpiresAt||new Date(o.proExpiresAt)>new Date)&&t.push("pro"),o.ownedProducts?.includes("usa_states")&&t.push("liberty"),t),picked_nation:"world-cup"===s||"world-cup-ko"===s?a.user.nationsCupPick??null:null});if(l)return void console.error("Insert leaderboard score error:",l)}catch(e){console.error("submitLeaderboardScore exception:",e)}},getBestDailyRankingBadge:async()=>{if(!(0,r.isSupabaseConfigured)())return console.log("[Auth] Cannot get badge - Supabase not configured"),null;let s=t();if(!s.isAuthenticated||!s.user)return null;try{let{data:t,error:a}=await r.supabase.from("users").select("best_daily_rank, best_daily_rank_date, best_daily_rank_score").eq("id",s.user.id).single();if(a)return console.error("Error fetching best daily ranking badge:",a),null;if(!t.best_daily_rank)return null;let o={rank:t.best_daily_rank,date:t.best_daily_rank_date,score:t.best_daily_rank_score};return e({bestDailyRankingBadge:o}),o}catch(e){return console.error("getBestDailyRankingBadge exception:",e),null}},checkAndUpdateBestDailyRanking:async(r,s)=>{let a=t();if(a.isAuthenticated&&a.user)try{let o=await t().getDailyLeaderboard(),n=[...o.winners??[],...o.nearMisses??[],...o.others??[]].find(e=>e.username===a.user?.username);if(n&&n.rank<=100){await i.markPotentialBadge(a.user.id,a.user.username,r,n.rank),console.log(`🏆 Potential badge marked: Rank #${n.rank} for ${s}`);let t=a.bestDailyRankingBadge;if(!t||n.rank<t.rank){let t={rank:n.rank,date:s,score:r};e({bestDailyRankingBadge:t})}}}catch(e){console.error("checkAndUpdateBestDailyRanking exception:",e)}},sendPasswordReset:async e=>{if(!(0,r.isSupabaseConfigured)())return{success:!1,error:"Authentication not configured"};try{if(!e)return{success:!1,error:"Email required"};let t="localhost"===window.location.hostname,{error:s}=await r.supabase.auth.resetPasswordForEmail(e,{redirectTo:t?"http://localhost:3000/reset-password":"https://www.geohuntergame.com/reset-password"});if(s)return console.error("Password reset email error:",s),{success:!1,error:s.message};return{success:!0}}catch(t){let e=t instanceof Error?t.message:"Unexpected error";return console.error("sendPasswordReset exception:",t),{success:!1,error:e}}},updatePassword:async e=>{if(!(0,r.isSupabaseConfigured)())return{success:!1,error:"Authentication not configured"};try{if(!e||e.length<6)return{success:!1,error:"Password must be at least 6 characters"};let{error:t}=await r.supabase.auth.updateUser({password:e});if(t)return console.error("Password update error:",t),{success:!1,error:t.message};return{success:!0}}catch(t){let e=t instanceof Error?t.message:"Unexpected error";return console.error("updatePassword exception:",t),{success:!1,error:e}}},adjustBestScore:async(s,a)=>{if(!(0,r.isSupabaseConfigured)())return{success:!1,error:"Authentication not configured"};let o=t();if(!o.user)return{success:!1,error:"Not authenticated"};try{let t=`best${s.charAt(0).toUpperCase()+s.slice(1)}`,n=o.user.stats?.[t];if(!Number.isInteger(a)||a<8||a>999)return{success:!1,error:"Score must be a whole number between 8 and 999"};if(void 0!==n&&n<999&&a<n)return{success:!1,error:`New score (${a}) cannot be better than current best (${n})`};if(n===a)return{success:!1,error:"New score is the same as current best"};console.log(`🔧 [adjustBestScore] Adjusting ${s} score from ${n??"none"} to ${a}`);let{error:i}=await r.supabase.from("users").update({stats:{...o.user.stats,[t]:a}}).eq("id",o.user.id);if(i)return console.error("Score adjustment error:",i),{success:!1,error:i.message};console.log(`✅ Stats updated in database`);let{data:l,error:u}=await r.supabase.from("users").select("stats").eq("id",o.user.id).single();if(u||!l)return console.error("Failed to verify stats update:",u),{success:!1,error:"Failed to verify stats update"};let c=l.stats,d=c?.[t];if(d!==a)return console.error(`Verification failed: expected ${a}, got ${d}`),{success:!1,error:"Score update verification failed"};console.log(`✅ Score verified in database: ${a}`),console.log(`🗑️ [adjustBestScore] Attempting to delete all ${s} game sessions for user ${o.user.id}`);let{error:g}=await r.supabase.from("game_sessions").delete().eq("user_id",o.user.id).eq("game_mode",s);g?console.error(`❌ Failed to delete game sessions: ${g.message}`):console.log(`✅ Successfully deleted all ${s} game sessions`);let{error:p}=await r.supabase.from("leaderboard_scores").delete().eq("user_id",o.user.id).eq("game_mode",s);if(p?console.warn("Could not remove from leaderboard:",p):console.log(`✅ Removed ${s} leaderboard entry`),a<200){let{error:e}=await r.supabase.from("leaderboard_scores").insert({user_id:o.user.id,username:o.user.username,score:a,game_mode:s});e?console.warn("Could not resubmit to leaderboard:",e):console.log(`✅ Resubmitted ${s} score (${a}) to leaderboard`)}return e({user:{...o.user,stats:{...o.user.stats,[t]:a}}}),console.log(`✅ [adjustBestScore] Score adjusted successfully`),{success:!0}}catch(t){let e=t instanceof Error?t.message:"Unexpected error";return console.error("adjustBestScore exception:",t),{success:!1,error:e}}},updateProfile:async s=>{if(!(0,r.isSupabaseConfigured)())return{success:!1,error:"Authentication not configured"};let a=t();if(!a.user)return{success:!1,error:"Not authenticated"};try{if(void 0!==s.username){if(s.username.length<3||s.username.length>20)return{success:!1,error:"Username must be 3-20 characters"};if(!/^[a-zA-Z0-9_-]+$/.test(s.username))return{success:!1,error:"Username can only contain letters, numbers, hyphens, and underscores"}}if(void 0!==s.displayName){let e=s.displayName.trim();if(e.length>50)return{success:!1,error:"Display name must be 50 characters or less"};if(e&&!/^[a-zA-Z0-9\s._-]+$/.test(e))return{success:!1,error:"Display name contains invalid characters"};s.displayName=e}if(void 0!==s.homeCountry&&null!==s.homeCountry&&!/^[A-Z]{2}$/.test(s.homeCountry))return{success:!1,error:"Invalid country code"};let t={};void 0!==s.username&&(t.username=s.username),void 0!==s.displayName&&(t.display_name=s.displayName),void 0!==s.homeCountry&&(t.home_country=s.homeCountry);let{error:o}=await r.supabase.from("users").update(t).eq("id",a.user.id);if(o){if(console.error("Profile update error:",o),o.message.includes("unique")||o.message.includes("duplicate"))return{success:!1,error:"Username already taken"};return{success:!1,error:o.message}}return e({user:{...a.user,username:s.username??a.user.username,homeCountry:void 0!==s.homeCountry?s.homeCountry:a.user.homeCountry}}),{success:!0}}catch(t){let e=t instanceof Error?t.message:"Unexpected error";return console.error("updateProfile exception:",t),{success:!1,error:e}}},setNationsCupPick:async s=>{if(!(0,r.isSupabaseConfigured)())return{success:!1,error:"Supabase not configured"};let a=t();if(!a.user)return{success:!1,error:"Not authenticated"};try{let{error:t}=await r.supabase.rpc("set_nations_cup_pick",{p_user_id:a.user.id,p_country:s.toLowerCase()});if(t)return{success:!1,error:t.message};return e({user:{...a.user,nationsCupPick:s.toLowerCase()}}),{success:!0}}catch(t){let e=t instanceof Error?t.message:"Unexpected error";return console.error("setNationsCupPick exception:",t),{success:!1,error:e}}},isNationsCupLocked:async()=>{let e=t();if(!e.user?.id||!(0,r.isSupabaseConfigured)())return!1;try{let{data:t,error:s}=await r.supabase.rpc("nations_cup_pick_locked",{p_user_id:e.user.id});if(s)return!1;return!!t}catch(e){return console.warn("[Auth] isNationsCupLocked exception — assuming unlocked:",e),!1}},hasUSAAccess:()=>{let e=t();if(!e.user)return console.log("🔍 [hasUSAAccess] No user found"),!1;let r=e.user.ownedProducts?.includes("usa_states")??!1,s=t().hasProAccess();return console.log("🔍 [hasUSAAccess] Check:",{ownsUSA:r,hasPro:s,ownedProducts:e.user.ownedProducts,userId:e.user.id,userEmail:e.user.email}),r||s},hasCanadaAccess:()=>{let e=t();return!!e.user&&((e.user.ownedProducts?.includes("canada_mode")??!1)||t().hasProAccess())},hasEuropeAccess:()=>{let e=t();return!!e.user&&((e.user.ownedProducts?.includes("europe_mode")??!1)||t().hasProAccess())},hasSportsAccess:()=>{let e=t();return!!e.user&&((e.user.ownedProducts?.includes("sports_mode")??!1)||t().hasProAccess())},hasEmpiresAccess:()=>t().hasProAccess(),hasWorldCupAccess:()=>!0,hasProAccess:()=>{let e=t();return!!e.user&&!!e.user.isPro&&(!e.user.proExpiresAt||new Date(e.user.proExpiresAt)>new Date)},hasExplorerAccess:()=>{let e=t();return!!e.user&&!!e.user.isExplorer&&(!e.user.explorerExpiresAt||new Date(e.user.explorerExpiresAt)>new Date)},markFootyTrialUsed:async()=>{localStorage.setItem("geohunter:footy_clubs_trial_used","true");let s=t();s.user&&e({user:{...s.user,footyTrialUsed:!0}});try{r.supabase&&s.user&&await r.supabase.rpc("mark_footy_trial_used")}catch(e){console.warn("[Auth Store] markFootyTrialUsed failed:",e)}},refreshPremiumStatus:async()=>{if(console.log("[Auth Store] refreshPremiumStatus called"),!(0,r.isSupabaseConfigured)())return void console.log("[Auth Store] Supabase not configured, skipping refresh");let s=t();if(!s.user)return void console.log("[Auth Store] No user found, skipping refresh");console.log("[Auth Store] Refreshing premium status for user:",s.user.id);try{let{data:t,error:a}=await r.supabase.from("users").select("owned_products, is_pro, pro_expires_at, is_explorer, explorer_expires_at").eq("id",s.user.id).single();if(a)return void console.error("[Auth Store] Error refreshing premium status:",a);if(t){console.log("[Auth Store] ✅ Premium status refreshed:",{ownedProducts:t.owned_products,isPro:t.is_pro});let a=null;try{let{data:e}=await r.supabase.from("premium_purchases").select("platform, product_id").eq("user_id",s.user.id).eq("status","active").in("product_id",["pro_monthly","pro_yearly","explorer_monthly","explorer_yearly","geohunter_pro_monthly","geohunter_pro_yearly","geohunter_explorer_monthly","geohunter_pro_monthly:geohunter-pro-monthly","geohunter_explorer_monthly:geohunter-explorer-monthly"]).order("created_at",{ascending:!1}).limit(1).maybeSingle();e?.platform&&(a=e.platform)}catch(e){console.warn("[Auth Store] Could not determine subscription platform:",e)}e(e=>({user:e.user?{...e.user,ownedProducts:t.owned_products||[],isPro:t.is_pro||!1,proExpiresAt:t.pro_expires_at,isExplorer:t.is_explorer||!1,explorerExpiresAt:t.explorer_expires_at,subscriptionPlatform:a}:null}))}}catch(e){console.error("[Auth Store] refreshPremiumStatus exception:",e)}}}));e.s(["computeEarnedBadges",()=>c,"useSupabaseAuthStore",0,g],8519)}]);