function e(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}var t={read:function(e){return e[0]===`"`&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}};function n(t,r){function i(n,i,a){if(!(typeof document>`u`)){a=e({},r,a),typeof a.expires==`number`&&(a.expires=new Date(Date.now()+a.expires*864e5)),a.expires&&=a.expires.toUTCString(),n=encodeURIComponent(n).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var o=``;for(var s in a)a[s]&&(o+=`; `+s,a[s]!==!0&&(o+=`=`+a[s].split(`;`)[0]));return document.cookie=n+`=`+t.write(i,n)+o}}function a(e){if(!(typeof document>`u`||arguments.length&&!e)){for(var n=document.cookie?document.cookie.split(`; `):[],r={},i=0;i<n.length;i++){var a=n[i].split(`=`),o=a.slice(1).join(`=`);try{var s=decodeURIComponent(a[0]);if(r[s]=t.read(o,s),e===s)break}catch{}}return e?r[e]:r}}return Object.create({set:i,get:a,remove:function(t,n){i(t,``,e({},n,{expires:-1}))},withAttributes:function(t){return n(this.converter,e({},this.attributes,t))},withConverter:function(t){return n(e({},this.converter,t),this.attributes)}},{attributes:{value:Object.freeze(r)},converter:{value:Object.freeze(t)}})}var r=n(t,{path:`/`}),i={NODE_ENV:`production`,REACT_APP_ENV:`development`,IS_DEVELOPMENT:!1,IS_PRODUCTION:!0},a={API_GATEWAY:{URL:`https://api.reload-airsoft.fr`,VERSION:`/api/v1`,HEALTH:`http://localhost:8084/health`}},o={EVENTS:{BASE:`${a.API_GATEWAY.URL}${a.API_GATEWAY.VERSION}/events`,LIST:`/events`,BY_ID:e=>`/events/${e}`,CREATE:`/events`,UPDATE:e=>`/events/${e}`,DELETE:e=>`/events/${e}`},BOOKINGS:{BASE:`${a.API_GATEWAY.URL}${a.API_GATEWAY.VERSION}/events`,BOOK:e=>`/events/${e}/register`,CANCEL:e=>`/events/${e}/unregister`,PARTICIPANTS:e=>`/events/${e}/participants`,WAITING_LIST:e=>`/events/${e}/waiting-list`},PAYMENTS:{BASE:`${a.API_GATEWAY.URL}${a.API_GATEWAY.VERSION}/payments`,BY_ID:e=>`/payments/${e}`,CONFIRM:e=>`/payments/${e}/confirm`,REFUND:e=>`/payments/${e}/refund`,STATUS:e=>`/payments/${e}/status`,DONATIONS:`/payments/donations`,USER_PAYMENTS:e=>`/users/${e}/payments`},AUTH:{BASE:`${a.API_GATEWAY.URL}${a.API_GATEWAY.VERSION}/users`,LOGIN:`/login`,REGISTER:`/register`,REFRESH_TOKEN:`/refresh-token`,LOGOUT:`/logout`}},s={TIMEOUTS:{DEFAULT:3e4,AUTH:1e4,UPLOAD:12e4},RETRY:{MAX_RETRIES:3,DELAY:1e3},CACHE:{EVENTS_TTL:3e5,AUTO_REFRESH_INTERVAL:6e4,FORCE_REFRESH_INTERVAL:18e5}},c={COOKIE_NAME:`JWT-Reload-airsoft`,REFRESH_COOKIE_NAME:`refresh-token-reload`,EXPIRY_DAYS:30,REFRESH_INTERVAL:3e5,SECURE_COOKIES:!1,SAME_SITE:`lax`};`image/jpeg,image/png,image/webp,image/gif`.split(`,`);var l={NOMINATIM_URL:`https://nominatim.openstreetmap.org`,USER_AGENT:`ReloadAirsoft/1.0`,COUNTRY_CODES:`fr`},u={ENABLED:!1,LOG_LEVEL:`info`,DEVTOOLS:!1},d={API_BASE:`${a.API_GATEWAY.URL}${a.API_GATEWAY.VERSION}`,PROD_API_BASE:`https://api.reload-airsoft.fr${a.API_GATEWAY.VERSION}`},f=(e=``)=>`${i.IS_PRODUCTION?d.PROD_API_BASE:d.API_BASE}${e}`,p=(e=``)=>`${i.IS_PRODUCTION?`${d.PROD_API_BASE}/users`:`${d.API_BASE}/users`}${e}`,m=new class{csrfToken=null;tokenExpiry=0;TOKEN_LIFETIME=1380*60*1e3;fetchingToken=null;async fetchToken(){if(this.fetchingToken)return this.fetchingToken;if(this.csrfToken&&Date.now()<this.tokenExpiry)return this.csrfToken;this.fetchingToken=this._fetchFromServer();try{let e=await this.fetchingToken;return this.csrfToken=e,this.tokenExpiry=Date.now()+this.TOKEN_LIFETIME,e}finally{this.fetchingToken=null}}async _fetchFromServer(){let e=new AbortController,t=setTimeout(()=>e.abort(),s.TIMEOUTS.AUTH);try{let t=await fetch(`${f()}/csrf-token`,{credentials:`include`,signal:e.signal});if(!t.ok)throw Error(`CSRF fetch failed: ${t.status}`);let n=await t.json();return u.ENABLED&&console.debug(`[CSRF] Token fetched`),n.csrf_token}catch(e){throw console.error(`[CSRF] Erreur lors de la récupération du token CSRF:`,e),Error(`Impossible de récupérer le token CSRF`)}finally{clearTimeout(t)}}async getToken(){return this.csrfToken&&Date.now()<this.tokenExpiry?this.csrfToken:this.fetchToken()}requiresCSRF(e){return e?[`POST`,`PUT`,`PATCH`,`DELETE`].includes(e.toUpperCase()):!1}reset(){this.csrfToken=null,this.tokenExpiry=0,this.fetchingToken=null}},h=class extends Error{constructor(e,t,n){super(t),this.status=e,this.data=n,this.name=`ApiError`}};async function g(e,t={}){let{method:n=`GET`,body:i,headers:a={},timeout:o=s.TIMEOUTS.DEFAULT,signal:l,withAuth:d=!0,withCsrf:f}=t,p=i instanceof FormData,g=f??m.requiresCSRF(n),_=p?{...a}:{"Content-Type":`application/json`,...a};if(d){let e=r.get(c.COOKIE_NAME);e&&(_.Authorization=`Bearer ${e}`)}if(g)try{_[`X-CSRF-Token`]=await m.getToken()}catch{}let v=new AbortController,y=setTimeout(()=>v.abort(),o),b=l??v.signal;try{u.ENABLED&&console.debug(`[apiFetch]`,n,e);let t=await fetch(e,{method:n,headers:_,body:p?i:i===void 0?void 0:JSON.stringify(i),credentials:`include`,signal:b});if(t.status===401&&(r.remove(c.COOKIE_NAME),window.dispatchEvent(new CustomEvent(`auth:expired`))),!t.ok){let e;try{e=await t.json()}catch{e=void 0}let n=e?.message??e?.error??`HTTP ${t.status}`;throw new h(t.status,n,e)}return t.status===204?void 0:t.json()}finally{clearTimeout(y)}}function _(e,t){if(!t)return e;let n=new URLSearchParams;for(let[e,r]of Object.entries(t))r!=null&&r!==``&&n.append(e,String(r));let r=n.toString();return r?`${e}?${r}`:e}export{s as a,o as c,c as d,f,m as i,d as l,r as m,g as n,a as o,p,_ as r,u as s,h as t,l as u};