const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/jszip.min-Du5pcDB6.js","assets/index-DuuohOak.js","assets/index-cCOeofBN.css"])))=>i.map(i=>d[i]); import{j as t,z as j,n as N,v as De,w as Oe,x as Le,B as Me,r,D as Re,N as Je,_ as ge,L as ze,F as We,G as Ue}from"./index-DuuohOak.js";import{u as Be}from"./useAdmin-Cd7hRYKP.js";import{F as Ae,E as He}from"./ExportModal-B89pVxH6.js";const Ve="_paginatorContainer_1l5ti_1",Ge="_paginationControls_1l5ti_19",pe={paginatorContainer:Ve,paginationControls:Ge};function Ze({currentPage:_,totalPages:p,onPageChange:T,className:z=""}){if(p<=1)return null;const u=(()=>{const f=[];if(p<=5)for(let h=1;h<=p;h++)f.push(h);else{let h=Math.max(1,_-2);const v=Math.min(p,h+5-1);v===p&&(h=Math.max(1,v-5+1));for(let b=h;b<=v;b++)f.push(b)}return f})();return t.jsx("div",{className:`${pe.paginatorContainer} ${z}`,children:t.jsxs("div",{className:pe.paginationControls,children:[t.jsx(j,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsxs(N,{name:"prev-page",variant:"tertiary",size:1,onClick:()=>T(Math.max(1,_-1)),disabled:_===1,title:"Previous page",children:[t.jsx(De,{className:"w-4 h-4"}),t.jsx("span",{className:"hidden sm:inline",children:"Previous"})]})}),t.jsxs("div",{className:"flex items-center gap-1",children:[u[0]>1&&t.jsxs(t.Fragment,{children:[t.jsx(j,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsx(N,{name:"page-1",variant:"tertiary",size:1,onClick:()=>T(1),children:"1"})}),u[0]>2&&t.jsx(j,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsx("span",{className:"px-2 text-gray-500",children:"..."})})]}),u.map(f=>t.jsx(j,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsx(N,{name:`page-${f}`,variant:_===f?"primary":"tertiary",size:1,onClick:()=>T(f),children:f})},f)),u[u.length-1]
T(p),children:p})})]})]}),t.jsx(j,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsxs(N,{name:"next-page",variant:"tertiary",size:1,onClick:()=>T(Math.min(p,_+1)),disabled:_===p,title:"Next page",children:[t.jsx("span",{className:"hidden sm:inline",children:"Next"}),t.jsx(Oe,{className:"w-4 h-4"})]})})]})})}const qe="_tabSelector_o9y1f_1",Ke="_metadataTags_o9y1f_8",Qe="_metadataTag_o9y1f_8",Xe="_metadataTagSource_o9y1f_32",Ye="_metadataTagType_o9y1f_43",et="_mapItem_o9y1f_54",tt="_mapItemImage_o9y1f_72",at="_mapItemContent_o9y1f_92",st="_mapItemTitle_o9y1f_97",it="_mapItemMetadata_o9y1f_105",nt="_fullSizeModalOverlay_o9y1f_134",lt="_fullSizeModalContent_o9y1f_148",rt="_ratingWarningContent_o9y1f_159",ot="_ratingWarningTitle_o9y1f_165",ct="_ratingWarningText_o9y1f_172",dt="_ratingWarningButtons_o9y1f_179",m={tabSelector:qe,metadataTags:Ke,metadataTag:Qe,metadataTagSource:Xe,metadataTagType:Ye,mapItem:et,mapItemImage:tt,mapItemContent:at,mapItemTitle:st,mapItemMetadata:it,fullSizeModalOverlay:nt,fullSizeModalContent:lt,ratingWarningContent:rt,ratingWarningTitle:ot,ratingWarningText:ct,ratingWarningButtons:dt};function ut(){const _=Le(),p=Me(),{isAuthenticated:T}=Be(),[z,te]=r.useState("explore"),[u,f]=r.useState([]),{search:I,srcFilter:h,catFilter:v,regionFilter:b,countryFilter:P,imageTypeFilter:D,uploadTypeFilter:O,showReferenceExamples:w,setShowReferenceExamples:ue}=Re(),[A,fe]=r.useState([]),[H,he]=r.useState([]),[ae,xe]=r.useState([]),[_e,ye]=r.useState([]),[se,je]=r.useState([]),[Ne,ie]=r.useState(!0),[L,ne]=r.useState(!0),[ve,V]=r.useState(!1),[be,G]=r.useState(!1),[we,Z]=r.useState(!1),[q,K]=r.useState(null),[Se,W]=r.useState(!1),[U,le]=r.useState(""),[Q,re]=r.useState(!1),[X,oe]=r.useState(1),[B]=r.useState(10),[Y,ce]=r.useState(0),[Te,de]=r.useState(0),Ie=[{key:"explore",label:"List"},{key:"mapDetails",label:"Carousel"}],M=r.useCallback(()=>{ne(!0),K(null);const e=new URLSearchParams({page:X.toString(),limit:B.toString(),include_count:"true"});I&&e.append("search",I),h&&e.append("source",h),v&&e.append("event_type",v),b&&e.append("region",b),P&&e.append("country",P),D&&e.append("image_type",D),O&&e.append("upload_type",O),w&&e.append("starred_only","true"),fetch(`/api/images/grouped?${e.toString()}`).then(s=>{if(!s.ok)throw new Error(`Failed to fetch images: ${s.status} ${s.statusText}`);return s.json()}).then(s=>{if(console.log("ExplorePage: Fetched captions:",s),s.items&&typeof s.total_count=="number")f(s.items),ce(s.total_count),de(Math.ceil(s.total_count/B));else if(Array.isArray(s))f(s);else throw new Error("Unexpected response format");K(null)}).catch(s=>{console.error("ExplorePage: Error fetching captions:",s),K(s instanceof Error?s.message:"Failed to load images. Please try again later."),f([]),ce(0),de(0)}).finally(()=>{ne(!1)})},[X,I,h,v,b,P,D,O,w,B]);r.useEffect(()=>{M()},[M]),r.useEffect(()=>{oe(1)},[I,h,v,b,P,D,O,w]),r.useEffect(()=>{const e=()=>{document.hidden||M()};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[M]),r.useEffect(()=>{new URLSearchParams(p.search).get("export")==="true"&&(V(!0),_("/explore",{replace:!0}))},[p.search,_,I,h,v,b,P,D,w]),r.useEffect(()=>{ie(!0),Promise.all([fetch("/api/sources").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()}),fetch("/api/types").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()}),fetch("/api/regions").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()}),fetch("/api/countries").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()}),fetch("/api/image-types").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()})]).then(([e,s,d,E,C])=>{fe(e),he(s),xe(d),ye(E),je(C)}).catch(()=>{}).finally(()=>{ie(!1)})},[]);const S=u,Ee=async(e,s="fine-tuning")=>{if(e.length===0){alert("No images to export");return}G(!0),Z(!1);try{const d=(await Ue(async()=>{const{default:i}=await import("./jszip.min-Du5pcDB6.js").then($=>$.j);return{default:i}},__vite__mapDeps([0,1,2]))).default,E=new d,C=e.filter(i=>i.image_type==="crisis_map"),R=e.filter(i=>i.image_type==="drone_image");if(C.length>0){const i=E.folder("crisis_maps_dataset"),$=i?.folder("images");if($){let F=1;for(const a of C)try{const y=a.image_count&&a.image_count>1?a.all_image_ids||[a.image_id]:[a.image_id],ee=y.map(async(n,x)=>{try{const l=await fetch(`/api/images/${n}/file`);if(!l.ok)throw new Error(`Failed to fetch image ${n}`);const o=await l.blob(),c=a.file_key.split(".").pop()||"jpg",g=`${String(F).padStart(4,"0")}_${String(x+1).padStart(2,"0")}.${c}`;return $.file(g,o),{success:!0,fileName:g,imageId:n}}catch(l){return console.error(`Failed to process image ${n}:`,l),{success:!1,fileName:"",imageId:n}}}),k=(await Promise.all(ee)).filter(n=>n.success);if(k.length>0){if(s==="fine-tuning"){const n=k.map(o=>`images/${o.fileName}`),x=Math.random(),l={image:n.length===1?n[0]:n,caption:a.edited||a.generated||"",metadata:{image_id:y,title:a.title,source:a.source,event_type:a.event_type,image_type:a.image_type,countries:a.countries,starred:a.starred,image_count:a.image_count||1}};if(!i)continue;if(x<.8){const o=i.file("train.jsonl");if(o){const c=await o.async("string").then(g=>JSON.parse(g||"[]")).catch(()=>[]);c.push(l),i.file("train.jsonl",JSON.stringify(c,null,2))}else i.file("train.jsonl",JSON.stringify([l],null,2))}else if(x<.9){const o=i.file("test.jsonl");if(o){const c=await o.async("string").then(g=>JSON.parse(g||"[]")).catch(()=>[]);c.push(l),i.file("test.jsonl",JSON.stringify(c,null,2))}else i.file("test.jsonl",JSON.stringify([l],null,2))}else{const o=i.file("val.jsonl");if(o){const c=await o.async("string").then(g=>JSON.parse(g||"[]")).catch(()=>[]);c.push(l),i.file("val.jsonl",JSON.stringify(c,null,2))}else i.file("val.jsonl",JSON.stringify([l],null,2))}}else{const n=k.map(l=>`images/${l.fileName}`),x={image:n.length===1?n[0]:n,caption:a.edited||a.generated||"",metadata:{image_id:y,title:a.title,source:a.source,event_type:a.event_type,image_type:a.image_type,countries:a.countries,starred:a.starred,image_count:a.image_count||1}};i&&i.file(`${String(F).padStart(4,"0")}.json`,JSON.stringify(x,null,2))}F++}}catch(y){console.error(`Failed to process caption ${a.image_id}:`,y)}}}if(R.length>0){const i=E.folder("drone_images_dataset"),$=i?.folder("images");if($){let F=1;for(const a of R)try{const y=a.image_count&&a.image_count>1?a.all_image_ids||[a.image_id]:[a.image_id],ee=y.map(async(n,x)=>{try{const l=await fetch(`/api/images/${n}/file`);if(!l.ok)throw new Error(`Failed to fetch image ${n}`);const o=await l.blob(),c=a.file_key.split(".").pop()||"jpg",g=`${String(F).padStart(4,"0")}_${String(x+1).padStart(2,"0")}.${c}`;return $.file(g,o),{success:!0,fileName:g,imageId:n}}catch(l){return console.error(`Failed to process image ${n}:`,l),{success:!1,fileName:"",imageId:n}}}),k=(await Promise.all(ee)).filter(n=>n.success);if(k.length>0){if(s==="fine-tuning"){const n=k.map(o=>`images/${o.fileName}`),x=Math.random(),l={image:n.length===1?n[0]:n,caption:a.edited||a.generated||"",metadata:{image_id:y,title:a.title,source:a.source,event_type:a.event_type,image_type:a.image_type,countries:a.countries,starred:a.starred,image_count:a.image_count||1}};if(!i)continue;if(x<.8){const o=i.file("train.jsonl");if(o){const c=await o.async("string").then(g=>JSON.parse(g||"[]")).catch(()=>[]);c.push(l),i.file("train.jsonl",JSON.stringify(c,null,2))}else i.file("train.jsonl",JSON.stringify([l],null,2))}else if(x<.9){const o=i.file("test.jsonl");if(o){const c=await o.async("string").then(g=>JSON.parse(g||"[]")).catch(()=>[]);c.push(l),i.file("test.jsonl",JSON.stringify(c,null,2))}else i.file("test.jsonl",JSON.stringify([l],null,2))}else{const o=i.file("val.jsonl");if(o){const c=await o.async("string").then(g=>JSON.parse(g||"[]")).catch(()=>[]);c.push(l),i.file("val.jsonl",JSON.stringify(c,null,2))}else i.file("val.jsonl",JSON.stringify([l],null,2))}}else{const n=k.map(l=>`images/${l.fileName}`),x={image:n.length===1?n[0]:n,caption:a.edited||a.generated||"",metadata:{image_id:y,title:a.title,source:a.source,event_type:a.event_type,image_type:a.image_type,countries:a.countries,starred:a.starred,image_count:a.image_count||1}};i&&i.file(`${String(F).padStart(4,"0")}.json`,JSON.stringify(x,null,2))}F++}}catch(y){console.error(`Failed to process caption ${a.image_id}:`,y)}}}const Fe=await E.generateAsync({type:"blob"}),me=URL.createObjectURL(Fe),J=document.createElement("a");J.href=me,J.download=`datasets_${s}_${new Date().toISOString().split("T")[0]}.zip`,document.body.appendChild(J),J.click(),document.body.removeChild(J),URL.revokeObjectURL(me);const ke=(C.length||0)+(R.length||0);console.log(`Exported ${s} datasets with ${ke} total images:`),C.length>0&&console.log(`- Crisis maps: ${C.length} images`),R.length>0&&console.log(`- Drone images: ${R.length} images`),Z(!0)}catch(d){console.error("Export failed:",d),alert("Failed to export dataset. Please try again.")}finally{G(!1)}},Ce=e=>{le(e),W(!0)},$e=async()=>{if(U){re(!0);try{console.log("Deleting image with ID:",U),(await fetch(`/api/images/${U}`,{method:"DELETE"})).ok?(f(s=>s.filter(d=>d.image_id!==U)),W(!1),le("")):(console.error("Delete failed"),alert("Failed to delete image. Please try again."))}catch(e){console.error("Delete failed:",e),alert("Failed to delete image. Please try again.")}finally{re(!1)}}};return t.jsxs(Je,{children:[L?t.jsx("div",{className:"flex flex-col items-center justify-center min-h-[60vh]",children:t.jsxs("div",{className:"flex flex-col items-center gap-4",children:[t.jsx(ge,{className:"text-ifrcRed"}),t.jsx("div",{children:"Loading examples..."})]})}):t.jsxs("div",{className:"max-w-7xl mx-auto",children:[t.jsxs("div",{className:m.tabSelector,children:[t.jsx(ze,{name:"explore-view",value:z,onChange:e=>{(e==="explore"||e==="mapDetails")&&(te(e),e==="mapDetails"&&u.length>0&&(u[0]?.image_id&&u[0].image_id!=="undefined"&&u[0].image_id!=="null"?_(`/map/${u[0].image_id}`):console.error("Invalid image_id for navigation:",u[0]?.image_id)))},options:Ie,keySelector:e=>e.key,labelSelector:e=>e.label}),t.jsxs("div",{className:"flex items-center gap-2 ml-auto",children:[t.jsx(j,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsxs(N,{name:"reference-examples",variant:w?"primary":"secondary",onClick:()=>ue(!w),className:"whitespace-nowrap",children:[t.jsx("span",{className:"mr-2",children:w?t.jsx("span",{className:"text-yellow-400",children:"★"}):t.jsx("span",{className:"text-yellow-400",children:"☆"})}),"Reference Examples"]})}),t.jsx(N,{name:"export-dataset",variant:"secondary",onClick:()=>V(!0),children:"Export"})]})]}),z==="explore"?t.jsxs("div",{className:"space-y-6",children:[t.jsx("div",{className:"mb-6 space-y-4",children:t.jsx("div",{className:"flex flex-wrap items-center gap-4",children:t.jsx(j,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2 flex-1 min-w-[300px]",children:t.jsx(Ae,{sources:A,types:H,regions:ae,countries:_e,imageTypes:se,isLoadingFilters:Ne})})})}),t.jsxs("div",{className:"space-y-4",children:[t.jsx("div",{className:"flex justify-between items-center",children:t.jsxs("p",{className:"text-sm text-gray-600",children:[S.length," of ",Y," examples"]})}),L&&t.jsx("div",{className:"text-center py-12",children:t.jsxs("div",{className:"flex flex-col items-center gap-4",children:[t.jsx(ge,{className:"text-ifrcRed"}),t.jsx("div",{children:"Loading examples..."})]})}),!L&&q&&t.jsx("div",{className:"text-center py-12",children:t.jsx(j,{withInternalPadding:!0,className:"bg-red-50 border border-red-200 rounded-md max-w-2xl mx-auto",children:t.jsxs("div",{className:"flex flex-col items-center gap-4",children:[t.jsx("div",{className:"text-red-800 font-semibold text-lg",children:"Failed to Load Images"}),t.jsx("div",{className:"text-red-700",children:q}),t.jsx(N,{name:"retry-fetch",variant:"primary",onClick:()=>M(),children:"Retry"})]})})}),!L&&!q&&t.jsxs("div",{className:"space-y-4",children:[S.map(e=>t.jsxs("div",{className:"flex items-center gap-4",children:[t.jsxs("div",{className:`${m.mapItem} flex-1`,onClick:()=>{console.log("ExplorePage: Clicking on image with ID:",e.image_id),console.log("ExplorePage: Image data:",e),e.image_id&&e.image_id!=="undefined"&&e.image_id!=="null"?(console.log("ExplorePage: Navigating to:",`/map/${e.image_id}`),console.log("ExplorePage: Full navigation URL:",`/#/map/${e.image_id}`),_(`/map/${e.image_id}`)):(console.error("Invalid image_id for navigation:",e.image_id),console.error("Full item data:",JSON.stringify(e,null,2)),alert(`Cannot navigate: Invalid image ID (${e.image_id})`))},children:[t.jsx("div",{className:m.mapItemImage,style:{width:"120px",height:"80px"},children:e.thumbnail_url?t.jsxs(t.Fragment,{children:[console.log("ExplorePage: Using thumbnail for fast loading:",e.thumbnail_url),t.jsx("img",{src:e.thumbnail_url,alt:e.file_key,onError:s=>{console.error("ExplorePage: Thumbnail failed to load, falling back to original:",e.thumbnail_url);const d=s.target;e.image_url?d.src=e.image_url:(d.style.display="none",d.parentElement.innerHTML="Img")},onLoad:()=>console.log("ExplorePage: Thumbnail loaded successfully:",e.thumbnail_url)})]}):e.image_url?t.jsxs(t.Fragment,{children:[console.log("ExplorePage: No thumbnail available, using original image:",e.image_url),t.jsx("img",{src:e.image_url,alt:e.file_key,onError:s=>{console.error("ExplorePage: Original image failed to load:",e.image_url);const d=s.target;d.style.display="none",d.parentElement.innerHTML="Img"},onLoad:()=>console.log("ExplorePage: Original image loaded successfully:",e.image_url)})]}):t.jsxs(t.Fragment,{children:[console.log("ExplorePage: No image_url or thumbnail provided for item:",e),"'Img'"]})}),t.jsxs("div",{className:m.mapItemContent,children:[t.jsx("h3",{className:m.mapItemTitle,children:t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{children:e.title||"Untitled"}),e.starred&&t.jsx("span",{className:"text-red-500 text-lg",title:"Starred image",children:"★"})]})}),t.jsx("div",{className:m.mapItemMetadata,children:t.jsxs("div",{className:m.metadataTags,children:[e.image_type!=="drone_image"&&t.jsx("span",{className:m.metadataTagSource,children:e.source&&e.source.includes(", ")?e.source.split(", ").map(s=>A.find(d=>d.s_code===s.trim())?.label||s.trim()).join(", "):A.find(s=>s.s_code===e.source)?.label||e.source}),t.jsx("span",{className:m.metadataTagType,children:e.event_type&&e.event_type.includes(", ")?e.event_type.split(", ").map(s=>H.find(d=>d.t_code===s.trim())?.label||s.trim()).join(", "):H.find(s=>s.t_code===e.event_type)?.label||e.event_type}),t.jsx("span",{className:m.metadataTag,children:se.find(s=>s.image_type===e.image_type)?.label||e.image_type}),e.image_count&&e.image_count>1&&t.jsxs("span",{className:m.metadataTag,title:`Multi-upload with ${e.image_count} images`,children:["📷 ",e.image_count]}),(!e.image_count||e.image_count<=1)&&t.jsx("span",{className:m.metadataTag,title:"Single Upload",children:"Single"}),e.countries&&e.countries.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:m.metadataTag,children:ae.find(s=>s.r_code===e.countries[0].r_code)?.label||"Unknown Region"}),t.jsx("span",{className:m.metadataTag,children:e.countries.map(s=>s.label).join(", ")})]})]})})]})]}),T&&t.jsx(j,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsx(N,{name:`delete-${e.image_id}`,variant:"tertiary",size:1,className:"bg-red-50 hover:bg-red-100 text-red-700 border border-red-200 hover:border-red-300",onClick:()=>Ce(e.image_id),title:"Delete","aria-label":"Delete saved image",children:t.jsx(We,{className:"w-4 h-4"})})})]},e.image_id)),!S.length&&t.jsx("div",{className:"text-center py-12",children:t.jsx("p",{className:"text-gray-500",children:"No examples found."})}),!L&&S.length>0&&t.jsx(Ze,{currentPage:X,totalPages:Te,totalItems:Y,itemsPerPage:B,onPageChange:oe})]})]})]}):t.jsx("div",{className:"space-y-6",children:t.jsxs("div",{className:"text-center py-12",children:[t.jsx("p",{className:"text-gray-500",children:"Map Details view coming soon..."}),t.jsx("p",{className:"text-sm text-gray-400 mt-2",children:"This will show detailed information about individual maps"})]})})]}),Se&&t.jsx("div",{className:m.fullSizeModalOverlay,onClick:()=>W(!1),children:t.jsx("div",{className:m.fullSizeModalContent,onClick:e=>e.stopPropagation(),children:t.jsxs("div",{className:m.ratingWarningContent,children:[t.jsx("h3",{className:m.ratingWarningTitle,children:"Delete Image?"}),t.jsx("p",{className:m.ratingWarningText,children:"This action cannot be undone. Are you sure you want to delete this saved image and all related data?"}),t.jsxs("div",{className:m.ratingWarningButtons,children:[t.jsx(N,{name:"confirm-delete",variant:"secondary",onClick:$e,disabled:Q,children:Q?"Deleting...":"Delete"}),t.jsx(N,{name:"cancel-delete",variant:"tertiary",onClick:()=>W(!1),disabled:Q,children:"Cancel"})]})]})})}),t.jsx(He,{isOpen:ve,onClose:()=>{V(!1),Z(!1),G(!1)},onExport:(e,s)=>{const d=S.filter(E=>s.includes(E.image_type));Ee(d,e)},filteredCount:S.length,totalCount:Y,hasFilters:!!(I||h||v||b||P||D||O||w),crisisMapsCount:S.filter(e=>e.image_type==="crisis_map").length,droneImagesCount:S.filter(e=>e.image_type==="drone_image").length,isLoading:be,exportSuccess:we})]})}export{ut as default};