import Control from"./Control.js";import ProjUnits from"../proj/Units.js";import{CLASS_UNSELECTABLE}from"../css.js";import{METERS_PER_UNIT,getPointResolution}from"../proj.js";import{assert}from"../asserts.js";const UNITS_PROP="units",Units={DEGREES:"degrees",IMPERIAL:"imperial",NAUTICAL:"nautical",METRIC:"metric",US:"us"},LEADING_DIGITS=[1,2,5],DEFAULT_DPI=25.4/.28;class ScaleLine extends Control{constructor(e){var e=e||{},t=void 0!==e.className?e.className:e.bar?"ol-scale-bar":"ol-scale-line";super({element:document.createElement("div"),render:e.render,target:e.target}),this.on,this.once,this.un,this.innerElement_=document.createElement("div"),this.innerElement_.className=t+"-inner",this.element.className=t+" "+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||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 _=this.viewState_;if(_){var c=_.center,p=_.projection,E=this.getUnits(),m=E==Units.DEGREES?ProjUnits.DEGREES:ProjUnits.METERS;let e=getPointResolution(p,_.resolution,c,m);var S=this.minWidth_*(this.dpi_||DEFAULT_DPI)/DEFAULT_DPI,f=void 0!==this.maxWidth_?this.maxWidth_*(this.dpi_||DEFAULT_DPI)/DEFAULT_DPI:void 0;let t=S*e,i="",s=(E==Units.DEGREES?(p=METERS_PER_UNIT[ProjUnits.DEGREES],(t*=p)<p/60?(i="″",e*=3600):t<p?(i="′",e*=60):i="°"):E==Units.IMPERIAL?t<.9144?(i="in",e/=.0254):t<1609.344?(i="ft",e/=.3048):(i="mi",e/=1609.344):E==Units.NAUTICAL?(e/=1852,i="NM"):E==Units.METRIC?t<.001?(i="μm",e*=1e6):t<1?(i="mm",e*=1e3):t<1e3?i="m":(i="km",e/=1e3):E==Units.US?t<.9144?(i="in",e*=39.37):t<1609.344?(i="ft",e/=.30480061):(i="mi",e/=1609.3472):assert(!1,33),3*Math.floor(Math.log(S*e)/Math.log(10))),r,n,a,l,h,o;for(;;){a=Math.floor(s/3);var U=Math.pow(10,a);if(r=LEADING_DIGITS[(s%3+3)%3]*U,n=Math.round(r/e),isNaN(n))return this.element.style.display="none",void(this.renderedVisible_=!1);if(void 0!==f&&n>=f){r=l,n=h,a=o;break}if(n>=S)break;l=r,h=n,o=a,++s}let d;d=this.scaleBar_?this.createScaleBar(n,r,i):r.toFixed(a<0?-a:0)+" "+i,this.renderedHTML_!=d&&(this.innerElement_.innerHTML=d,this.renderedHTML_=d),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="1 : "+Math.round(this.getScaleForResolution()).toLocaleString();const r=[];var n=t/this.scaleBarSteps_;let a="#ffffff";for(let e=0;e<this.scaleBarSteps_;e++)0===e&&r.push(this.createMarker("absolute",e)),r.push('<div><div class="ol-scale-singlebar" style="width: '+n+"px;background-color: "+a+';"></div>'+this.createMarker("relative",e)+(e%2==0||2===this.scaleBarSteps_?this.createStepText(e,t,!1,i,s):"")+"</div>"),e===this.scaleBarSteps_-1&&r.push(this.createStepText(e+1,t,!0,i,s)),a="#ffffff"===a?"#000000":"#ffffff";let l;return'<div style="display: flex;">'+(l=this.scaleBarText_?'<div class="ol-scale-text" style="width: '+t+'px;">'+e+"</div>":"")+r.join("")+"</div>"}createMarker(e,t){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(){const e=getPointResolution(this.viewState_.projection,this.viewState_.resolution,this.viewState_.center,ProjUnits.METERS);var t=this.dpi_||DEFAULT_DPI;return parseFloat(e.toString())*(1e3/25.4)*t}render(e){e=e.frameState;this.viewState_=e?e.viewState:null,this.updateElement_()}}export default ScaleLine;export{Units};