(function(global) {
    "use strict";
    var highDpiMode = 0; // 默认不进行转换
    var dpiValue = 1.0; // 默认 100%

    function IsIeVersionElder() {
        return Bridge.Frame.version < 11;
    }
    // 0 - 不使用
    // 1 - 转换为 px
    // 2 - 转换为 pt
    function setHighDpiMode(modeType) {
        highDpiMode = modeType;
        refreshModeDisplay();
    }

    function refreshModeDisplay() {
        switch (highDpiMode) {
            case 1:
                convertAllPtToPx();
                break;
            case 2:
                convertAllPxToPt();
                break;
        }
        var images = document.getElementsByTagName('img');
        /*         for (var i = 0; i < images.length; i++) {
                    var img = images[i];
                    var parent = img.parentElement;
                    if (!parent) continue;
                    var parentWidth = parent.offsetWidth;
                    var parentHeight = parent.offsetHeight;
                    var scaledWidth = img.naturalWidth * dpiValue;
                    var scaledHeight = img.naturalHeight * dpiValue;
                    if (scaledWidth > parentWidth || scaledHeight > parentHeight) {
                        img.style.transform = 'none';
                    } else {
                        img.style.transform = 'scale(' + dpiValue + ')';
                    }
                    // console.log('Image:', img, 'Parent Size:', parentWidth, parentHeight, 'Scaled:', scaledWidth, scaledHeight, 'Transform:', img.style.transform);
                } */
        if (IsIeVersionElder && IsIeVersionElder()) {
            var contentElements = document.getElementsByClassName('content');
            var controlElements = document.getElementsByClassName('control-column-bottom');
            if (controlElements.length === 0 || contentElements.length === 0) {
                console.error('未找到相应元素');
            } else {
                var controlElement = controlElements[0];
                var vheight = controlElement.currentStyle ?
                    controlElement.currentStyle.height :
                    window.getComputedStyle(controlElement).height;
                for (var i = 0; i < contentElements.length; i++) {
                    var element = contentElements[i];
                    element.style.height = 'calc(100% - ' + vheight + ')';
                    // console.log('Set height of', element, 'to', 'calc(100% - ' + vheight + ')');
                }
            }
        }
    }

    function convertAllPtToPx() {
        var conversionFactor = 96 / 72;
        var allElements = document.getElementsByTagName("*");
        for (var i = 0; i < allElements.length; i++) {
            var el = allElements[i];
            if (el.style && el.style.cssText) {
                el.style.cssText = el.style.cssText.replace(/(\d+(\.\d+)?)pt/g, function(match, p1) {
                    var pxValue = parseFloat(p1) * conversionFactor;
                    return pxValue + "px";
                });
            }
        }
        for (var i = 0; i < document.styleSheets.length; i++) {
            var styleSheet = document.styleSheets[i];
            try {
                var rules = styleSheet.cssRules || styleSheet.rules;
                if (rules) {
                    for (var j = 0; j < rules.length; j++) {
                        var rule = rules[j];
                        if (rule.style) {
                            for (var k = 0; k < rule.style.length; k++) {
                                var propertyName = rule.style[k];
                                var value = rule.style.getPropertyValue(propertyName);
                                if (value.indexOf("pt") !== -1) {
                                    var newValue = value.replace(/(\d+(\.\d+)?)pt/g, function(match, p1) {
                                        var pxValue = parseFloat(p1) * conversionFactor;
                                        return pxValue + "px";
                                    });
                                    var priority = (rule.style.getPropertyPriority) ? rule.style.getPropertyPriority(propertyName) : "";
                                    rule.style.setProperty(propertyName, newValue, priority);
                                }
                            }
                        }
                    }
                }
            } catch (e) {
                console.warn("Could not access stylesheet", styleSheet.href, e);
            }
        }
    }

    function convertAllPxToPt() {
        var conversionFactor = 72 / 96;
        var allElements = document.getElementsByTagName("*");
        for (var i = 0; i < allElements.length; i++) {
            var el = allElements[i];
            if (el.style && el.style.cssText) {
                el.style.cssText = el.style.cssText.replace(/(\d+(\.\d+)?)px/g, function(match, p1) {
                    var pxValue = parseFloat(p1) * conversionFactor;
                    return pxValue + "pt";
                });
            }
        }
        for (var i = 0; i < document.styleSheets.length; i++) {
            var styleSheet = document.styleSheets[i];
            try {
                var rules = styleSheet.cssRules || styleSheet.rules;
                if (rules) {
                    for (var j = 0; j < rules.length; j++) {
                        var rule = rules[j];
                        if (rule.style) {
                            for (var k = 0; k < rule.style.length; k++) {
                                var propertyName = rule.style[k];
                                var value = rule.style.getPropertyValue(propertyName);
                                if (value.indexOf("px") !== -1) {
                                    var newValue = value.replace(/(\d+(\.\d+)?)px/g, function(match, p1) {
                                        var pxValue = parseFloat(p1) * conversionFactor;
                                        return pxValue + "pt";
                                    });
                                    var priority = (rule.style.getPropertyPriority) ? rule.style.getPropertyPriority(propertyName) : "";
                                    rule.style.setProperty(propertyName, newValue, priority);
                                }
                            }
                        }
                    }
                }
            } catch (e) {
                console.warn("Could not access stylesheet", styleSheet.href, e);
            }
        }
    }

    function setPageZoom(zoomLevel) {
        // document.body.style.zoom = zoomLevel;
        dpiValue = zoomLevel;
        refreshModeDisplay();
    }

    module.exports = {
        Windows: {
            UI: {
                DPI: new function() {
                    Object.defineProperty(this, "mode", {
                        get: function() {
                            return highDpiMode;
                        },
                        set: function(modeType) {
                            setHighDpiMode(modeType);
                            return highDpiMode;
                        }
                    });
                    this.refresh = refreshModeDisplay;
                    Object.defineProperty(this, "zoom", {
                        get: function() {
                            return dpiValue;
                        },
                        set: function(zoomLevel) {
                            setPageZoom(zoomLevel);
                            return dpiValue;
                        }
                    });
                    this.ptToPx = convertAllPtToPx;
                    this.pxToPt = convertAllPxToPt;
                }()
            }
        }
    };
})(this);