import{useReducer as e,useRef as t,useLayoutEffect as n,useEffect as r}from"react";const c=c=>{const[,l]=e(e=>e+1,0),o=t(null),{replace:u,append:a}=c,s=u?u(c.format(c.value)):c.format(c.value),i=t(!1);return n(()=>{if(null==o.current)return;let[e,t,n,r,i]=o.current;o.current=null;const d=r&&i,m=e.slice(t.selectionStart).search(c.accept||/\d/g),f=-1!==m?m:0,h=e=>(e.match(c.accept||/\d/g)||[]).join(""),g=h(e.substr(0,t.selectionStart)),v=e=>{let t=0,n=0;for(let r=0;r!==g.length;++r){let c=e.indexOf(g[r],t)+1,l=h(e).indexOf(g[r],n)+1;l-n>1&&(c=t,l=n),n=Math.max(l,n),t=Math.max(t,c)}return t};if(!0===c.mask&&n&&!i){let t=v(e);const n=h(e.substr(t))[0];t=e.indexOf(n,t),e=`${e.substr(0,t)}${e.substr(t+1)}`}let p=c.format(e);null==a||t.selectionStart!==e.length||i||(n?p=a(p):""===h(p.slice(-1))&&(p=p.slice(0,-1)));const k=u?u(p):p;return s===k?l():c.onChange(k),()=>{let e=v(p);if(null!=c.mask&&(n||r&&!d))for(;p[e]&&""===h(p[e]);)e+=1;t.selectionStart=t.selectionEnd=e+(d?1+f:0)}}),r(()=>{const e=e=>{"Delete"===e.code&&(i.current=!0)},t=e=>{"Delete"===e.code&&(i.current=!1)};return document.addEventListener("keydown",e),document.addEventListener("keyup",t),()=>{document.removeEventListener("keydown",e),document.removeEventListener("keyup",t)}},[]),{value:null!=o.current?o.current[0]:s,onChange:e=>{const t=e.target.value;o.current=[t,e.target,t.length>s.length,i.current,s===c.format(t)],l()}}},l=e=>{const t=c(e);return e.children(t)};export{l as Rifm,c as useRifm};