6 lines
85 KiB
JavaScript
6 lines
85 KiB
JavaScript
import{e as Ut,r as M,m as Bt,t as Vt,c as te,i as ge,a as ot,b as us,d as fs,h as hs,f as ms,g as Gt,o as Wt,w as Ce,n as Se,j as vs,k as he,l as c,p as i,q as ae,s as e,u as R,v as g,x as E,F as U,y as K,z as q,A as et,B as gs,C as ce,D as Ht,E as fe,G as ze,H as ps,I as we,J as ut,K as Jt,L as bs,M as $e,N as ys,O as _s}from"./style-C433w8gz.js";import{_ as ft}from"./RankBadge.vue_vue_type_script_setup_true_lang-IllWPCyW.js";/*!
|
|
* pinia v3.0.3
|
|
* (c) 2025 Eduardo San Martin Morote
|
|
* @license MIT
|
|
*/let Kt;const Pe=n=>Kt=n,Yt=Symbol();function tt(n){return n&&typeof n=="object"&&Object.prototype.toString.call(n)==="[object Object]"&&typeof n.toJSON!="function"}var xe;(function(n){n.direct="direct",n.patchObject="patch object",n.patchFunction="patch function"})(xe||(xe={}));function xs(){const n=Ut(!0),r=n.run(()=>M({}));let s=[],t=[];const a=Bt({install(l){Pe(a),a._a=l,l.provide(Yt,a),l.config.globalProperties.$pinia=a,t.forEach(d=>s.push(d)),t=[]},use(l){return this._a?s.push(l):t.push(l),this},_p:s,_a:null,_e:n,_s:new Map,state:r});return a}const Zt=()=>{};function ht(n,r,s,t=Zt){n.push(r);const a=()=>{const l=n.indexOf(r);l>-1&&(n.splice(l,1),t())};return!s&&Gt()&&Wt(a),a}function ve(n,...r){n.slice().forEach(s=>{s(...r)})}const ws=n=>n(),mt=Symbol(),Ee=Symbol();function st(n,r){n instanceof Map&&r instanceof Map?r.forEach((s,t)=>n.set(t,s)):n instanceof Set&&r instanceof Set&&r.forEach(n.add,n);for(const s in r){if(!r.hasOwnProperty(s))continue;const t=r[s],a=n[s];tt(a)&&tt(t)&&n.hasOwnProperty(s)&&!ge(t)&&!ot(t)?n[s]=st(a,t):n[s]=t}return n}const ks=Symbol();function zs(n){return!tt(n)||!Object.prototype.hasOwnProperty.call(n,ks)}const{assign:ue}=Object;function $s(n){return!!(ge(n)&&n.effect)}function Ss(n,r,s,t){const{state:a,actions:l,getters:d}=r,h=s.state.value[n];let p;function w(){h||(s.state.value[n]=a?a():{});const k=vs(s.state.value[n]);return ue(k,l,Object.keys(d||{}).reduce((S,v)=>(S[v]=Bt(te(()=>{Pe(s);const o=s._s.get(n);return d[v].call(o,o)})),S),{}))}return p=Qt(n,w,r,s,t,!0),p}function Qt(n,r,s={},t,a,l){let d;const h=ue({actions:{}},s),p={deep:!0};let w,k,S=[],v=[],o;const m=t.state.value[n];!l&&!m&&(t.state.value[n]={}),M({});let y;function x(L){let I;w=k=!1,typeof L=="function"?(L(t.state.value[n]),I={type:xe.patchFunction,storeId:n,events:o}):(st(t.state.value[n],L),I={type:xe.patchObject,payload:L,storeId:n,events:o});const B=y=Symbol();Se().then(()=>{y===B&&(w=!0)}),k=!0,ve(S,I,t.state.value[n])}const u=l?function(){const{state:I}=s,B=I?I():{};this.$patch(Y=>{ue(Y,B)})}:Zt;function f(){d.stop(),S=[],v=[],t._s.delete(n)}const b=(L,I="")=>{if(mt in L)return L[Ee]=I,L;const B=function(){Pe(t);const Y=Array.from(arguments),re=[],de=[];function pe(V){re.push(V)}function se(V){de.push(V)}ve(v,{args:Y,name:B[Ee],store:D,after:pe,onError:se});let oe;try{oe=L.apply(this&&this.$id===n?this:D,Y)}catch(V){throw ve(de,V),V}return oe instanceof Promise?oe.then(V=>(ve(re,V),V)).catch(V=>(ve(de,V),Promise.reject(V))):(ve(re,oe),oe)};return B[mt]=!0,B[Ee]=I,B},O={_p:t,$id:n,$onAction:ht.bind(null,v),$patch:x,$reset:u,$subscribe(L,I={}){const B=ht(S,L,I.detached,()=>Y()),Y=d.run(()=>Ce(()=>t.state.value[n],re=>{(I.flush==="sync"?k:w)&&L({storeId:n,type:xe.direct,events:o},re)},ue({},p,I)));return B},$dispose:f},D=ms(O);t._s.set(n,D);const C=(t._a&&t._a.runWithContext||ws)(()=>t._e.run(()=>(d=Ut()).run(()=>r({action:b}))));for(const L in C){const I=C[L];if(ge(I)&&!$s(I)||ot(I))l||(m&&zs(I)&&(ge(I)?I.value=m[L]:st(I,m[L])),t.state.value[n][L]=I);else if(typeof I=="function"){const B=b(I,L);C[L]=B,h.actions[L]=I}}return ue(D,C),ue(Vt(D),C),Object.defineProperty(D,"$state",{get:()=>t.state.value[n],set:L=>{x(I=>{ue(I,L)})}}),t._p.forEach(L=>{ue(D,d.run(()=>L({store:D,app:t._a,pinia:t,options:h})))}),m&&l&&s.hydrate&&s.hydrate(D.$state,m),w=!0,k=!0,D}/*! #__NO_SIDE_EFFECTS__ */function at(n,r,s){let t;const a=typeof r=="function";t=a?s:r;function l(d,h){const p=hs();return d=d||(p?fs(Yt,null):null),d&&Pe(d),d=Kt,d._s.has(n)||(a?Qt(n,r,t,d):Ss(n,t,d)),d._s.get(n)}return l.$id=n,l}function rt(n){const r=Vt(n),s={};for(const t in r){const a=r[t];a.effect?s[t]=te({get:()=>n[t],set(l){n[t]=l}}):(ge(a)||ot(a))&&(s[t]=us(n,t))}return s}const vt="/api";class Cs{async request(r,s={}){try{const t=await fetch(`${vt}${r}`,{headers:{"Content-Type":"application/json",...s.headers},...s}),a=await t.json();return t.ok?{data:a,status:t.status}:{error:a.detail||`HTTP ${t.status}`,status:t.status}}catch(t){return{error:t instanceof Error?t.message:"Network error",status:0}}}async uploadRequest(r,s){try{const t=await fetch(`${vt}${r}`,{method:"POST",body:s}),a=await t.json();return t.ok?{data:a,status:t.status}:{error:a.detail||`HTTP ${t.status}`,status:t.status}}catch(t){return{error:t instanceof Error?t.message:"Network error",status:0}}}async getPuzzles(){return this.request("/submissions/puzzles")}async getCollection(){return this.request("/submissions/collection")}async getWinners(){return this.request("/results/winners")}async getTopSubmissions(r=5){return this.request(`/results/top-submissions?limit=${r}`)}async getPuzzleResults(r=5){return this.request(`/results/puzzle-results?limit=${r}`)}async getSubmissions(r=20,s=0){return this.request(`/submissions/submissions?limit=${r}&offset=${s}`)}async getSubmission(r){return this.request(`/submissions/submissions/${r}`)}async createSubmission(r,s){const t=new FormData;return t.append("data",JSON.stringify(r)),s.forEach(a=>{t.append("files",a)}),this.uploadRequest("/submissions/submissions",t)}async validateResponse(r,s){return this.request(`/submissions/responses/${r}/validate`,{method:"PUT",body:JSON.stringify(s)})}async autoValidateResponses(r){return this.request(`/submissions/responses/${r}/validate/auto`,{method:"PUT"})}async getResponsesNeedingValidation(){return this.request("/submissions/responses/needs-validation")}async validateSubmission(r){return this.request(`/submissions/submissions/${r}/validate`,{method:"POST"})}async deleteSubmission(r){return this.request(`/submissions/submissions/${r}`,{method:"DELETE"})}async getStats(){return this.request("/submissions/stats")}async healthCheck(){return this.request("/health")}async getUserInfo(){return this.request("/user")}}const ne=new Cs,Ps={async loadPuzzles(){const n=await ne.getPuzzles();return n.error?(console.error("Failed to load puzzles:",n.error),[]):n.data||[]},findPuzzleByName(n,r){if(!r)return null;let s=n.find(t=>t.title.toLowerCase()===r.toLowerCase());return s||(s=n.find(t=>t.title.toLowerCase().includes(r.toLowerCase())||r.toLowerCase().includes(t.title.toLowerCase()))),s||null}},gt={async createFromFiles(n,r,s,t){const a=n.map(d=>{const h=Ps.findPuzzleByName(r,d.ocrData?.puzzle||"");if(h)return{puzzle_id:h.id,puzzle_name:d.ocrData?.puzzle||"",cost:d.ocrData?.cost,cycles:d.ocrData?.cycles,area:d.ocrData?.area,needs_manual_validation:(d.ocrData?.confidence.overall??0)<=.8,ocr_confidence_cost:d.ocrData?.confidence?.cost||0,ocr_confidence_cycles:d.ocrData?.confidence?.cycles||0,ocr_confidence_area:d.ocrData?.confidence?.area||0}}).filter(d=>d!==void 0),l=n.map(d=>d.file);return ne.createSubmission({notes:s,manual_validation_requested:t,responses:a},l)},async loadSubmissions(n=20,r=0){const s=await ne.getSubmissions(n,r);return s.error?(console.error("Failed to load submissions:",s.error),[]):s.data?.items||[]}},Xt={getErrorMessage(n){return typeof n=="string"?n:n instanceof Error?n.message:typeof n=="object"&&n!==null&&"detail"in n?String(n.detail):"An unknown error occurred"},isNetworkError(n){return typeof n=="string"&&n.includes("Network")},isValidationError(n){return n===400},isAuthError(n){return n===401||n===403}},Le=at("puzzles",()=>{const n=M([]),r=M(!1),s=M(""),t=te(()=>n.value.map(h=>h.title)),a=te(()=>h=>{if(!h)return null;const p=n.value.find(k=>k.title.toLowerCase()===h.toLowerCase());return p||n.value.find(k=>k.title.toLowerCase().includes(h.toLowerCase())||h.toLowerCase().includes(k.title.toLowerCase()))||null}),l=async()=>{if(!(n.value.length>0))try{r.value=!0,s.value="";const h=await ne.getPuzzles();if(h.error){s.value=h.error,console.error("Failed to load puzzles:",h.error);return}h.data&&(n.value=h.data)}catch(h){s.value="Failed to load puzzles",console.error("Error loading puzzles:",h)}finally{r.value=!1}};return{puzzles:n,isLoading:r,error:s,puzzleNames:t,findPuzzleByName:a,loadPuzzles:l,refreshPuzzles:async()=>{n.value=[],await l()}}}),lt=at("submissions",()=>{const n=M([]),r=M(!1),s=M(""),t=M(!1),a=Le(),{puzzles:l}=rt(a),d=async(v=20,o=0)=>{try{r.value=!0,s.value="";const m=await gt.loadSubmissions(v,o);o===0?n.value=m:n.value.push(...m)}catch(m){s.value="Failed to load submissions",console.error("Error loading submissions:",m)}finally{r.value=!1}},h=async(v,o,m)=>{try{r.value=!0,s.value="";const y=await gt.createFromFiles(v,l.value,o,m);if(y.error)throw s.value=y.error,new Error(y.error);return y.data?(n.value.unshift(y.data),y.data):void 0}catch(y){throw s.value=y instanceof Error?y.message:"Failed to create submission",y}finally{r.value=!1}},p=()=>{t.value=!0},w=()=>{t.value=!1};return{submissions:n,isLoading:r,error:s,isSubmissionModalOpen:t,loadSubmissions:d,createSubmission:h,openSubmissionModal:p,closeSubmissionModal:w,refreshSubmissions:async()=>{n.value=[],await d()},handleSubmission:async v=>{try{r.value=!0,s.value="";const o=await h(v.files,v.notes,v.manualValidationRequested);if(o){const m=o.responses.map(y=>y.puzzle_name).join(", ");alert(`Solutions submitted successfully for puzzles: ${m}`)}else alert("Submission created successfully!");w()}catch(o){const m=Xt.getErrorMessage(o);s.value=m,alert(`Submission failed: ${m}`),console.error("Submission error:",o)}finally{r.value=!1}}}}),Ls={class:"card-body"},Rs={class:"flex items-start justify-between"},Es={class:"flex-1"},Os={class:"text-sm text-base-content/70 mb-2"},Ms={class:"flex items-center gap-2 mb-3"},Ns={class:"badge badge-primary badge-sm"},As={class:"badge badge-ghost badge-sm"},Ds={key:0,class:"text-sm text-base-content/80 mb-4"},Is={key:1,class:"bg-base-200 p-3 rounded-lg mb-4"},js={class:"grid grid-cols-3 gap-2"},Ts={class:"text-center"},qs={class:"font-bold text-primary"},Fs={class:"text-center"},Us={class:"font-bold text-primary"},Bs={class:"text-center"},Vs={class:"font-bold text-primary"},Gs={key:2,class:"flex flex-wrap gap-1 mb-4"},Ws={key:0,class:"badge badge-outline badge-xs"},Hs={class:"flex flex-col items-end gap-2"},Js={class:"tooltip","data-tip":"View on Steam Workshop"},Ks=["href"],Ys={key:0,class:"mt-1"},Zs={class:"divider"},Qs={class:"text-sm font-medium"},Xs={class:"table table-xs"},en={key:0,class:"badge badge-success badge-xs"},tn={key:1,class:"text-base-content/50"},sn={key:0,class:"badge badge-info badge-xs"},nn={key:1,class:"text-base-content/50"},on={key:0,class:"badge badge-warning badge-xs"},an={key:1,class:"text-base-content/50"},rn={class:"flex items-center gap-1"},ln={class:"badge badge-ghost badge-xs"},cn=["data-tip"],dn={key:1,class:"tooltip","data-tip":"Needs manual validation"},un=he({__name:"PuzzleCard",props:{puzzle:{},responses:{}},setup(n){const{openSubmissionModal:r}=lt();return(s,t)=>(i(),c("div",{class:ae(["card bg-base-100 shadow-lg hover:shadow-2xl transition-shadow duration-300",n.responses?.length==0?"shadow-red-900":"shadow-primary-300"])},[e("div",Ls,[e("div",Rs,[e("div",Es,[e("h3",{class:ae(["card-title text-lg font-bold",n.responses?.length==0?"text-error":"text-primary"])},g(n.puzzle.title),3),e("p",Os," by "+g(n.puzzle.author_name),1),e("div",Ms,[e("div",Ns,g(n.puzzle.steam_item_id),1),e("div",As,"ID: "+g(n.puzzle.id),1)]),n.puzzle.description?(i(),c("p",Ds,g(n.puzzle.description),1)):R("",!0),n.puzzle.points_factor?(i(),c("div",Is,[t[7]||(t[7]=e("p",{class:"text-xs text-base-content/70 font-semibold mb-2"},"Points Coefficients",-1)),e("div",js,[e("div",Ts,[e("span",qs,[t[1]||(t[1]=e("small",null,"x",-1)),E(g(n.puzzle.points_factor.cost),1)]),t[2]||(t[2]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",Fs,[e("span",Us,[t[3]||(t[3]=e("small",null,"x",-1)),E(g(n.puzzle.points_factor.cycles),1)]),t[4]||(t[4]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",Bs,[e("span",Vs,[t[5]||(t[5]=e("small",null,"x",-1)),E(g(n.puzzle.points_factor.area),1)]),t[6]||(t[6]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):R("",!0),n.puzzle.tags&&n.puzzle.tags.length>0?(i(),c("div",Gs,[(i(!0),c(U,null,K(n.puzzle.tags.slice(0,3),a=>(i(),c("span",{key:a,class:"badge badge-outline badge-xs"},g(a),1))),128)),n.puzzle.tags.length>3?(i(),c("span",Ws," +"+g(n.puzzle.tags.length-3)+" more ",1)):R("",!0)])):R("",!0)]),e("div",Hs,[e("div",Js,[e("a",{href:`https://steamcommunity.com/workshop/filedetails/?id=${n.puzzle.steam_item_id}`,target:"_blank",class:"btn btn-ghost btn-sm btn-square"},[...t[8]||(t[8]=[e("i",{class:"mdi mdi-steam text-lg"},null,-1)])],8,Ks)])])]),n.responses&&n.responses.length>0?(i(),c("div",Ys,[e("div",Zs,[e("span",Qs,"Solutions ("+g(n.responses.length)+")",1)]),e("div",null,[e("table",Xs,[t[11]||(t[11]=e("thead",null,[e("tr",null,[e("th",null,"Cost"),e("th",null,"Cycles"),e("th",null,"Area"),e("th",null,"Files")])],-1)),e("tbody",null,[(i(!0),c(U,null,K(n.responses,a=>(i(),c("tr",{key:a.id,class:"hover"},[e("td",null,[a.final_cost||a.cost?(i(),c("span",en,g(a.final_cost||a.cost),1)):(i(),c("span",tn,"-"))]),e("td",null,[a.final_cycles||a.cycles?(i(),c("span",sn,g(a.final_cycles||a.cycles),1)):(i(),c("span",nn,"-"))]),e("td",null,[a.final_area||a.area?(i(),c("span",on,g(a.final_area||a.area),1)):(i(),c("span",an,"-"))]),e("td",null,[e("div",rn,[e("span",ln,g(a.files?.length||0),1),a.files?.length?(i(),c("div",{key:0,class:"tooltip","data-tip":a.files.map(l=>l.original_filename||l.file?.name).join(", ")},[...t[9]||(t[9]=[e("i",{class:"mdi mdi-information-outline text-xs"},null,-1)])],8,cn)):R("",!0),a.needs_manual_validation?(i(),c("div",dn,[...t[10]||(t[10]=[e("i",{class:"mdi mdi-alert-circle text-xs text-warning"},null,-1)])])):R("",!0)])])]))),128))])])])])):(i(),c("div",{key:1,class:"mt-6 text-center py-4 border-2 border-dashed border-base-300 rounded-lg hover:border-primary transition-colors duration-300 cursor-pointer",onClick:t[0]||(t[0]=(...a)=>q(r)&&q(r)(...a))},[...t[12]||(t[12]=[e("i",{class:"mdi mdi-upload text-2xl text-base-content/40"},null,-1),e("p",{class:"text-sm text-base-content/60 mt-2"},"No solutions yet",-1),e("p",{class:"text-xs text-base-content/40"}," Upload solutions using the submit button ",-1)])]))])],2))}});var Oe={exports:{}},pt;function fn(){return pt||(pt=1,(function(n){var r=(function(s){var t=Object.prototype,a=t.hasOwnProperty,l=Object.defineProperty||function(z,_,$){z[_]=$.value},d,h=typeof Symbol=="function"?Symbol:{},p=h.iterator||"@@iterator",w=h.asyncIterator||"@@asyncIterator",k=h.toStringTag||"@@toStringTag";function S(z,_,$){return Object.defineProperty(z,_,{value:$,enumerable:!0,configurable:!0,writable:!0}),z[_]}try{S({},"")}catch{S=function(_,$,N){return _[$]=N}}function v(z,_,$,N){var P=_&&_.prototype instanceof b?_:b,T=Object.create(P.prototype),J=new oe(N||[]);return l(T,"_invoke",{value:re(z,$,J)}),T}s.wrap=v;function o(z,_,$){try{return{type:"normal",arg:z.call(_,$)}}catch(N){return{type:"throw",arg:N}}}var m="suspendedStart",y="suspendedYield",x="executing",u="completed",f={};function b(){}function O(){}function D(){}var F={};S(F,p,function(){return this});var C=Object.getPrototypeOf,L=C&&C(C(V([])));L&&L!==t&&a.call(L,p)&&(F=L);var I=D.prototype=b.prototype=Object.create(F);O.prototype=D,l(I,"constructor",{value:D,configurable:!0}),l(D,"constructor",{value:O,configurable:!0}),O.displayName=S(D,k,"GeneratorFunction");function B(z){["next","throw","return"].forEach(function(_){S(z,_,function($){return this._invoke(_,$)})})}s.isGeneratorFunction=function(z){var _=typeof z=="function"&&z.constructor;return _?_===O||(_.displayName||_.name)==="GeneratorFunction":!1},s.mark=function(z){return Object.setPrototypeOf?Object.setPrototypeOf(z,D):(z.__proto__=D,S(z,k,"GeneratorFunction")),z.prototype=Object.create(I),z},s.awrap=function(z){return{__await:z}};function Y(z,_){function $(T,J,W,X){var G=o(z[T],z,J);if(G.type==="throw")X(G.arg);else{var be=G.arg,me=be.value;return me&&typeof me=="object"&&a.call(me,"__await")?_.resolve(me.__await).then(function(le){$("next",le,W,X)},function(le){$("throw",le,W,X)}):_.resolve(me).then(function(le){be.value=le,W(be)},function(le){return $("throw",le,W,X)})}}var N;function P(T,J){function W(){return new _(function(X,G){$(T,J,X,G)})}return N=N?N.then(W,W):W()}l(this,"_invoke",{value:P})}B(Y.prototype),S(Y.prototype,w,function(){return this}),s.AsyncIterator=Y,s.async=function(z,_,$,N,P){P===void 0&&(P=Promise);var T=new Y(v(z,_,$,N),P);return s.isGeneratorFunction(_)?T:T.next().then(function(J){return J.done?J.value:T.next()})};function re(z,_,$){var N=m;return function(T,J){if(N===x)throw new Error("Generator is already running");if(N===u){if(T==="throw")throw J;return Q()}for($.method=T,$.arg=J;;){var W=$.delegate;if(W){var X=de(W,$);if(X){if(X===f)continue;return X}}if($.method==="next")$.sent=$._sent=$.arg;else if($.method==="throw"){if(N===m)throw N=u,$.arg;$.dispatchException($.arg)}else $.method==="return"&&$.abrupt("return",$.arg);N=x;var G=o(z,_,$);if(G.type==="normal"){if(N=$.done?u:y,G.arg===f)continue;return{value:G.arg,done:$.done}}else G.type==="throw"&&(N=u,$.method="throw",$.arg=G.arg)}}}function de(z,_){var $=_.method,N=z.iterator[$];if(N===d)return _.delegate=null,$==="throw"&&z.iterator.return&&(_.method="return",_.arg=d,de(z,_),_.method==="throw")||$!=="return"&&(_.method="throw",_.arg=new TypeError("The iterator does not provide a '"+$+"' method")),f;var P=o(N,z.iterator,_.arg);if(P.type==="throw")return _.method="throw",_.arg=P.arg,_.delegate=null,f;var T=P.arg;if(!T)return _.method="throw",_.arg=new TypeError("iterator result is not an object"),_.delegate=null,f;if(T.done)_[z.resultName]=T.value,_.next=z.nextLoc,_.method!=="return"&&(_.method="next",_.arg=d);else return T;return _.delegate=null,f}B(I),S(I,k,"Generator"),S(I,p,function(){return this}),S(I,"toString",function(){return"[object Generator]"});function pe(z){var _={tryLoc:z[0]};1 in z&&(_.catchLoc=z[1]),2 in z&&(_.finallyLoc=z[2],_.afterLoc=z[3]),this.tryEntries.push(_)}function se(z){var _=z.completion||{};_.type="normal",delete _.arg,z.completion=_}function oe(z){this.tryEntries=[{tryLoc:"root"}],z.forEach(pe,this),this.reset(!0)}s.keys=function(z){var _=Object(z),$=[];for(var N in _)$.push(N);return $.reverse(),function P(){for(;$.length;){var T=$.pop();if(T in _)return P.value=T,P.done=!1,P}return P.done=!0,P}};function V(z){if(z){var _=z[p];if(_)return _.call(z);if(typeof z.next=="function")return z;if(!isNaN(z.length)){var $=-1,N=function P(){for(;++$<z.length;)if(a.call(z,$))return P.value=z[$],P.done=!1,P;return P.value=d,P.done=!0,P};return N.next=N}}return{next:Q}}s.values=V;function Q(){return{value:d,done:!0}}return oe.prototype={constructor:oe,reset:function(z){if(this.prev=0,this.next=0,this.sent=this._sent=d,this.done=!1,this.delegate=null,this.method="next",this.arg=d,this.tryEntries.forEach(se),!z)for(var _ in this)_.charAt(0)==="t"&&a.call(this,_)&&!isNaN(+_.slice(1))&&(this[_]=d)},stop:function(){this.done=!0;var z=this.tryEntries[0],_=z.completion;if(_.type==="throw")throw _.arg;return this.rval},dispatchException:function(z){if(this.done)throw z;var _=this;function $(X,G){return T.type="throw",T.arg=z,_.next=X,G&&(_.method="next",_.arg=d),!!G}for(var N=this.tryEntries.length-1;N>=0;--N){var P=this.tryEntries[N],T=P.completion;if(P.tryLoc==="root")return $("end");if(P.tryLoc<=this.prev){var J=a.call(P,"catchLoc"),W=a.call(P,"finallyLoc");if(J&&W){if(this.prev<P.catchLoc)return $(P.catchLoc,!0);if(this.prev<P.finallyLoc)return $(P.finallyLoc)}else if(J){if(this.prev<P.catchLoc)return $(P.catchLoc,!0)}else if(W){if(this.prev<P.finallyLoc)return $(P.finallyLoc)}else throw new Error("try statement without catch or finally")}}},abrupt:function(z,_){for(var $=this.tryEntries.length-1;$>=0;--$){var N=this.tryEntries[$];if(N.tryLoc<=this.prev&&a.call(N,"finallyLoc")&&this.prev<N.finallyLoc){var P=N;break}}P&&(z==="break"||z==="continue")&&P.tryLoc<=_&&_<=P.finallyLoc&&(P=null);var T=P?P.completion:{};return T.type=z,T.arg=_,P?(this.method="next",this.next=P.finallyLoc,f):this.complete(T)},complete:function(z,_){if(z.type==="throw")throw z.arg;return z.type==="break"||z.type==="continue"?this.next=z.arg:z.type==="return"?(this.rval=this.arg=z.arg,this.method="return",this.next="end"):z.type==="normal"&&_&&(this.next=_),f},finish:function(z){for(var _=this.tryEntries.length-1;_>=0;--_){var $=this.tryEntries[_];if($.finallyLoc===z)return this.complete($.completion,$.afterLoc),se($),f}},catch:function(z){for(var _=this.tryEntries.length-1;_>=0;--_){var $=this.tryEntries[_];if($.tryLoc===z){var N=$.completion;if(N.type==="throw"){var P=N.arg;se($)}return P}}throw new Error("illegal catch attempt")},delegateYield:function(z,_,$){return this.delegate={iterator:V(z),resultName:_,nextLoc:$},this.method==="next"&&(this.arg=d),f}},s})(n.exports);try{regeneratorRuntime=r}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}})(Oe)),Oe.exports}var Me,bt;function it(){return bt||(bt=1,Me=(n,r)=>`${n}-${r}-${Math.random().toString(16).slice(3,8)}`),Me}var Ne,yt;function es(){if(yt)return Ne;yt=1;const n=it();let r=0;return Ne=({id:s,action:t,payload:a={}})=>{let l=s;return typeof l>"u"&&(l=n("Job",r),r+=1),{id:l,action:t,payload:a}},Ne}var ye={},_t;function ct(){if(_t)return ye;_t=1;let n=!1;return ye.logging=n,ye.setLogging=r=>{n=r},ye.log=(...r)=>n?console.log.apply(this,r):null,ye}var Ae,xt;function hn(){if(xt)return Ae;xt=1;const n=es(),{log:r}=ct(),s=it();let t=0;return Ae=()=>{const a=s("Scheduler",t),l={},d={};let h=[];t+=1;const p=()=>h.length,w=()=>Object.keys(l).length,k=()=>{if(h.length!==0){const y=Object.keys(l);for(let x=0;x<y.length;x+=1)if(typeof d[y[x]]>"u"){h[0](l[y[x]]);break}}},S=(y,x)=>new Promise((u,f)=>{const b=n({action:y,payload:x});h.push(async O=>{h.shift(),d[O.id]=b;try{u(await O[y].apply(this,[...x,b.id]))}catch(D){f(D)}finally{delete d[O.id],k()}}),r(`[${a}]: Add ${b.id} to JobQueue`),r(`[${a}]: JobQueue length=${h.length}`),k()});return{addWorker:y=>(l[y.id]=y,r(`[${a}]: Add ${y.id}`),r(`[${a}]: Number of workers=${w()}`),k(),y.id),addJob:async(y,...x)=>{if(w()===0)throw Error(`[${a}]: You need to have at least one worker before adding jobs`);return S(y,x)},terminate:async()=>{Object.keys(l).forEach(async y=>{await l[y].terminate()}),h=[]},getQueueLen:p,getNumWorkers:w}},Ae}function mn(n){throw new Error('Could not dynamically require "'+n+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var De,wt;function vn(){if(wt)return De;wt=1;function n(){return!!(typeof window<"u"&&typeof window.process=="object"&&window.process.type==="renderer"||typeof process<"u"&&typeof process.versions=="object"&&process.versions.electron||typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Electron")>=0)}return De=n,De}var Ie,kt;function gn(){if(kt)return Ie;kt=1;const n=vn();return Ie=r=>{const s={};return typeof WorkerGlobalScope<"u"?s.type="webworker":n()?s.type="electron":typeof document=="object"?s.type="browser":typeof process=="object"&&typeof mn=="function"&&(s.type="node"),typeof r>"u"?s:s[r]},Ie}var je,zt;function pn(){if(zt)return je;zt=1;const r=gn()("type")==="browser"?s=>new URL(s,window.location.href).href:s=>s;return je=s=>{const t={...s};return["corePath","workerPath","langPath"].forEach(a=>{s[a]&&(t[a]=r(t[a]))}),t},je}var Te,$t;function bn(){return $t||($t=1,Te=n=>{const r=[],s=[],t=[],a=[],l=[];return n.blocks&&n.blocks.forEach(d=>{d.paragraphs.forEach(h=>{h.lines.forEach(p=>{p.words.forEach(w=>{w.symbols.forEach(k=>{l.push({...k,page:n,block:d,paragraph:h,line:p,word:w})}),a.push({...w,page:n,block:d,paragraph:h,line:p})}),t.push({...p,page:n,block:d,paragraph:h})}),s.push({...h,page:n,block:d})}),r.push({...d,page:n})}),{...n,blocks:r,paragraphs:s,lines:t,words:a,symbols:l}}),Te}var qe,St;function ts(){return St||(St=1,qe={TESSERACT_ONLY:0,LSTM_ONLY:1,TESSERACT_LSTM_COMBINED:2,DEFAULT:3}),qe}const yn="5.1.1",_n={version:yn};var Fe,Ct;function xn(){return Ct||(Ct=1,Fe={workerBlobURL:!0,logger:()=>{}}),Fe}var Ue,Pt;function wn(){if(Pt)return Ue;Pt=1;const n=_n.version;return Ue={...xn(),workerPath:`https://cdn.jsdelivr.net/npm/tesseract.js@v${n}/dist/worker.min.js`},Ue}var Be,Lt;function kn(){return Lt||(Lt=1,Be=({workerPath:n,workerBlobURL:r})=>{let s;if(Blob&&URL&&r){const t=new Blob([`importScripts("${n}");`],{type:"application/javascript"});s=new Worker(URL.createObjectURL(t))}else s=new Worker(n);return s}),Be}var Ve,Rt;function zn(){return Rt||(Rt=1,Ve=n=>{n.terminate()}),Ve}var Ge,Et;function $n(){return Et||(Et=1,Ge=(n,r)=>{n.onmessage=({data:s})=>{r(s)}}),Ge}var We,Ot;function Sn(){return Ot||(Ot=1,We=async(n,r)=>{n.postMessage(r)}),We}var He,Mt;function Cn(){if(Mt)return He;Mt=1;const n=s=>new Promise((t,a)=>{const l=new FileReader;l.onload=()=>{t(l.result)},l.onerror=({target:{error:{code:d}}})=>{a(Error(`File could not be read! Code=${d}`))},l.readAsArrayBuffer(s)}),r=async s=>{let t=s;if(typeof s>"u")return"undefined";if(typeof s=="string")/data:image\/([a-zA-Z]*);base64,([^"]*)/.test(s)?t=atob(s.split(",")[1]).split("").map(a=>a.charCodeAt(0)):t=await(await fetch(s)).arrayBuffer();else if(typeof HTMLElement<"u"&&s instanceof HTMLElement)s.tagName==="IMG"&&(t=await r(s.src)),s.tagName==="VIDEO"&&(t=await r(s.poster)),s.tagName==="CANVAS"&&await new Promise(a=>{s.toBlob(async l=>{t=await n(l),a()})});else if(typeof OffscreenCanvas<"u"&&s instanceof OffscreenCanvas){const a=await s.convertToBlob();t=await n(a)}else(s instanceof File||s instanceof Blob)&&(t=await n(s));return new Uint8Array(t)};return He=r,He}var Je,Nt;function Pn(){if(Nt)return Je;Nt=1;const n=wn(),r=kn(),s=zn(),t=$n(),a=Sn(),l=Cn();return Je={defaultOptions:n,spawnWorker:r,terminateWorker:s,onMessage:t,send:a,loadImage:l},Je}var Ke,At;function ss(){if(At)return Ke;At=1;const n=pn(),r=bn(),s=es(),{log:t}=ct(),a=it(),l=ts(),{defaultOptions:d,spawnWorker:h,terminateWorker:p,onMessage:w,loadImage:k,send:S}=Pn();let v=0;return Ke=async(o="eng",m=l.LSTM_ONLY,y={},x={})=>{const u=a("Worker",v),{logger:f,errorHandler:b,...O}=n({...d,...y}),D={},F={},C=typeof o=="string"?o.split("+"):o;let L=m,I=x;const B=[l.DEFAULT,l.LSTM_ONLY].includes(m)&&!O.legacyCore;let Y,re;const de=new Promise((A,j)=>{re=A,Y=j}),pe=A=>{Y(A.message)};let se=h(O);se.onerror=pe,v+=1;const oe=(A,j)=>{D[A]=j},V=(A,j)=>{F[A]=j},Q=({id:A,action:j,payload:H})=>new Promise((ee,Z)=>{t(`[${u}]: Start ${A}, action=${j}`);const ie=`${j}-${A}`;oe(ie,ee),V(ie,Z),S(se,{workerId:u,jobId:A,action:j,payload:H})}),z=()=>console.warn("`load` is depreciated and should be removed from code (workers now come pre-loaded)"),_=A=>Q(s({id:A,action:"load",payload:{options:{lstmOnly:B,corePath:O.corePath,logging:O.logging}}})),$=(A,j,H)=>Q(s({id:H,action:"FS",payload:{method:"writeFile",args:[A,j]}})),N=(A,j)=>Q(s({id:j,action:"FS",payload:{method:"readFile",args:[A,{encoding:"utf8"}]}})),P=(A,j)=>Q(s({id:j,action:"FS",payload:{method:"unlink",args:[A]}})),T=(A,j,H)=>Q(s({id:H,action:"FS",payload:{method:A,args:j}})),J=()=>console.warn("`loadLanguage` is depreciated and should be removed from code (workers now come with language pre-loaded)"),W=(A,j)=>Q(s({id:j,action:"loadLanguage",payload:{langs:A,options:{langPath:O.langPath,dataPath:O.dataPath,cachePath:O.cachePath,cacheMethod:O.cacheMethod,gzip:O.gzip,lstmOnly:[l.DEFAULT,l.LSTM_ONLY].includes(L)&&!O.legacyLang}}})),X=()=>console.warn("`initialize` is depreciated and should be removed from code (workers now come pre-initialized)"),G=(A,j,H,ee)=>Q(s({id:ee,action:"initialize",payload:{langs:A,oem:j,config:H}})),be=(A="eng",j,H,ee)=>{if(B&&[l.TESSERACT_ONLY,l.TESSERACT_LSTM_COMBINED].includes(j))throw Error("Legacy model requested but code missing.");const Z=j||L;L=Z;const ie=H||I;I=ie;const Re=(typeof A=="string"?A.split("+"):A).filter(ds=>!C.includes(ds));return C.push(...Re),Re.length>0?W(Re,ee).then(()=>G(A,Z,ie,ee)):G(A,Z,ie,ee)},me=(A={},j)=>Q(s({id:j,action:"setParameters",payload:{params:A}})),le=async(A,j={},H={blocks:!0,text:!0,hocr:!0,tsv:!0},ee)=>Q(s({id:ee,action:"recognize",payload:{image:await k(A),options:j,output:H}})),rs=(A="Tesseract OCR Result",j=!1,H)=>(console.log("`getPDF` function is depreciated. `recognize` option `savePDF` should be used instead."),Q(s({id:H,action:"getPDF",payload:{title:A,textonly:j}}))),ls=async(A,j)=>{if(B)throw Error("`worker.detect` requires Legacy model, which was not loaded.");return Q(s({id:j,action:"detect",payload:{image:await k(A)}}))},is=async()=>(se!==null&&(p(se),se=null),Promise.resolve());w(se,({workerId:A,jobId:j,status:H,action:ee,data:Z})=>{const ie=`${ee}-${j}`;if(H==="resolve"){t(`[${A}]: Complete ${j}`);let ke=Z;ee==="recognize"?ke=r(Z):ee==="getPDF"&&(ke=Array.from({...Z,length:Object.keys(Z).length})),D[ie]({jobId:j,data:ke})}else if(H==="reject")if(F[ie](Z),ee==="load"&&Y(Z),b)b(Z);else throw Error(Z);else H==="progress"&&f({...Z,userJobId:j})});const cs={id:u,worker:se,setResolve:oe,setReject:V,load:z,writeText:$,readText:N,removeFile:P,FS:T,loadLanguage:J,initialize:X,reinitialize:be,setParameters:me,recognize:le,getPDF:rs,detect:ls,terminate:is};return _().then(()=>W(o)).then(()=>G(o,m,x)).then(()=>re(cs)).catch(()=>{}),de},Ke}var Ye,Dt;function Ln(){if(Dt)return Ye;Dt=1;const n=ss();return Ye={recognize:async(t,a,l)=>{const d=await n(a,1,l);return d.recognize(t).finally(async()=>{await d.terminate()})},detect:async(t,a)=>{const l=await n("osd",0,a);return l.detect(t).finally(async()=>{await l.terminate()})}},Ye}var Ze,It;function Rn(){return It||(It=1,Ze={AFR:"afr",AMH:"amh",ARA:"ara",ASM:"asm",AZE:"aze",AZE_CYRL:"aze_cyrl",BEL:"bel",BEN:"ben",BOD:"bod",BOS:"bos",BUL:"bul",CAT:"cat",CEB:"ceb",CES:"ces",CHI_SIM:"chi_sim",CHI_TRA:"chi_tra",CHR:"chr",CYM:"cym",DAN:"dan",DEU:"deu",DZO:"dzo",ELL:"ell",ENG:"eng",ENM:"enm",EPO:"epo",EST:"est",EUS:"eus",FAS:"fas",FIN:"fin",FRA:"fra",FRK:"frk",FRM:"frm",GLE:"gle",GLG:"glg",GRC:"grc",GUJ:"guj",HAT:"hat",HEB:"heb",HIN:"hin",HRV:"hrv",HUN:"hun",IKU:"iku",IND:"ind",ISL:"isl",ITA:"ita",ITA_OLD:"ita_old",JAV:"jav",JPN:"jpn",KAN:"kan",KAT:"kat",KAT_OLD:"kat_old",KAZ:"kaz",KHM:"khm",KIR:"kir",KOR:"kor",KUR:"kur",LAO:"lao",LAT:"lat",LAV:"lav",LIT:"lit",MAL:"mal",MAR:"mar",MKD:"mkd",MLT:"mlt",MSA:"msa",MYA:"mya",NEP:"nep",NLD:"nld",NOR:"nor",ORI:"ori",PAN:"pan",POL:"pol",POR:"por",PUS:"pus",RON:"ron",RUS:"rus",SAN:"san",SIN:"sin",SLK:"slk",SLV:"slv",SPA:"spa",SPA_OLD:"spa_old",SQI:"sqi",SRP:"srp",SRP_LATN:"srp_latn",SWA:"swa",SWE:"swe",SYR:"syr",TAM:"tam",TEL:"tel",TGK:"tgk",TGL:"tgl",THA:"tha",TIR:"tir",TUR:"tur",UIG:"uig",UKR:"ukr",URD:"urd",UZB:"uzb",UZB_CYRL:"uzb_cyrl",VIE:"vie",YID:"yid"}),Ze}var Qe,jt;function En(){return jt||(jt=1,Qe={OSD_ONLY:"0",AUTO_OSD:"1",AUTO_ONLY:"2",AUTO:"3",SINGLE_COLUMN:"4",SINGLE_BLOCK_VERT_TEXT:"5",SINGLE_BLOCK:"6",SINGLE_LINE:"7",SINGLE_WORD:"8",CIRCLE_WORD:"9",SINGLE_CHAR:"10",SPARSE_TEXT:"11",SPARSE_TEXT_OSD:"12",RAW_LINE:"13"}),Qe}var Xe,Tt;function On(){if(Tt)return Xe;Tt=1,fn();const n=hn(),r=ss(),s=Ln(),t=Rn(),a=ts(),l=En(),{setLogging:d}=ct();return Xe={languages:t,OEM:a,PSM:l,createScheduler:n,createWorker:r,setLogging:d,...s},Xe}var Mn=On();class dt{worker=null;availablePuzzleNames=[];regions={puzzle:{x:15,y:600,width:330,height:28},cost:{x:412,y:603,width:65,height:22},cycles:{x:577,y:603,width:65,height:22},area:{x:739,y:603,width:65,height:22}};async initialize(){this.worker||(this.worker=await Mn.createWorker("eng"),await this.worker.setParameters({tessedit_ocr_engine_mode:"3",tessedit_pageseg_mode:7}))}setAvailablePuzzleNames(r){this.availablePuzzleNames=r,console.log("OCR service updated with puzzle names:",r)}async configurePuzzleOCR(){this.worker&&(await this.worker.setParameters({load_system_dawg:"0",load_freq_dawg:"0",load_punc_dawg:"0",load_number_dawg:"0",load_unambig_dawg:"0",load_bigram_dawg:"0",load_fixed_length_dawgs:"0",tessedit_char_whitelist:this.getPuzzleCharacterSet(),tessedit_pageseg_mode:8,segment_penalty_dict_nonword:"2.0",segment_penalty_dict_frequent_word:"0.001",segment_penalty_dict_case_ok:"0.001",segment_penalty_dict_case_bad:"0.1",classify_enable_learning:"0",classify_enable_adaptive_matcher:"1",preserve_interword_spaces:"1"}),console.log("OCR configured for puzzle names with character set:",this.getPuzzleCharacterSet()))}getPuzzleCharacterSet(){if(this.availablePuzzleNames.length===0)return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 -";const r=new Set;return this.availablePuzzleNames.forEach(s=>{for(const t of s)r.add(t)}),Array.from(r).join("")}async extractOpusMagnumData(r){this.worker||await this.initialize();const s=URL.createObjectURL(r),t=new Image;return new Promise((a,l)=>{t.onload=async()=>{try{const d=document.createElement("canvas"),h=d.getContext("2d");d.width=t.width,d.height=t.height,h.drawImage(t,0,0);const p={},w={};for(const[v,o]of Object.entries(this.regions)){const m=document.createElement("canvas"),y=m.getContext("2d");m.width=o.width,m.height=o.height,y.drawImage(d,o.x,o.y,o.width,o.height,0,0,o.width,o.height);const x=y.getImageData(0,0,o.width,o.height);this.preprocessImage(x),y.putImageData(x,0,0),v==="cost"?await this.worker.setParameters({tessedit_char_whitelist:"0123456789G"}):v==="cycles"||v==="area"?await this.worker.setParameters({tessedit_char_whitelist:"0123456789"}):v==="puzzle"?await this.configurePuzzleOCR():await this.worker.setParameters({tessedit_char_whitelist:""});const{data:{text:u,confidence:f}}=await this.worker.recognize(m);let b=u.trim();if(w[v]=f/100,v==="cost"){if(b.endsWith("6")&&b.length>1){const O=b.slice(0,-1);/^\d+$/.test(O)&&(b=O)}b=b.replace(/G+$/g,""),b=b.replace(/[^0-9]/g,"")}else if(v==="cycles"||v==="area")b=b.replace(/[^0-9]/g,"");else if(v==="puzzle"&&(b=this.findBestPuzzleMatch(b),this.availablePuzzleNames.length>0&&!this.availablePuzzleNames.includes(b))){const O=this.findBestPuzzleMatchForced(b);O&&(b=O,console.log(`Forced OCR match: "${u.trim()}" -> "${b}"`))}p[v]=b}URL.revokeObjectURL(s);const k=Object.values(w),S=k.length>0?k.reduce((v,o)=>v+o,0)/k.length:0;a({puzzle:p.puzzle||"",cost:parseInt(p.cost||""),cycles:parseInt(p.cycles||""),area:parseInt(p.area||""),confidence:{puzzle:w.puzzle||0,cost:w.cost||0,cycles:w.cycles||0,area:w.area||0,overall:S}})}catch(d){URL.revokeObjectURL(s),l(d)}},t.onerror=()=>{URL.revokeObjectURL(s),l(new Error("Failed to load image"))},t.src=s})}preprocessImage(r){const s=r.data;for(let t=0;t<s.length;t+=4){const l=255-Math.round(.299*s[t]+.587*s[t+1]+.114*s[t+2]);s[t]=l,s[t+1]=l,s[t+2]=l}}levenshteinDistance(r,s){const t=Array(s.length+1).fill(null).map(()=>Array(r.length+1).fill(null));for(let a=0;a<=r.length;a++)t[0][a]=a;for(let a=0;a<=s.length;a++)t[a][0]=a;for(let a=1;a<=s.length;a++)for(let l=1;l<=r.length;l++){const d=r[l-1]===s[a-1]?0:1;t[a][l]=Math.min(t[a][l-1]+1,t[a-1][l]+1,t[a-1][l-1]+d)}return t[s.length][r.length]}findBestPuzzleMatch(r){if(!this.availablePuzzleNames.length)return r.trim();const s=r.trim();if(!s)return"";const t=this.availablePuzzleNames.find(h=>h.toLowerCase()===s.toLowerCase());if(t)return t;const a=this.availablePuzzleNames.find(h=>h.toLowerCase().includes(s.toLowerCase())||s.toLowerCase().includes(h.toLowerCase()));if(a)return a;let l=s,d=0;for(const h of this.availablePuzzleNames){const p=[this.calculateLevenshteinSimilarity(s,h),this.calculateJaroWinklerSimilarity(s,h),this.calculateNGramSimilarity(s,h,2)],w=Math.max(...p);w>d&&w>.4&&(d=w,l=h)}if(d<.6){const h=this.findBestCharacterMatch(s);h&&(l=h)}return l}calculateLevenshteinSimilarity(r,s){const t=this.levenshteinDistance(r.toLowerCase(),s.toLowerCase()),a=Math.max(r.length,s.length);return a===0?1:1-t/a}calculateJaroWinklerSimilarity(r,s){const t=r.toLowerCase(),a=s.toLowerCase();if(t===a)return 1;const l=Math.floor(Math.max(t.length,a.length)/2)-1;if(l<0)return 0;const d=new Array(t.length).fill(!1),h=new Array(a.length).fill(!1);let p=0,w=0;for(let o=0;o<t.length;o++){const m=Math.max(0,o-l),y=Math.min(o+l+1,a.length);for(let x=m;x<y;x++)if(!(h[x]||t[o]!==a[x])){d[o]=!0,h[x]=!0,p++;break}}if(p===0)return 0;let k=0;for(let o=0;o<t.length;o++)if(d[o]){for(;!h[k];)k++;t[o]!==a[k]&&w++,k++}const S=(p/t.length+p/a.length+(p-w/2)/p)/3;let v=0;for(let o=0;o<Math.min(t.length,a.length,4)&&t[o]===a[o];o++)v++;return S+.1*v*(1-S)}calculateNGramSimilarity(r,s,t){const a=r.toLowerCase(),l=s.toLowerCase();if(a===l)return 1;if(a.length<t||l.length<t)return 0;const d=new Set,h=new Set;for(let k=0;k<=a.length-t;k++)d.add(a.substr(k,t));for(let k=0;k<=l.length-t;k++)h.add(l.substr(k,t));const p=new Set([...d].filter(k=>h.has(k))),w=new Set([...d,...h]);return p.size/w.size}findBestCharacterMatch(r){let s=null,t=0;for(const a of this.availablePuzzleNames){const l=this.calculateCharacterFrequencyScore(r.toLowerCase(),a.toLowerCase());l>t&&l>.3&&(t=l,s=a)}return s}calculateCharacterFrequencyScore(r,s){const t=new Map,a=new Map;for(const p of r)t.set(p,(t.get(p)||0)+1);for(const p of s)a.set(p,(a.get(p)||0)+1);const l=new Set([...t.keys(),...a.keys()]);let d=0,h=0;for(const p of l){const w=t.get(p)||0,k=a.get(p)||0;d+=Math.min(w,k),h+=Math.max(w,k)}return h===0?0:d/h}findBestPuzzleMatchForced(r){if(!this.availablePuzzleNames.length||!r.trim())return null;const s=r.trim().toLowerCase();let t=this.availablePuzzleNames[0],a=0;for(const l of this.availablePuzzleNames){const d=[this.calculateLevenshteinSimilarity(s,l),this.calculateJaroWinklerSimilarity(s,l),this.calculateNGramSimilarity(s,l,2),this.calculateCharacterFrequencyScore(s,l.toLowerCase()),this.calculateLengthSimilarity(s,l.toLowerCase())],h=d[0]*.25+d[1]*.25+d[2]*.2+d[3]*.2+d[4]*.1;h>a&&(a=h,t=l)}return console.log(`Forced match for "${r}": "${t}" (score: ${a.toFixed(3)})`),t}calculateLengthSimilarity(r,s){const t=r.length,a=s.length,l=Math.max(t,a),d=Math.min(t,a);return l===0?1:d/l}async terminate(){this.worker&&(await this.worker.terminate(),this.worker=null)}static isValidOpusMagnumImage(r){return["image/jpeg","image/jpg","image/png","image/gif"].includes(r.type)}static drawDebugRegions(r){return new Promise((s,t)=>{const a=URL.createObjectURL(r),l=new Image;l.onload=()=>{const d=document.createElement("canvas"),h=d.getContext("2d");d.width=l.width,d.height=l.height,h.drawImage(l,0,0),h.strokeStyle="#00ff00",h.lineWidth=2;const p=new dt;Object.values(p.regions).forEach(w=>{h.strokeRect(w.x,w.y,w.width,w.height)}),URL.revokeObjectURL(a),s(d.toDataURL())},l.onerror=()=>{URL.revokeObjectURL(a),t(new Error("Failed to load image for debug"))},l.src=a})}}const nt=new dt,_e=.8,ns=at("uploads",()=>{const n=M([]),r=te(()=>n.value.some(p=>p.ocrProcessing)),s=te(()=>n.value.some(p=>a(p))),t=te(()=>n.value.filter(p=>p.needsManualPuzzleSelection)),a=p=>p.ocrData?.confidence?p.ocrData.confidence.cost<_e||p.ocrData.confidence.cycles<_e||p.ocrData.confidence.area<_e:!1,l=async p=>{for(;r.value;){const k=Math.floor(Math.random()*400)+100;console.log(`OCR is already processing, waiting ${k}ms...`),await new Promise(S=>setTimeout(S,k))}const w=n.value.indexOf(p);n.value[w].ocrProcessing=!0,n.value[w].ocrError=void 0,n.value[w].ocrData=void 0;try{console.log("Starting OCR processing for:",p.file.name),await nt.initialize();const k=await nt.extractOpusMagnumData(p.file);console.log("OCR completed:",k),await Se(),n.value[w].ocrData=k,k.confidence.puzzle<_e?(n.value[w].needsManualPuzzleSelection=!0,console.log(`Low puzzle confidence (${Math.round(k.confidence.puzzle*100)}%) for ${p.file.name}, requiring manual selection`)):n.value[w].needsManualPuzzleSelection=!1,await Se()}catch(k){console.error("OCR processing failed:",k),n.value[w].ocrError="Failed to extract puzzle data"}finally{n.value[w].ocrProcessing=!1}};return{submissionFiles:n,submissionFilesNeedingManualSelection:t,processOCR:l,processLowConfidenceOCRFiles:async()=>{const p=n.value.filter(w=>a(w));for(const w of p)l(w)},clearFiles:()=>{n.value=[]},isProcessingOCR:r,hasLowConfidence:s,CONFIDENCE_VALUE:_e}}),Nn={class:"form-control w-full"},An={key:0,class:"space-y-4"},Dn={key:1,class:"space-y-4"},In={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 gap-4"},jn={class:"aspect-square rounded-lg overflow-hidden bg-base-200"},Tn=["src","alt"],qn={class:"absolute inset-0 bg-black/80 opacity-0 group-hover:opacity-100 transition-opacity duration-200 rounded-lg flex items-center justify-center"},Fn=["onClick"],Un={class:"mt-2"},Bn={class:"text-xs font-medium truncate"},Vn={class:"text-xs text-base-content/60"},Gn={key:0,class:"mt-1 flex items-center gap-1"},Wn={key:1,class:"mt-1"},Hn={class:"text-xs text-error"},Jn={key:2,class:"mt-1 space-y-1"},Kn={class:"text-xs flex items-center justify-between"},Yn={class:"flex items-center gap-2"},Zn=["title"],Qn=["onClick"],Xn={class:"text-xs space-y-1 bg-base-200 p-2 rounded"},eo={key:0},to=["title"],so={key:1},no=["title"],oo={key:2},ao=["title"],ro={key:3},lo=["title"],io={key:3,class:"mt-2"},co={class:"mt-2"},uo=["onUpdate:modelValue","onChange"],fo=["value"],ho={key:4,class:"mt-1"},mo=["onClick"],vo={class:"flex justify-center"},go={key:0,class:"label"},po={class:"label-text-alt text-error"},bo=he({__name:"FileUpload",setup(n){const r=Le(),{submissionFiles:s,processOCR:t}=ns(),a=M(),l=M(!1),d=M("");Ce(()=>r.puzzles,u=>{u&&u.length>0&&nt.setAvailablePuzzleNames(r.puzzleNames)},{immediate:!0});const h=u=>{const f=u.target;f.files&&w(Array.from(f.files))},p=u=>{u.preventDefault(),l.value=!1,u.dataTransfer?.files&&w(Array.from(u.dataTransfer.files))},w=async u=>{d.value="";for(const f of u)if(k(f))try{const b=await S(f),O=f.type.startsWith("image/gif")?"gif":"image",D={file:f,file_url:"",preview:b,type:O,ocrProcessing:!1,ocrError:void 0,ocrData:void 0};s.push(D),m(f)&&Se(()=>{t(D)})}catch{d.value=`Failed to process ${f.name}`}},k=u=>u.type.startsWith("image/")?u.size>256*1024*1024?(d.value=`${u.name} is too large (max 256MB)`,!1):!0:(d.value=`${u.name} is not a valid image file`,!1),S=u=>new Promise((f,b)=>{const O=new FileReader;O.onload=D=>f(D.target?.result),O.onerror=b,O.readAsDataURL(u)}),v=u=>{s.splice(u,1)},o=u=>{if(u===0)return"0 Bytes";const f=1024,b=["Bytes","KB","MB","GB"],O=Math.floor(Math.log(u)/Math.log(f));return parseFloat((u/Math.pow(f,O)).toFixed(2))+" "+b[O]},m=u=>u.type.startsWith("image/")&&u.size>5e4,y=u=>u>=.8?"badge-success":u>=.6?"badge-warning":"badge-error",x=u=>{const f=s.findIndex(b=>b.file===u.file);f!==-1&&s[f].manualPuzzleSelection&&(s[f].needsManualPuzzleSelection=!1,console.log(`Manual puzzle selection: ${u.file.name} -> ${s[f].manualPuzzleSelection}`))};return(u,f)=>(i(),c("div",Nn,[f[19]||(f[19]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Upload Solution Files"),e("span",{class:"label-text-alt text-xs"},"Images or GIFs only")],-1)),e("div",{class:ae(["border-2 border-dashed border-base-300 rounded-lg p-6 text-center hover:border-primary transition-colors duration-300",{"border-primary bg-primary/5":l.value}]),onDrop:p,onDragover:f[2]||(f[2]=et(b=>l.value=!0,["prevent"])),onDragleave:f[3]||(f[3]=b=>l.value=!1),onDragenter:f[4]||(f[4]=et(()=>{},["prevent"]))},[e("input",{ref_key:"fileInput",ref:a,type:"file",multiple:"",accept:"image/*,.gif",class:"hidden",onChange:h},null,544),q(s).length===0?(i(),c("div",An,[f[6]||(f[6]=e("div",{class:"mx-auto w-12 h-12 text-base-content/40 flex items-center justify-center"},[e("i",{class:"mdi mdi-cloud-upload text-5xl"})],-1)),e("div",null,[f[5]||(f[5]=e("p",{class:"text-base-content/70 mb-2"},"Drop your files here or",-1)),e("button",{type:"button",onClick:f[0]||(f[0]=b=>a.value?.click()),class:"btn btn-primary btn-sm"}," Choose Files ")]),f[7]||(f[7]=e("p",{class:"text-xs text-base-content/50"}," Supported formats: JPG, PNG, GIF (max 256MB each) ",-1))])):(i(),c("div",Dn,[e("div",In,[(i(!0),c(U,null,K(q(s),(b,O)=>(i(),c("div",{key:O,class:"relative group"},[e("div",jn,[e("img",{src:b.preview,alt:b.file.name,class:"w-full h-full object-cover"},null,8,Tn)]),e("div",qn,[e("button",{onClick:D=>v(O),class:"btn btn-error btn-lg btn-circle"},[...f[8]||(f[8]=[e("i",{class:"mdi mdi-close"},null,-1)])],8,Fn)]),e("div",Un,[e("p",Bn,g(b.file.name),1),e("p",Vn,g(o(b.file.size))+" • "+g(b.type.toUpperCase()),1),b.ocrProcessing?(i(),c("div",Gn,[...f[9]||(f[9]=[e("span",{class:"loading loading-spinner loading-xs"},null,-1),e("span",{class:"text-xs text-info"},"Extracting puzzle data...",-1)])])):b.ocrError?(i(),c("div",Wn,[e("p",Hn,g(b.ocrError),1)])):b.ocrData?(i(),c("div",Jn,[e("div",Kn,[e("div",Yn,[f[10]||(f[10]=e("span",{class:"font-medium text-success"},"✓ OCR Complete",-1)),b.ocrData.confidence?(i(),c("span",{key:0,class:ae(["badge badge-xs",y(b.ocrData.confidence.overall)]),title:`Overall confidence: ${Math.round(b.ocrData.confidence.overall*100)}%`},g(Math.round(b.ocrData.confidence.overall*100))+"% ",11,Zn)):R("",!0)]),e("button",{onClick:D=>q(t)(b),class:"btn btn-xs btn-ghost",title:"Retry OCR"},[...f[11]||(f[11]=[e("i",{class:"mdi mdi-refresh"},null,-1)])],8,Qn)]),e("div",Xn,[b.ocrData.puzzle?(i(),c("div",eo,[f[12]||(f[12]=e("strong",null,"Puzzle:",-1)),E(" "+g(b.ocrData.puzzle)+" ",1),b.ocrData.confidence?.puzzle?(i(),c("span",{key:0,class:"ml-2 opacity-60",title:`Puzzle confidence: ${Math.round(b.ocrData.confidence.puzzle*100)}%`}," ("+g(Math.round(b.ocrData.confidence.puzzle*100))+"%) ",9,to)):R("",!0)])):R("",!0),b.ocrData.cost?(i(),c("div",so,[f[13]||(f[13]=e("strong",null,"Cost:",-1)),E(" "+g(b.ocrData.cost)+" ",1),b.ocrData.confidence?.cost?(i(),c("span",{key:0,class:"ml-2 opacity-60",title:`Cost confidence: ${Math.round(b.ocrData.confidence.cost*100)}%`}," ("+g(Math.round(b.ocrData.confidence.cost*100))+"%) ",9,no)):R("",!0)])):R("",!0),b.ocrData.cycles?(i(),c("div",oo,[f[14]||(f[14]=e("strong",null,"Cycles:",-1)),E(" "+g(b.ocrData.cycles)+" ",1),b.ocrData.confidence?.cycles?(i(),c("span",{key:0,class:"ml-2 opacity-60",title:`Cycles confidence: ${Math.round(b.ocrData.confidence.cycles*100)}%`}," ("+g(Math.round(b.ocrData.confidence.cycles*100))+"%) ",9,ao)):R("",!0)])):R("",!0),b.ocrData.area?(i(),c("div",ro,[f[15]||(f[15]=e("strong",null,"Area:",-1)),E(" "+g(b.ocrData.area)+" ",1),b.ocrData.confidence?.area?(i(),c("span",{key:0,class:"ml-2 opacity-60",title:`Area confidence: ${Math.round(b.ocrData.confidence.area*100)}%`}," ("+g(Math.round(b.ocrData.confidence.area*100))+"%) ",9,lo)):R("",!0)])):R("",!0)])])):R("",!0),b.needsManualPuzzleSelection?(i(),c("div",io,[f[17]||(f[17]=gs('<div class="alert alert-warning alert-sm"><i class="mdi mdi-alert-circle text-lg"></i><div class="flex-1"><div class="font-medium">Low OCR Confidence</div><div class="text-xs"> Please select the correct puzzle manually </div></div></div>',1)),e("div",co,[ce(e("select",{"onUpdate:modelValue":D=>b.manualPuzzleSelection=D,class:"select select-bordered select-sm w-full",onChange:D=>x(b)},[f[16]||(f[16]=e("option",{value:""},"Select puzzle...",-1)),(i(!0),c(U,null,K(q(r).puzzles,D=>(i(),c("option",{key:D.id,value:D.title},g(D.title),9,fo))),128))],40,uo),[[Ht,b.manualPuzzleSelection]])])])):!b.ocrProcessing&&!b.ocrError&&!b.ocrData?(i(),c("div",ho,[e("button",{onClick:D=>q(t)(b),class:"btn btn-xs btn-outline"},[...f[18]||(f[18]=[e("i",{class:"mdi mdi-text-recognition"},null,-1),E(" Extract Puzzle Data ",-1)])],8,mo)])):R("",!0)])]))),128))]),e("div",vo,[e("button",{type:"button",onClick:f[1]||(f[1]=b=>a.value?.click()),class:"btn btn-outline btn-sm"}," Add More Files ")])]))],34),d.value?(i(),c("div",go,[e("span",po,g(d.value),1)])):R("",!0)]))}}),yo={class:"card bg-base-100 shadow-xl"},_o={class:"card-body"},xo={key:0,class:"alert alert-info"},wo={class:"flex-1"},ko={class:"font-bold"},zo={class:"text-sm space-y-1 mt-1"},$o={class:"badge badge-ghost badge-sm ml-2"},So={key:1,class:"alert alert-warning"},Co={class:"flex-1"},Po={class:"text-sm"},Lo={class:"form-control"},Ro={class:"flex-1"},Eo={class:"flex label"},Oo={class:"label-text-alt"},Mo={class:"form-control"},No={class:"label cursor-pointer justify-start gap-3"},Ao=["disabled"],Do={class:"card-actions justify-end"},Io=["disabled"],jo={key:0,class:"loading loading-spinner loading-sm"},To={key:1},qo={key:2},Fo={key:3},Uo=he({__name:"SubmissionForm",props:{puzzles:{},findPuzzleByName:{type:Function}},setup(n){const r=n,s=ns(),{submissionFiles:t,hasLowConfidence:a,submissionFilesNeedingManualSelection:l}=rt(s),{clearFiles:d,processLowConfidenceOCRFiles:h}=s,{handleSubmission:p}=lt(),w=M(""),k=M(!1),S=M(!1),v=te(()=>w.value.length),o=te(()=>{const x=t.value.length>0,u=!t.value.some(f=>f.needsManualPuzzleSelection);return x&&!S.value&&u});Ce(a,x=>{x&&(k.value=!0)});const m=te(()=>{const x={};return t.value.forEach(u=>{const f=u.manualPuzzleSelection||u.ocrData?.puzzle;f&&(x[f]||(x[f]={puzzle:r.findPuzzleByName(f),files:[]}),x[f].files.push(u))}),x}),y=async()=>{if(o.value){S.value=!0;try{p({files:t.value,notes:w.value.trim()||void 0,manualValidationRequested:a.value||k.value}),d(),w.value="",k.value=!1}catch(x){console.error("Submission error:",x)}finally{S.value=!1}}};return(x,u)=>(i(),c("div",yo,[e("div",_o,[u[9]||(u[9]=e("h2",{class:"card-title text-xl mb-6"},[e("i",{class:"mdi mdi-check-circle text-2xl text-primary"}),E(" Submit Solution ")],-1)),e("form",{onSubmit:et(y,["prevent"]),class:"space-y-6"},[Object.keys(m.value).length>0?(i(),c("div",xo,[u[3]||(u[3]=e("i",{class:"mdi mdi-information-outline text-xl"},null,-1)),e("div",wo,[e("h4",ko," Detected Puzzles ("+g(Object.keys(m.value).length)+") ",1),e("div",zo,[(i(!0),c(U,null,K(m.value,(f,b)=>(i(),c("div",{key:b,class:"flex justify-between"},[e("span",null,g(b),1),e("span",$o,g(f.files.length)+" file(s)",1)]))),128))])])])):R("",!0),fe(bo),q(l).length>0?(i(),c("div",So,[u[6]||(u[6]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",Co,[u[5]||(u[5]=e("div",{class:"font-bold"},"Manual Puzzle Selection Required",-1)),e("div",Po,g(q(l).length)+" file(s) have low OCR confidence for puzzle names. Please select the correct puzzle for each file before submitting. ",1),e("button",{class:"btn mt-3 w-full",onClick:u[0]||(u[0]=(...f)=>q(h)&&q(h)(...f))},[...u[4]||(u[4]=[e("span",{class:"mdi mdi-reload text-2xl"},null,-1),E(" Retry OCR on low confidence puzzle ",-1)])])])])):R("",!0),e("div",Lo,[e("div",Ro,[e("label",Eo,[u[7]||(u[7]=e("span",{class:"label-text font-medium"},"Notes (Optional)",-1)),e("span",Oo,g(v.value)+"/500",1)]),ce(e("textarea",{"onUpdate:modelValue":u[1]||(u[1]=f=>w.value=f),class:"flex textarea textarea-bordered h-24 w-full resize-none",placeholder:"Add any notes about your solution, approach, or interesting findings...",maxlength:"500"},null,512),[[ze,w.value]])])]),e("div",Mo,[e("label",No,[ce(e("input",{type:"checkbox","onUpdate:modelValue":u[2]||(u[2]=f=>k.value=f),class:"checkbox checkbox-primary",disabled:q(a)},null,8,Ao),[[ps,k.value]]),u[8]||(u[8]=e("div",{class:"flex-1"},[e("span",{class:"label-text font-medium"},"Request manual validation"),e("div",{class:"label-text-alt text-xs opacity-70 mt-1"},[E(" Check this if you want an admin to manually review your submission, even if OCR confidence is high. "),e("br"),e("em",null,"Note: This will be automatically checked if any OCR confidence is below 80%.")])],-1))])]),e("div",Do,[e("button",{type:"submit",class:"btn btn-primary",disabled:!o.value},[S.value?(i(),c("span",jo)):R("",!0),S.value?(i(),c("span",To,"Submitting...")):q(l).length>0?(i(),c("span",qo," Select Puzzles ("+g(q(l).length)+" remaining) ",1)):(i(),c("span",Fo,"Submit Solution"))],8,Io)])],32)])]))}}),Bo={class:"card bg-base-100 shadow-xl"},Vo={class:"card-body"},Go={class:"stats stats-vertical lg:stats-horizontal shadow mb-6"},Wo={class:"stat"},Ho={class:"stat-value text-primary"},Jo={class:"stat"},Ko={class:"stat-value text-secondary"},Yo={class:"stat"},Zo={class:"stat-value text-warning"},Qo={class:"stat"},Xo={class:"stat-value text-success"},ea={key:0},ta={class:"overflow-x-auto"},sa={class:"table table-zebra"},na={class:"font-bold"},oa={class:"text-sm opacity-50"},aa={class:"text-sm space-y-1"},ra={class:"flex justify-between items-center"},la={class:"flex justify-between items-center"},ia={class:"flex justify-between items-center"},ca={class:"badge badge-warning badge-sm"},da=["onClick"],ua=["onClick"],fa={key:1,class:"text-center py-8"},ha={key:0,class:"modal modal-open"},ma={class:"modal-box w-11/12 max-w-5xl"},va=["src"],ga={key:0,class:"space-y-4"},pa={class:"alert alert-info"},ba={class:"font-bold"},ya={class:"grid grid-cols-4 gap-4"},_a={class:"form-control"},xa=["value"],wa={class:"form-control"},ka=["placeholder"],za={class:"form-control"},$a=["placeholder"],Sa={class:"form-control"},Ca=["placeholder"],Pa={class:"modal-action"},La=["disabled"],Ra={key:0,class:"loading loading-spinner loading-sm"},Ea={class:"mockup-code w-full"},Oa=he({__name:"AdminPanel",setup(n,{expose:r}){const s=Le(),t=M({total_submissions:0,total_responses:0,needs_validation:0,validated_submissions:0,validation_rate:0}),a=M([]),l=M(!1),d=M(!1),h=M({show:!1,response:null,data:{puzzle:-1,validated_cost:0,validated_cycles:0,validated_area:0}}),p=async()=>{try{l.value=!0;try{const u=await ne.getStats();u.data&&(t.value=u.data)}catch(u){console.warn("Stats endpoint not available:",u),t.value={total_submissions:0,total_responses:0,needs_validation:0,validated_submissions:0,validation_rate:0}}const x=await ne.getResponsesNeedingValidation();x.data&&(a.value=x.data)}catch(x){console.error("Failed to load admin data:",x)}finally{l.value=!1}},w=async()=>{for(const x of Array.from(a.value)){if(!x.id)continue;const{data:u,error:f}=await ne.autoValidateResponses(x.id);if(u&&!u.needs_manual_validation)a.value=a.value.filter(b=>b.id!==x.id),t.value.needs_validation-=1;else if(f)break}},k=x=>{h.value.response=x,h.value.data={puzzle:x.puzzle_id||-1,validated_cost:x.cost||0,validated_cycles:x.cycles||0,validated_area:x.area||0},h.value.show=!0},S=()=>{h.value.show=!1,h.value.response=null,h.value.data={puzzle:-1,validated_cost:0,validated_cycles:0,validated_area:0}},v=async x=>{const{data:u}=await ne.autoValidateResponses(x);console.log(u),u&&!u.needs_manual_validation&&(a.value=a.value.filter(f=>f.id!==x),console.log(t.value),t.value.needs_validation-=1,console.log(t.value))},o=async()=>{if(h.value.response?.id)try{d.value=!0;const x=await ne.validateResponse(h.value.response.id,h.value.data);if(x.error){alert(`Validation failed: ${x.error}`);return}a.value=a.value.filter(u=>u.id!==h.value.response?.id),t.value.needs_validation=Math.max(0,t.value.needs_validation-1),S()}catch(x){console.error("Validation error:",x),alert("Validation failed")}finally{d.value=!1}};we(()=>{p()});const m=x=>x>=.8?"badge-success":x>=.6?"badge-warning":"badge-error",y=x=>{const u=[x.ocr_confidence_cost,x.ocr_confidence_cycles,x.ocr_confidence_area].filter(b=>b!=null);if(u.length===0)return 0;const f=u.reduce((b,O)=>b+O,0)/u.length;return Math.round(f*100)};return r({refresh:p}),(x,u)=>(i(),c(U,null,[e("div",Bo,[e("div",Vo,[u[14]||(u[14]=e("h2",{class:"card-title"},[e("i",{class:"mdi mdi-shield-account text-2xl text-warning"}),E(" Admin Panel ")],-1)),e("div",Go,[e("div",Wo,[u[4]||(u[4]=e("div",{class:"stat-title"},"Total Submissions",-1)),e("div",Ho,g(t.value.total_submissions),1)]),e("div",Jo,[u[5]||(u[5]=e("div",{class:"stat-title"},"Total Responses",-1)),e("div",Ko,g(t.value.total_responses),1)]),e("div",Yo,[u[6]||(u[6]=e("div",{class:"stat-title"},"Need Validation",-1)),e("div",Zo,g(t.value.needs_validation),1)]),e("div",Qo,[u[7]||(u[7]=e("div",{class:"stat-title"},"Validation Rate",-1)),e("div",Xo,g(Math.round(t.value.validation_rate*100))+"% ",1)])]),e("button",{class:"btn btn-sm btn-primary",onClick:w},[...u[8]||(u[8]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Auto validation for all responses ",-1)])]),a.value.length>0?(i(),c("div",ea,[u[12]||(u[12]=e("h3",{class:"text-lg font-bold mb-4"},"Responses Needing Validation",-1)),e("div",ta,[e("table",sa,[u[11]||(u[11]=e("thead",null,[e("tr",null,[e("th",null,"Puzzle"),e("th",null,"OCR Data"),e("th",null,"Confidence"),e("th",null,"Actions")])],-1)),e("tbody",null,[(i(!0),c(U,null,K(a.value,f=>(i(),c("tr",{key:f.id},[e("td",null,[e("div",na,g(f.puzzle_name),1),e("div",oa,"ID: "+g(f.id),1)]),e("td",null,[e("div",aa,[e("div",ra,[e("span",null,"Cost: "+g(f.cost||"-"),1),f.ocr_confidence_cost?(i(),c("span",{key:0,class:ae(["badge badge-xs",m(f.ocr_confidence_cost)])},g(Math.round(f.ocr_confidence_cost*100))+"% ",3)):R("",!0)]),e("div",la,[e("span",null,"Cycles: "+g(f.cycles||"-"),1),f.ocr_confidence_cycles?(i(),c("span",{key:0,class:ae(["badge badge-xs",m(f.ocr_confidence_cycles)])},g(Math.round(f.ocr_confidence_cycles*100))+"% ",3)):R("",!0)]),e("div",ia,[e("span",null,"Area: "+g(f.area||"-"),1),f.ocr_confidence_area?(i(),c("span",{key:0,class:ae(["badge badge-xs",m(f.ocr_confidence_area)])},g(Math.round(f.ocr_confidence_area*100))+"% ",3)):R("",!0)])])]),e("td",null,[e("div",ca,g(y(f))+"% ",1)]),e("td",null,[e("button",{onClick:b=>k(f),class:"btn btn-sm btn-primary mr-2"},[...u[9]||(u[9]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Validate ",-1)])],8,da),f.id?(i(),c("button",{key:0,onClick:b=>v(f.id),class:"btn btn-sm btn-warning"},[...u[10]||(u[10]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Auto Validation ",-1)])],8,ua)):R("",!0)])]))),128))])])])])):(i(),c("div",fa,[...u[13]||(u[13]=[e("i",{class:"mdi mdi-check-all text-6xl text-success opacity-50"},null,-1),e("p",{class:"text-lg font-medium mt-2"},"All responses validated!",-1),e("p",{class:"text-sm opacity-70"}," No responses currently need manual validation. ",-1)])]))])]),h.value.show?(i(),c("div",ha,[e("div",ma,[u[22]||(u[22]=e("h3",{class:"font-bold text-lg mb-4"},"Validate Response",-1)),(i(!0),c(U,null,K(h.value.response?.files??[],f=>(i(),c("div",null,[e("img",{src:f.file_url},null,8,va)]))),256)),h.value.response?(i(),c("div",ga,[e("div",pa,[u[16]||(u[16]=e("i",{class:"mdi mdi-information-outline"},null,-1)),e("div",null,[e("div",ba,g(h.value.response.puzzle_name),1),u[15]||(u[15]=e("div",{class:"text-sm"},"Review and correct the OCR data below",-1))])]),e("div",ya,[e("div",_a,[u[18]||(u[18]=e("label",{class:"label"},[e("span",{class:"label-text"},"Puzzle")],-1)),ce(e("select",{"onUpdate:modelValue":u[0]||(u[0]=f=>h.value.data.puzzle=f),class:"select select-bordered select-sm w-full"},[u[17]||(u[17]=e("option",{value:""},"Select puzzle...",-1)),(i(!0),c(U,null,K(q(s).puzzles,f=>(i(),c("option",{key:f.id,value:f.id},g(f.title),9,xa))),128))],512),[[Ht,h.value.data.puzzle]])]),e("div",wa,[u[19]||(u[19]=e("label",{class:"label"},[e("span",{class:"label-text"},"Cost")],-1)),ce(e("input",{"onUpdate:modelValue":u[1]||(u[1]=f=>h.value.data.validated_cost=f),type:"text",class:"input input-bordered input-sm",placeholder:h.value.response.cost?.toString()||"Enter cost"},null,8,ka),[[ze,h.value.data.validated_cost]])]),e("div",za,[u[20]||(u[20]=e("label",{class:"label"},[e("span",{class:"label-text"},"Cycles")],-1)),ce(e("input",{"onUpdate:modelValue":u[2]||(u[2]=f=>h.value.data.validated_cycles=f),type:"text",class:"input input-bordered input-sm",placeholder:h.value.response.cycles?.toString()||"Enter cycles"},null,8,$a),[[ze,h.value.data.validated_cycles]])]),e("div",Sa,[u[21]||(u[21]=e("label",{class:"label"},[e("span",{class:"label-text"},"Area")],-1)),ce(e("input",{"onUpdate:modelValue":u[3]||(u[3]=f=>h.value.data.validated_area=f),type:"text",class:"input input-bordered input-sm",placeholder:h.value.response.area?.toString()||"Enter area"},null,8,Ca),[[ze,h.value.data.validated_area]])])]),e("div",Pa,[e("button",{onClick:S,class:"btn btn-ghost"}," Cancel "),e("button",{onClick:o,class:"btn btn-primary",disabled:d.value},[d.value?(i(),c("span",Ra)):R("",!0),E(" "+g(d.value?"Validating...":"Validate"),1)],8,La)]),e("div",Ea,[e("pre",null,[e("code",null,g(h.value),1)])])])):R("",!0)]),e("div",{class:"modal-backdrop",onClick:S})])):R("",!0)],64))}}),Ma={class:"mb-8"},Na={class:"grid grid-cols-1 lg:grid-cols-3 gap-8"},Aa={class:"lg:col-span-1"},Da={class:"card bg-base-100 shadow-lg sticky top-8"},Ia={class:"card-body"},ja={class:"text-center mb-6"},Ta={class:"text-3xl font-bold"},qa={key:0,class:"flex justify-center py-8"},Fa={key:1,class:"space-y-4"},Ua={class:"text-center"},Ba={key:0,class:"text-4xl font-bold text-primary"},Va={key:1,class:"text-2xl text-base-content/50"},Ga={class:"text-center"},Wa={class:"text-2xl font-bold"},Ha={class:"text-center"},Ja={class:"text-2xl font-bold"},Ka={class:"lg:col-span-2"},Ya={class:"card bg-base-100 shadow-lg"},Za={class:"card-body"},Qa={key:0,class:"flex justify-center py-8"},Xa={key:1,class:"text-center py-8"},er={key:2,class:"space-y-6"},tr={class:"tabs tabs-border"},sr={class:"space-y-4"},nr={key:0,class:"text-center py-8"},or={key:1,class:"overflow-x-auto"},ar={class:"table table-zebra w-full"},rr={class:"font-bold"},lr={class:"font-medium"},ir={key:0,class:"badge badge-warning"},cr={class:"text-right"},dr={class:"text-right font-bold"},ur={class:"space-y-6"},fr=["onClick"],hr={class:"ml-auto badge badge-sm"},mr={key:0,class:"card-body"},vr={key:0,class:"text-center py-8"},gr={key:1,class:"space-y-6"},pr={key:0,class:"bg-base-200 p-4 rounded-lg"},br={class:"grid grid-cols-3 gap-4"},yr={class:"text-center"},_r={class:"text-2xl font-bold text-primary"},xr={class:"text-center"},wr={class:"text-2xl font-bold text-primary"},kr={class:"text-center"},zr={class:"text-2xl font-bold text-primary"},$r={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Sr={class:"card-body p-4"},Cr={class:"text-xs text-base-content/70 font-bold"},Pr={class:"font-bold text-lg"},Lr={key:0,class:"badge badge-warning"},Rr={class:"space-y-2 text-sm"},Er={class:"flex justify-between"},Or={key:0,class:"text-xs text-base-content/60"},Mr={class:"badge badge-sm"},Nr={class:"flex justify-between"},Ar={key:0,class:"text-xs text-base-content/60"},Dr={class:"badge badge-sm"},Ir={class:"flex justify-between"},jr={key:0,class:"text-xs text-base-content/60"},Tr={class:"badge badge-sm"},qr={class:"flex justify-between pt-2 border-t"},Fr={class:"badge badge-sm"},Ur={class:"flex justify-between pt-2 border-t"},Br={class:"badge badge-primary"},Vr={class:"overflow-x-auto"},Gr={class:"table table-zebra w-full table-sm"},Wr={class:"text-center"},Hr={key:0,class:"text-xs text-base-content/60 block"},Jr={class:"text-center"},Kr={key:0,class:"text-xs text-base-content/60 block"},Yr={class:"text-center"},Zr={key:0,class:"text-xs text-base-content/60 block"},Qr={class:"font-bold"},Xr={key:0,class:"badge badge-warning"},el={key:1,class:"badge"},tl={key:2,class:"badge"},sl={key:3},nl={class:"font-medium"},ol={class:"text-center"},al={key:0,class:"badge badge-sm"},rl={key:1,class:"text-base-content/40"},ll={class:"text-center"},il={key:0,class:"badge badge-sm"},cl={key:1,class:"text-base-content/40"},dl={class:"text-center"},ul={key:0,class:"badge badge-sm"},fl={key:1,class:"text-base-content/40"},hl={class:"text-center"},ml={key:0,class:"badge badge-sm"},vl={key:1,class:"text-base-content/40"},gl={class:"text-right font-bold text-primary text-lg"},pl=he({__name:"Results",setup(n){const r=M(!0),s=M(null),t=M("overall"),a=M(null),l=M({username:"Player",rank:null,totalPoints:0,puzzlesSolved:0,isStaff:!1}),d=async()=>{r.value=!0;try{const v=await fetch("/api/results/results");if(!v.ok)throw new Error("Failed to fetch results");s.value=await v.json()}catch(v){console.error("Error fetching results:",v)}finally{r.value=!1}},h=()=>s.value?s.value.users.map(o=>{const m=s.value.responses_by_userid[o.id]||[],y=m.reduce((u,f)=>u+(f.rank_points||0),0),x=m.length;return{user:o,totalPoints:y,puzzlesSolved:x}}).sort((o,m)=>m.totalPoints-o.totalPoints):[],p=v=>s.value?(s.value.ranking_by_puzzle[v]||[]).map(m=>({user:s.value.users.find(x=>x.id===m.user_id),cost:m.final_cost,cycles:m.final_cycles,area:m.final_area,points:m.points,rank_points:m.rank_points||0})).reverse():[],w=v=>{a.value=a.value===v?null:v},k=async()=>{try{const v=await fetch("/api/cache/clear",{method:"POST"});if(v.ok)alert("Cache cleared successfully!"),await d();else{const o=await v.json();alert(`Error clearing cache: ${o.detail||"Unknown error"}`)}}catch(v){console.error("Error clearing cache:",v),alert("Error clearing cache. Please try again.")}},S=async()=>{try{const v=await fetch("/api/user");if(v.ok){const o=await v.json();if(o.is_authenticated){l.value.username=o.username,l.value.isStaff=o.is_staff||!1,await d();const m=h(),y=m.findIndex(x=>x.user.id===o.id);y!==-1&&(l.value.rank=y+1,l.value.totalPoints=m[y].totalPoints,l.value.puzzlesSolved=m[y].puzzlesSolved)}}}catch(v){console.error("Error loading user data:",v),await d()}};return we(()=>{S()}),(v,o)=>(i(),c("div",Ma,[e("div",Na,[e("div",Aa,[e("div",Da,[o[9]||(o[9]=e("div",{class:"bg-gradient-to-br from-purple-600 to-purple-400 p-6 text-white rounded-t-2xl"},[e("h3",{class:"text-3xl font-bold"},[e("i",{class:"mdi mdi-trophy text-3xl"}),E(" Your Ranking ")])],-1)),e("div",Ia,[e("div",ja,[o[2]||(o[2]=e("p",{class:"text-sm text-base-content/70"},"Player",-1)),e("p",Ta,g(l.value.username),1)]),o[8]||(o[8]=e("div",{class:"divider"},null,-1)),r.value?(i(),c("div",qa,[...o[3]||(o[3]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):(i(),c("div",Fa,[e("div",Ua,[o[4]||(o[4]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Current Rank",-1)),l.value.rank!==null?(i(),c("p",Ba,[fe(ft,{rank:l.value.rank},null,8,["rank"])])):(i(),c("p",Va,"No rank yet"))]),e("div",Ga,[o[5]||(o[5]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Total Points",-1)),e("p",Wa,g(l.value.totalPoints.toLocaleString()),1)]),e("div",Ha,[o[6]||(o[6]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Puzzles Solved",-1)),e("p",Ja,g(l.value.puzzlesSolved),1)]),l.value.isStaff?(i(),c("button",{key:0,onClick:k,class:"btn btn-error btn-sm w-full mt-6"},[...o[7]||(o[7]=[e("i",{class:"mdi mdi-cache-clear mr-1"},null,-1),E(" Clear Cache ",-1)])])):R("",!0)]))])])]),e("div",Ka,[e("div",Ya,[e("div",Za,[o[37]||(o[37]=e("h2",{class:"card-title text-2xl mb-6"},[e("i",{class:"mdi mdi-trophy text-yellow-500 mr-2"}),E(" General Results ")],-1)),r.value?(i(),c("div",Qa,[...o[10]||(o[10]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):s.value?(i(),c("div",er,[e("div",tr,[e("button",{onClick:o[0]||(o[0]=m=>t.value="overall"),class:ae(["tab",t.value==="overall"?"tab-active":""])},[...o[12]||(o[12]=[e("i",{class:"mdi mdi-chart-line mr-2"},null,-1),E(" Overall Ranking ",-1)])],2),e("button",{onClick:o[1]||(o[1]=m=>t.value="byPuzzle"),class:ae(["tab",t.value==="byPuzzle"?"tab-active":""])},[...o[13]||(o[13]=[e("i",{class:"mdi mdi-puzzle mr-2"},null,-1),E(" By Puzzle ",-1)])],2)]),ce(e("div",sr,[h().length===0?(i(),c("div",nr,[...o[14]||(o[14]=[e("p",{class:"text-base-content/70"},"No submissions yet",-1)])])):(i(),c("div",or,[e("table",ar,[o[15]||(o[15]=e("thead",null,[e("tr",null,[e("th",null,"Rank"),e("th",null,"Player"),e("th",{class:"text-right"},"Puzzles Solved"),e("th",{class:"text-right"},"Total Points")])],-1)),e("tbody",null,[(i(!0),c(U,null,K(h(),(m,y)=>(i(),c("tr",{key:m.user.username},[e("td",rr,[fe(ft,{rank:y+1},null,8,["rank"])]),e("td",lr,[E(g(m.user.username)+" ",1),m.user.is_staff?(i(),c("span",ir," admin ")):R("",!0)]),e("td",cr,g(m.puzzlesSolved),1),e("td",dr,g(m.totalPoints),1)]))),128))])])]))],512),[[ut,t.value==="overall"]]),ce(e("div",ur,[(i(!0),c(U,null,K(s.value.puzzles,m=>(i(),c("div",{key:m.id,class:"card bg-base-100 border border-base-300"},[e("button",{onClick:y=>w(m.id),class:"btn btn-ghost btn-lg w-full justify-start text-lg font-bold hover:bg-primary/20 rounded-b-none"},[e("i",{class:ae(["mdi mr-2",a.value===m.id?"mdi-chevron-down":"mdi-chevron-right"])},null,2),E(" "+g(m.title)+" ",1),e("span",hr,g(p(m.id).length)+" submissions ",1)],8,fr),a.value===m.id?(i(),c("div",mr,[p(m.id).length===0?(i(),c("div",vr,[...o[16]||(o[16]=[e("p",{class:"text-base-content/70 text-lg"},"No submissions yet",-1)])])):(i(),c("div",gr,[m.points_factor?(i(),c("div",pr,[o[23]||(o[23]=e("p",{class:"text-sm text-base-content/70 mb-3 font-semibold"},"Points Coefficients",-1)),e("div",br,[e("div",yr,[e("span",_r,[o[17]||(o[17]=e("small",null,"x",-1)),E(g(m.points_factor.cost),1)]),o[18]||(o[18]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",xr,[e("span",wr,[o[19]||(o[19]=e("small",null,"x",-1)),E(g(m.points_factor.cycles),1)]),o[20]||(o[20]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",kr,[e("span",zr,[o[21]||(o[21]=e("small",null,"x",-1)),E(g(m.points_factor.area),1)]),o[22]||(o[22]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):R("",!0),e("div",$r,[(i(!0),c(U,null,K(p(m.id).slice(0,3),(y,x)=>(i(),c("div",{key:x,class:"card bg-base-200"},[e("div",Sr,[e("div",Cr,g(x===0?"🏆 1st Place":x===1?"🥈 2nd Place":"🥉 3rd Place"),1),e("h4",Pr,[E(g(y.user.username)+" ",1),y.user.is_staff?(i(),c("span",Lr," admin ")):R("",!0)]),o[29]||(o[29]=e("div",{class:"divider my-2"},null,-1)),e("div",Rr,[e("div",Er,[e("span",null,[o[24]||(o[24]=E("Cost",-1)),m.points_factor?(i(),c("span",Or," (x"+g(m.points_factor.cost)+") ",1)):R("",!0)]),e("span",Mr,g(y.cost||"N/A"),1)]),e("div",Nr,[e("span",null,[o[25]||(o[25]=E("Cycles",-1)),m.points_factor?(i(),c("span",Ar," (x"+g(m.points_factor.cycles)+") ",1)):R("",!0)]),e("span",Dr,g(y.cycles||"N/A"),1)]),e("div",Ir,[e("span",null,[o[26]||(o[26]=E("Area",-1)),m.points_factor?(i(),c("span",jr," (x"+g(m.points_factor.area)+") ",1)):R("",!0)]),e("span",Tr,g(y.area||"N/A"),1)]),e("div",qr,[o[27]||(o[27]=e("span",null,"Total (with coef.)",-1)),e("span",Fr,g(y.points||"N/A"),1)]),e("div",Ur,[o[28]||(o[28]=e("span",{class:"font-bold"},"Points",-1)),e("span",Br,g(y.rank_points)+" pts",1)])])])]))),128))]),e("div",Vr,[e("table",Gr,[e("thead",null,[e("tr",null,[o[33]||(o[33]=e("th",{class:"w-12"},"Rank",-1)),o[34]||(o[34]=e("th",null,"Player",-1)),e("th",Wr,[o[30]||(o[30]=E(" Cost ",-1)),m.points_factor?(i(),c("span",Hr,"(x"+g(m.points_factor.cost)+")",1)):R("",!0)]),e("th",Jr,[o[31]||(o[31]=E(" Cycles ",-1)),m.points_factor?(i(),c("span",Kr,"(x"+g(m.points_factor.cycles)+")",1)):R("",!0)]),e("th",Yr,[o[32]||(o[32]=E(" Area ",-1)),m.points_factor?(i(),c("span",Zr,"(x"+g(m.points_factor.area)+")",1)):R("",!0)]),o[35]||(o[35]=e("th",{class:"text-center"},"Total (with coef.)",-1)),o[36]||(o[36]=e("th",{class:"text-right"},"Points",-1))])]),e("tbody",null,[(i(!0),c(U,null,K(p(m.id),(y,x)=>(i(),c("tr",{key:x,class:ae({"bg-primary/10":x<3})},[e("td",Qr,[x===0?(i(),c("span",Xr,"🏆")):x===1?(i(),c("span",el,"🥈")):x===2?(i(),c("span",tl,"🥉")):(i(),c("span",sl,"#"+g(x+1),1))]),e("td",nl,g(y.user.username),1),e("td",ol,[y.cost?(i(),c("span",al,g(y.cost),1)):(i(),c("span",rl,"—"))]),e("td",ll,[y.cycles?(i(),c("span",il,g(y.cycles),1)):(i(),c("span",cl,"—"))]),e("td",dl,[y.area?(i(),c("span",ul,g(y.area),1)):(i(),c("span",fl,"—"))]),e("td",hl,[y.points?(i(),c("span",ml,g(y.points),1)):(i(),c("span",vl,"—"))]),e("td",gl,g(y.rank_points),1)],2))),128))])])])]))])):R("",!0)]))),128))],512),[[ut,t.value==="byPuzzle"]])])):(i(),c("div",Xa,[...o[11]||(o[11]=[e("p",{class:"text-base-content/70"},"No results available yet",-1)])]))])])])])]))}}),bl={class:"card bg-base-100 shadow-lg"},yl={class:"card-body"},_l={key:0,class:"flex justify-center py-12"},xl={key:1,class:"alert alert-error"},wl={key:2,class:"text-center py-8"},kl={key:3,class:"overflow-x-auto"},zl={class:"table table-zebra"},$l={class:"font-semibold"},Sl={class:"text-right"},Cl={class:"text-right"},Pl={class:"text-right"},Ll={class:"text-right font-bold"},Rl={class:"text-right font-bold text-primary"},El={class:"text-center"},Ol=["onClick"],Ml={key:1,class:"text-base-content/50"},Nl={key:0,class:"modal modal-open"},Al={class:"modal-box max-w-7xl w-full"},Dl={class:"flex justify-between items-center mb-4"},Il={class:"font-bold text-lg"},jl={class:"flex justify-center bg-base-200 rounded-lg p-4"},Tl=["src","alt"],ql={class:"modal-action mt-4"},Fl=["href"],Ul=he({__name:"Winners",setup(n){const r=M(!0),s=M(null),t=M(""),a=M(!1),l=M(""),d=M(""),h=async()=>{r.value=!0,t.value="";try{const v=await ne.getTopSubmissions(5);v.data?s.value=v.data:v.error&&(t.value=v.error,console.error("Error fetching submissions:",v.error))}catch(v){t.value=v instanceof Error?v.message:"Failed to fetch submissions",console.error("Error fetching submissions:",v)}finally{r.value=!1}},p=v=>v!==void 0?v.toLocaleString():"—",w=te(()=>{if(!s.value)return[];const v=[];return s.value.submissions.forEach(o=>{o.submissions.forEach(m=>{v.push({puzzleName:o.puzzle_title,username:m.username,cost:m.final_cost,cycles:m.final_cycles,area:m.final_area,total:m.rank_points,totalCoef:m.total_coef,files:m.files.map(y=>({url:y.file_url,name:y.original_filename}))})})}),v}),k=(v,o)=>{l.value=v,d.value=o,a.value=!0},S=()=>{a.value=!1,l.value="",d.value=""};return we(()=>{h()}),(v,o)=>(i(),c(U,null,[e("div",bl,[e("div",yl,[o[5]||(o[5]=e("h2",{class:"card-title text-2xl flex items-center gap-2"},[e("i",{class:"mdi mdi-trophy text-yellow-500 text-3xl"}),E(" Top Submissions ")],-1)),r.value?(i(),c("div",_l,[...o[0]||(o[0]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(i(),c("div",xl,[o[1]||(o[1]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,g(t.value),1)])):w.value.length===0?(i(),c("div",wl,[...o[2]||(o[2]=[e("p",{class:"text-base-content/70"},"No results available yet.",-1)])])):(i(),c("div",kl,[e("table",zl,[o[4]||(o[4]=e("thead",null,[e("tr",null,[e("th",null,"Puzzle"),e("th",null,"User"),e("th",{class:"text-right"},"Cost"),e("th",{class:"text-right"},"Cycles"),e("th",{class:"text-right"},"Area"),e("th",{class:"text-right"},"Total Pts"),e("th",{class:"text-right"},"Total Coef"),e("th",{class:"text-center"},"GIF")])],-1)),e("tbody",null,[(i(!0),c(U,null,K(w.value,(m,y)=>(i(),c("tr",{key:y},[e("td",$l,g(m.puzzleName),1),e("td",null,g(m.username),1),e("td",Sl,g(p(m.cost)),1),e("td",Cl,g(p(m.cycles)),1),e("td",Pl,g(p(m.area)),1),e("td",Ll,g(p(m.total)),1),e("td",Rl,g(p(m.totalCoef)),1),e("td",El,[m.files.length>0?(i(),c("button",{key:0,onClick:x=>k(m.files[0].url,m.files[0].name),class:"btn btn-xs btn-primary gap-1"},[...o[3]||(o[3]=[e("i",{class:"mdi mdi-image"},null,-1),E(" View ",-1)])],8,Ol)):(i(),c("span",Ml,"—"))])]))),128))])])]))])]),a.value?(i(),c("div",Nl,[e("div",Al,[e("div",Dl,[e("h3",Il,g(d.value),1),e("button",{onClick:S,class:"btn btn-sm btn-circle btn-ghost"},[...o[6]||(o[6]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),e("div",jl,[e("img",{src:l.value,alt:d.value,class:"object-contain"},null,8,Tl)]),e("div",ql,[e("a",{href:l.value,target:"_blank",class:"btn btn-primary btn-sm"},[...o[7]||(o[7]=[e("i",{class:"mdi mdi-download"},null,-1),E(" Download ",-1)])],8,Fl),e("button",{onClick:S,class:"btn btn-sm"},"Close")])]),e("div",{class:"modal-backdrop",onClick:S})])):R("",!0)],64))}}),Bl={class:"card bg-base-100 shadow-lg"},Vl={class:"card-body"},Gl={key:0,class:"flex justify-center py-12"},Wl={key:1,class:"alert alert-error"},Hl={key:2,class:"text-center py-8"},Jl={key:3,class:"space-y-8"},Kl={class:"mb-4"},Yl={key:0,class:"bg-base-200 p-3 rounded-lg mb-4"},Zl={class:"grid grid-cols-3 gap-2"},Ql={class:"text-center"},Xl={class:"font-bold text-primary"},ei={class:"text-center"},ti={class:"font-bold text-primary"},si={class:"text-center"},ni={class:"font-bold text-primary"},oi={key:0,class:"overflow-x-auto"},ai={class:"table table-sm table-zebra"},ri={class:"text-center text-lg font-bold"},li={class:"font-semibold"},ii={class:"text-right"},ci={class:"text-right"},di={class:"text-right"},ui={class:"text-right font-bold text-primary"},fi={class:"text-center"},hi=["onClick"],mi={key:1,class:"text-base-content/50"},vi={key:1,class:"p-4 bg-base-200 rounded-lg text-center text-base-content/70"},gi={key:0,class:"modal modal-open"},pi={class:"modal-box max-w-7xl w-full"},bi={class:"flex justify-between items-center mb-4"},yi={class:"font-bold text-lg"},_i={class:"flex justify-center bg-base-200 rounded-lg p-4"},xi=["src","alt"],wi={class:"modal-action mt-4"},ki=["href"],zi=he({__name:"PuzzleResults",setup(n){const r=M(!0),s=M(null),t=M(""),a=M(!1),l=M(""),d=M(""),h=async()=>{r.value=!0,t.value="";try{const v=await ne.getPuzzleResults(5);v.data?s.value=v.data:v.error&&(t.value=v.error,console.error("Error fetching results:",v.error))}catch(v){t.value=v instanceof Error?v.message:"Failed to fetch results",console.error("Error fetching results:",v)}finally{r.value=!1}},p=v=>v!==void 0?v.toLocaleString():"—",w=(v,o)=>{l.value=v,d.value=o,a.value=!0},k=()=>{a.value=!1,l.value="",d.value=""},S=v=>["🥇","🥈","🥉"][v-1]||`#${v}`;return we(()=>{h()}),(v,o)=>(i(),c(U,null,[e("div",Bl,[e("div",Vl,[o[12]||(o[12]=e("h2",{class:"card-title text-2xl flex items-center gap-2"},[e("i",{class:"mdi mdi-table text-blue-500 text-3xl"}),E(" Results by Puzzle ")],-1)),r.value?(i(),c("div",Gl,[...o[0]||(o[0]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(i(),c("div",Wl,[o[1]||(o[1]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,g(t.value),1)])):!s.value||s.value.results.length===0?(i(),c("div",Hl,[...o[2]||(o[2]=[e("p",{class:"text-base-content/70"},"No results available yet.",-1)])])):(i(),c("div",Jl,[(i(!0),c(U,null,K(s.value.results,m=>(i(),c("div",{key:m.puzzle_id,class:"border-b pb-8 last:border-b-0"},[e("div",Kl,[m.points_factor?(i(),c("div",Yl,[o[9]||(o[9]=e("p",{class:"text-xs text-base-content/70 font-semibold mb-2"},"Points Coefficients",-1)),e("div",Zl,[e("div",Ql,[e("span",Xl,[o[3]||(o[3]=e("small",null,"x",-1)),E(g(m.points_factor.cost),1)]),o[4]||(o[4]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",ei,[e("span",ti,[o[5]||(o[5]=e("small",null,"x",-1)),E(g(m.points_factor.cycles),1)]),o[6]||(o[6]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",si,[e("span",ni,[o[7]||(o[7]=e("small",null,"x",-1)),E(g(m.points_factor.area),1)]),o[8]||(o[8]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):R("",!0)]),m.submissions.length>0?(i(),c("div",oi,[e("table",ai,[o[11]||(o[11]=e("thead",null,[e("tr",null,[e("th",{class:"w-12 text-center"},"Pos"),e("th",null,"User"),e("th",{class:"text-right"},"Cost"),e("th",{class:"text-right"},"Cycles"),e("th",{class:"text-right"},"Area"),e("th",{class:"text-right font-bold"},"Total Pts"),e("th",{class:"text-right font-bold"},"Total Coef"),e("th",{class:"text-center"},"GIF")])],-1)),e("tbody",null,[(i(!0),c(U,null,K(m.submissions,y=>(i(),c("tr",{key:`${m.puzzle_id}-${y.user_id}`},[e("td",ri,g(S(y.rank)),1),e("td",li,g(y.username),1),e("td",ii,g(p(y.final_cost)),1),e("td",ci,g(p(y.final_cycles)),1),e("td",di,g(p(y.final_area)),1),e("td",{class:ae(["text-right font-bold",{"text-yellow-600":y.rank===1,"text-gray-600":y.rank===2,"text-orange-600":y.rank===3}])},g(p(y.rank_points)),3),e("td",ui,g(p(y.total_coef)),1),e("td",fi,[y.files.length>0?(i(),c("button",{key:0,onClick:x=>w(y.files[0].file_url,y.files[0].original_filename),class:"btn btn-xs btn-primary gap-1"},[...o[10]||(o[10]=[e("i",{class:"mdi mdi-image"},null,-1),E(" View ",-1)])],8,hi)):(i(),c("span",mi,"—"))])]))),128))])])])):(i(),c("div",vi," No submissions yet "))]))),128))]))])]),a.value?(i(),c("div",gi,[e("div",pi,[e("div",bi,[e("h3",yi,g(d.value),1),e("button",{onClick:k,class:"btn btn-sm btn-circle btn-ghost"},[...o[13]||(o[13]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),e("div",_i,[e("img",{src:l.value,alt:d.value,class:"object-contain"},null,8,xi)]),e("div",wi,[e("a",{href:l.value,target:"_blank",class:"btn btn-primary btn-sm"},[...o[14]||(o[14]=[e("i",{class:"mdi mdi-download"},null,-1),E(" Download ",-1)])],8,ki),e("button",{onClick:k,class:"btn btn-sm"},"Close")])]),e("div",{class:"modal-backdrop",onClick:k})])):R("",!0)],64))}});function qt(n,r){return Gt()?(Wt(n,r),!0):!1}const Ft=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;function $i(n,r=1e3,s={}){const{immediate:t=!0,immediateCallback:a=!1}=s;let l=null;const d=Jt(!1);function h(){l&&(clearInterval(l),l=null)}function p(){d.value=!1,h()}function w(){const k=$e(r);k<=0||(d.value=!0,a&&n(),h(),d.value&&(l=setInterval(n,k)))}return t&&Ft&&w(),(ge(r)||typeof r=="function")&&qt(Ce(r,()=>{d.value&&Ft&&w()})),qt(p),{isActive:bs(d),pause:p,resume:w}}function Si(n,r){var s,t;const a=Jt($e(n)),l=$i(()=>{var k;const S=a.value-1;if(a.value=S<0?0:S,r==null||(k=r.onTick)===null||k===void 0||k.call(r),a.value<=0){var v;l.pause(),r==null||(v=r.onComplete)===null||v===void 0||v.call(r)}},(s=r?.interval)!==null&&s!==void 0?s:1e3,{immediate:(t=r?.immediate)!==null&&t!==void 0?t:!1}),d=k=>{var S;a.value=(S=$e(k))!==null&&S!==void 0?S:$e(n)},h=()=>{l.pause(),d()},p=()=>{l.isActive.value||a.value>0&&l.resume()};return{remaining:a,reset:d,stop:h,start:k=>{d(k),l.resume()},pause:l.pause,resume:p,isActive:l.isActive}}const Ci={class:"min-h-screen bg-base-200"},Pi={class:"navbar bg-base-100 shadow-lg"},Li={class:"container min-w-3/4 mx-auto w-full flex items-center gap-4"},Ri={class:"flex items-center gap-4"},Ei={key:0,class:"flex items-center gap-2"},Oi={class:"text-sm"},Mi={class:"font-medium"},Ni={key:0,class:"badge badge-warning badge-xs ml-1"},Ai={key:1,class:"text-sm text-base-content/70"},Di={class:"container min-w-3/4 mx-auto px-4 py-8"},Ii={key:0,class:"flex justify-center"},ji={class:"text-center"},Ti={class:"mb-6 text-base-content/70"},qi={key:1,class:"flex justify-center items-center min-h-[400px]"},Fi={key:2,class:"alert alert-error max-w-2xl mx-auto"},Ui={class:"text-sm"},Bi={key:3,class:"space-y-8"},Vi={key:0,class:"space-y-8"},Gi={class:"mb-8"},Wi={class:"card bg-base-100 shadow-lg"},Hi={class:"card-body"},Ji={class:"card-title text-2xl"},Ki={class:"text-base-content/70"},Yi={class:"flex flex-wrap gap-4 mt-4"},Zi=["disabled"],Qi={key:0,class:"alert alert-warning mt-4"},Xi={key:0},ec={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"},tc={key:1,class:"text-center py-12"},sc={key:0,class:"modal modal-open"},nc={class:"modal-box max-w-6xl"},oc={class:"flex justify-between items-center mb-4"},ac=he({__name:"OpusMagnum",props:{collectionTitle:{},collectionUrl:{},collectionDescription:{}},setup(n){const r=n,s=Le(),t=lt(),{submissions:a,isSubmissionModalOpen:l}=rt(t),{openSubmissionModal:d,loadSubmissions:h,closeSubmissionModal:p}=t,w=M(null),k=M(null),S=M(!0),v=M(""),o=te(()=>w.value?.is_superuser||!1),m=te(()=>!!(k.value&&!k.value.accepting_submissions)),y=te(()=>{const F={};return a.value.forEach(C=>{C.responses.forEach(L=>{F[L.puzzle_id]||(F[L.puzzle_id]=[]),F[L.puzzle_id].push(L)})}),F});async function x(){try{S.value=!0,v.value="",console.log("Starting data load..."),console.log("Loading user info...");const F=await ne.getUserInfo();F.data?(w.value=F.data,console.log("User info loaded:",F.data)):F.error&&console.warn("User info error:",F.error),console.log("Loading collection...");const C=await ne.getCollection();C.data?(k.value=C.data,console.log("Collection loaded:",C.data)):C.error&&console.warn("Collection error:",C.error),console.log("Loading puzzles..."),await s.loadPuzzles(),console.log("Puzzles loaded:",s.puzzles.length),console.log("Loading submissions..."),await h(),console.log("Submissions loaded:",a.value.length),console.log("Data load complete!")}catch(F){v.value=Xt.getErrorMessage(F),console.error("Failed to load data:",F)}finally{S.value=!1,console.log("Loading state set to false")}w.value?.is_superuser&&f()}const{remaining:u,start:f}=Si(60,{onComplete(){x()}});we(async()=>{await x()});const b=F=>s.findPuzzleByName(F),O=()=>{window.location.reload()},D=()=>{window.location.href="/"};return(F,C)=>(i(),c("div",Ci,[e("div",Pi,[e("div",Li,[e("button",{onClick:D,class:"btn btn-primary btn-sm"},[...C[3]||(C[3]=[e("i",{class:"mdi mdi-arrow-left"},null,-1),E(" Back ",-1)])]),C[6]||(C[6]=e("h1",{class:"text-xl font-bold"},"Opus Magnum Puzzle Submitter",-1)),C[7]||(C[7]=e("div",{class:"flex-1"},null,-1)),e("div",Ri,[w.value?.is_authenticated?(i(),c("div",Ei,[e("div",Oi,[e("span",Mi,g(w.value.username),1),w.value.is_superuser?(i(),c("span",Ni,"Admin")):R("",!0)])])):(i(),c("div",Ai,"Not logged in")),C[4]||(C[4]=e("a",{href:"/api/docs",class:"btn btn-xs"},"API docs",-1)),C[5]||(C[5]=e("a",{href:"/admin",class:"btn btn-xs btn-warning"},"Admin panel",-1))])])]),e("div",Di,[w.value?.is_superuser?(i(),c("div",Ii,[e("div",ji,[e("p",Ti,[C[8]||(C[8]=e("span",{class:"loading loading-spinner loading-lg"},null,-1)),E(" Auto reload page in "+g(q(u))+" seconds ... ",1)])])])):R("",!0),S.value?(i(),c("div",qi,[...C[9]||(C[9]=[e("div",{class:"text-center"},[e("span",{class:"loading loading-spinner loading-lg"}),e("p",{class:"mt-4 text-base-content/70"},"Loading puzzles...")],-1)])])):v.value?(i(),c("div",Fi,[C[12]||(C[12]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,[C[10]||(C[10]=e("h3",{class:"font-bold"},"Error Loading Data",-1)),e("div",Ui,g(v.value),1)]),e("button",{onClick:O,class:"btn btn-sm btn-outline"},[...C[11]||(C[11]=[e("i",{class:"mdi mdi-refresh mr-1"},null,-1),E(" Retry ",-1)])])])):(i(),c("div",Bi,[m.value?(i(),c("div",Vi,[fe(Ul),fe(zi)])):(i(),c(U,{key:1},[e("div",Gi,[e("div",Wi,[e("div",Hi,[e("h2",Ji,g(r.collectionTitle),1),e("p",Ki,g(r.collectionDescription),1),e("div",Yi,[e("button",{onClick:C[0]||(C[0]=(...L)=>q(d)&&q(d)(...L)),class:"btn btn-primary",disabled:m.value},[...C[13]||(C[13]=[e("i",{class:"mdi mdi-plus mr-2"},null,-1),E(" Submit Solution ",-1)])],8,Zi)]),m.value?(i(),c("div",Qi,[...C[14]||(C[14]=[e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1),e("div",null,[e("h3",{class:"font-bold"},"Tournament Closed"),e("div",{class:"text-sm"},"This tournament is no longer accepting new submissions.")],-1)])])):R("",!0)])])]),fe(pl),o.value?(i(),c("div",Xi,[fe(Oa)])):R("",!0),e("div",ec,[(i(!0),c(U,null,K(q(s).puzzles,L=>(i(),ys(un,{key:L.id,puzzle:L,responses:y.value[L.id]||[]},null,8,["puzzle","responses"]))),128))]),q(s).puzzles.length===0?(i(),c("div",tc,[...C[15]||(C[15]=[e("div",{class:"text-6xl mb-4"},"🧩",-1),e("h3",{class:"text-xl font-bold mb-2"},"No Puzzles Available",-1),e("p",{class:"text-base-content/70"}," Check back later for new puzzle collections! ",-1)])])):R("",!0)],64))]))]),q(l)?(i(),c("div",sc,[e("div",nc,[e("div",oc,[C[17]||(C[17]=e("h3",{class:"font-bold text-lg"},"Submit Solution",-1)),e("button",{onClick:C[1]||(C[1]=(...L)=>q(p)&&q(p)(...L)),class:"btn btn-sm btn-circle btn-ghost"},[...C[16]||(C[16]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),fe(Uo,{puzzles:q(s).puzzles,"find-puzzle-by-name":b},null,8,["puzzles"])]),e("div",{class:"modal-backdrop",onClick:C[2]||(C[2]=(...L)=>q(p)&&q(p)(...L))})])):R("",!0)]))}}),rc=xs(),os="#app",lc=document.querySelector(os),as=_s(ac,{...lc?.dataset});as.use(rc);as.mount(os);
|