import Control from"./Control.js";import{CLASS_UNSELECTABLE}from"../css.js";import{METERS_PER_UNIT,getPointResolution}from"../proj.js";const UNITS_PROP="units",LEADING_DIGITS=[1,2,5],DEFAULT_DPI=25.4/.28;class ScaleLine extends Control{constructor(e){e=e||{};const t=document.createElement("div");t.style.pointerEvents="none",super({element:t,render:e.render,target:e.target}),this.on,this.once,this.un;var i=void 0!==e.className?e.className:e.bar?"ol-scale-bar":"ol-scale-line";this.innerElement_=document.createElement("div"),this.innerElement_.className=i+"-inner",this.element.className=i+" "+CLASS_UNSELECTABLE,this.element.appendChild(this.innerElement_),this.viewState_=null,this.minWidth_=void 0!==e.minWidth?e.minWidth:64,this.maxWidth_=e.maxWidth,this.renderedVisible_=!1,this.renderedWidth_=void 0,this.renderedHTML_="",this.addChangeListener(UNITS_PROP,this.handleUnitsChanged_),this.setUnits(e.units||"metric"),this.scaleBar_=e.bar||!1,this.scaleBarSteps_=e.steps||4,this.scaleBarText_=e.text||!1,this.dpi_=e.dpi||void 0}getUnits(){return this.get(UNITS_PROP)}handleUnitsChanged_(){this.updateElement_()}setUnits(e){this.set(UNITS_PROP,e)}setDpi(e){this.dpi_=e}updateElement_(){var o=this.viewState_;if(o){var _=o.center,c=o.projection,m=this.getUnits();let e=getPointResolution(c,o.resolution,_,"degrees"==m?"degrees":"m");var p=this.minWidth_*(this.dpi_||DEFAULT_DPI)/DEFAULT_DPI,u=void 0!==this.maxWidth_?this.maxWidth_*(this.dpi_||DEFAULT_DPI)/DEFAULT_DPI:void 0;let t=p*e,i="";if("degrees"==m){c=METERS_PER_UNIT.degrees;(t*=c)<c/60?(i="″",e*=3600):t<c?(i="′",e*=60):i="°"}else if("imperial"==m)t<.9144?(i="in",e/=.0254):t<1609.344?(i="ft",e/=.3048):(i="mi",e/=1609.344);else if("nautical"==m)e/=1852,i="NM";else if("metric"==m)t<.001?(i="μm",e*=1e6):t<1?(i="mm",e*=1e3):t<1e3?i="m":(i="km",e/=1e3);else{if("us"!=m)throw new Error("Invalid units");t<.9144?(i="in",e*=39.37):t<1609.344?(i="ft",e/=.30480061):(i="mi",e/=1609.3472)}let s=3*Math.floor(Math.log(p*e)/Math.log(10)),r,n,a,l,d,h;for(;;){a=Math.floor(s/3);var v=Math.pow(10,a);if(r=LEADING_DIGITS[(s%3+3)%3]*v,n=Math.round(r/e),isNaN(n))return this.element.style.display="none",void(this.renderedVisible_=!1);if(void 0!==u&&n>=u){r=l,n=d,a=h;break}if(n>=p)break;l=r,d=n,h=a,++s}o=this.scaleBar_?this.createScaleBar(n,r,i):r.toFixed(a<0?-a:0)+" "+i;this.renderedHTML_!=o&&(this.innerElement_.innerHTML=o,this.renderedHTML_=o),this.renderedWidth_!=n&&(this.innerElement_.style.width=n+"px",this.renderedWidth_=n),this.renderedVisible_||(this.element.style.display="",this.renderedVisible_=!0)}else this.renderedVisible_&&(this.element.style.display="none",this.renderedVisible_=!1)}createScaleBar(t,i,s){var e=this.getScaleForResolution(),e=e<1?Math.round(1/e).toLocaleString()+" : 1":"1 : "+Math.round(e).toLocaleString(),r=this.scaleBarSteps_,n=t/r;const a=[this.createMarker("absolute")];for(let e=0;e<r;++e){var l=e%2==0?"ol-scale-singlebar-odd":"ol-scale-singlebar-even";a.push("<div><div "+`class="ol-scale-singlebar ${l}" `+`style="width: ${n}px;"`+"></div>"+this.createMarker("relative")+(e%2==0||2===r?this.createStepText(e,t,!1,i,s):"")+"</div>")}return a.push(this.createStepText(r,t,!0,i,s)),(this.scaleBarText_?`<div class="ol-scale-text" style="width: ${t}px;">`+e+"</div>":"")+a.join("")}createMarker(e){return'<div class="ol-scale-step-marker" '+`style="position: ${e}; top: ${"absolute"===e?3:-10}px;"`+"></div>"}createStepText(e,t,i,s,r){s=0===e?0:Math.round(s/this.scaleBarSteps_*e*100)/100;return'<div class="ol-scale-step-text" style="'+`margin-left: ${0===e?-3:t/this.scaleBarSteps_*-1}px;`+`text-align: ${0===e?"left":"center"};`+`min-width: ${0===e?0:t/this.scaleBarSteps_*2}px;`+`left: ${i?t+"px":"unset"};`+'">'+(s+(0===e?"":" "+r))+"</div>"}getScaleForResolution(){return getPointResolution(this.viewState_.projection,this.viewState_.resolution,this.viewState_.center,"m")*(1e3/25.4)*(this.dpi_||DEFAULT_DPI)}render(e){e=e.frameState;this.viewState_=e?e.viewState:null,this.updateElement_()}}export default ScaleLine;