import Store from '../store';
import locale from '../locale/locale';
import { modelHTML } from './constant';
import { getSheetIndex } from '../methods/get';
import { setluckysheet_scroll_status } from '../methods/set';
import sheetmanage from './sheetmanage';
import luckysheetsizeauto from './resize';
import dataVerificationCtrl from './dataVerificationCtrl';
import { replaceHtml, transformRangeToAbsolute, openSelfModel } from '../utils/util';
import { selectionCopyShow } from './select';
import tooltip from '../global/tooltip';
import cleargridelement from '../global/cleargridelement';

let isInitialProtection = false, isInitialProtectionAddRang = false, rangeItemListCache = [], isAddRangeItemState = true, updateRangeItemIndex = null, validationAuthority = null, updatingSheetFile = null, firstInputSheetProtectionPassword = true;
let sqrefMapCache = {}, inputRangeProtectionPassword = {}, initialRangePasswordHtml = false;

const authorityItemArr = [
    "selectLockedCells",
    "selectunLockedCells",
    "formatCells",
    "formatColumns",
    "formatRows",
    "insertColumns",
    "insertRows",
    "insertHyperlinks",
    "deleteColumns",
    "deleteRows",
    "sort",
    "filter",
    "usePivotTablereports",
    "editObjects",
    "editScenarios"
]

function addRangeItem(item) {
    const _locale = locale();
    const local_protection = _locale.protection;
    const locale_button = _locale.button;

    let title = item.name, sqref = item.sqref, password = item.password;

    let passwordTxt = "";
    if (password != null && password.length > 0) {
        passwordTxt = '<i class="icon iconfont luckysheet-iconfont-bianji2" title="' + local_protection.rangeItemHasPassword + '"></i>';
    }

    let rangeItemTemplate = `
        <div class="luckysheet-protection-rangeItem" title="${local_protection.rangeItemDblclick}">
            <div class="luckysheet-protection-rangeItem-del" title="${locale_button.delete}">
                <i class="icon iconfont luckysheet-iconfont-shanchu"></i>
            </div>
            <div class="luckysheet-protection-rangeItem-name" title="${title}">
                ${title}${passwordTxt}
            </div>
            <div class="luckysheet-protection-rangeItem-range" title="${sqref}">
                ${sqref}
            </div>
            <div class="luckysheet-protection-rangeItem-update" title="${locale_button.update}">
                <i class="icon iconfont luckysheet-iconfont-bianji"></i>
            </div>
        </div>
    `;

    $("#luckysheet-protection-rangeItem-container").append(rangeItemTemplate);
}

function initialEvent(file) {

    const _locale = locale();
    const local_protection = _locale.protection;
    const locale_button = _locale.button;

    //confirm protection
    $("#luckysheet-slider-protection-ok").click(function() {
        let password = $("#protection-password").val();
        let sheet = $("#protection-swichProtectionState").is(":checked");
        let hint = $("#protection-hint").val();

        let file = updatingSheetFile, aut = {};

        if (file != null && file.config != null && file.config.authority != null) {
            aut = file.config.authority;
        }

        let authorityData = {

        }

        let algorithmName = "None";
        if (password != "••••••••") {
            authorityData.password = password;
            authorityData.algorithmName = "None";
            authorityData.saltValue = null;
        }
        else if (aut != null) {
            authorityData.algorithmName = aut.algorithmName;
            authorityData.saltValue = aut.saltValue;
            authorityData.password = aut.password;
        }
        else {
            authorityData.algorithmName = "None";
            authorityData.saltValue = null;
            authorityData.password = "";
        }

        authorityData.hintText = hint;

        authorityData.sheet = sheet == true ? 1 : 0;

        for (let i = 0; i < authorityItemArr.length; i++) {
            let name = authorityItemArr[i];
            let checkId = "luckysheet-protection-check-" + name;
            let authorityValue = $("#" + checkId).is(':checked');

            authorityData[name] = authorityValue == true ? 1 : 0;
        }

        authorityData.allowRangeList = rangeItemListCache;

        rangeItemListCache = [];
        firstInputSheetProtectionPassword = true;

        if (file.config == null) {
            file.config = {};
        }

        file.config.authority = authorityData;

        inputRangeProtectionPassword = {};

        closeProtectionModal();

    });

    //cancel protection
    $("#luckysheet-slider-protection-cancel, #luckysheet-modal-dialog-protection-close").click(function() {
        closeProtectionModal();
    });

    //Add allow edit range
    $("#luckysheet-slider-protection-addRange").click(function() {
        initialProtectionRangeModal();
        isAddRangeItemState = true;
        $("#luckysheet-protection-rangeItem-confirm").html(locale_button.insert);

        openSelfModel("luckysheet-protection-rangeItem-dialog");

        $("#protection-allowRangeAdd-title").val("Default" + rangeItemListCache.length);
        $("#protection-allowRangeAdd-range input").val("");
        $("#protection-allowRangeAdd-password").val("");
        $("#protection-allowRangeAdd-hint").val("");

    });

    //update allow edit range
    $(document).off("click.luckysheetProtection.rangeItemUpdate").on("click.luckysheetProtection.rangeItemUpdate", "#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-update", function(e) {
        initialProtectionRangeModal();

        isAddRangeItemState = false;
        $("#luckysheet-protection-rangeItem-confirm").html(locale_button.update);

        openSelfModel("luckysheet-protection-rangeItem-dialog");

        let $rangeItem = $(e.target).closest(".luckysheet-protection-rangeItem");

        let $rangeItemContainer = $("#luckysheet-protection-rangeItem-container");

        let index = $rangeItemContainer.find("> div.luckysheet-protection-rangeItem").index($rangeItem);

        let item = rangeItemListCache[index];

        updateRangeItemIndex = index;

        $("#protection-allowRangeAdd-title").val(item.name);
        $("#protection-allowRangeAdd-range input").val(item.sqref);
        if (item.algorithmName == "None") {
            $("#protection-allowRangeAdd-password").val(item.password);
        }
        else {
            $("#protection-allowRangeAdd-password").val("••••••••");
        }
        $("#protection-allowRangeAdd-hint").val(item.hintText);
    });

    //delete allow edit range
    $(document).off("click.luckysheetProtection.rangeItemDelete").on("click.luckysheetProtection.rangeItemDelete", "#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-del", function(e) {
        let $rangeItem = $(e.target).closest(".luckysheet-protection-rangeItem");

        let $rangeItemContainer = $("#luckysheet-protection-rangeItem-container");

        let index = $rangeItemContainer.find("> div.luckysheet-protection-rangeItem").index($rangeItem);

        let item = rangeItemListCache[index];

        rangeItemListCache.splice(index, 1);
        $rangeItem.remove();
    });

    //confirm allow edit range
    $(document).off("click.luckysheetProtection.rangeItemConfirm").on("click.luckysheetProtection.rangeItemConfirm", "#luckysheet-protection-rangeItem-confirm", function() {
        let name = $("#protection-allowRangeAdd-title").val(),
            rangeText = $("#protection-allowRangeAdd-range input").val(),
            password = $("#protection-allowRangeAdd-password").val(),
            hint = $("#protection-allowRangeAdd-hint").val();

        if (name.length == 0) {
            alert(local_protection.rangeItemErrorTitleNull);
            return;
        }

        let range = dataVerificationCtrl.getRangeByTxt(rangeText);

        if (rangeText.length == 0) {
            alert(local_protection.rangeItemErrorRangeNull);
            return;
        }

        if (range.length == 0) {
            alert(local_protection.rangeItemErrorRange);
            return;
        }

        rangeText = transformRangeToAbsolute(rangeText);


        if (isAddRangeItemState) {
            let item = {
                name: name,
                password: password,
                hintText: hint,
                algorithmName: "None",//MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,WHIRLPOOL
                saltValue: null,
                checkRangePasswordUrl: null,
                sqref: rangeText
            }

            addRangeItem(item);
            rangeItemListCache.push(item);
        }
        else {
            let index = updateRangeItemIndex;
            let item = rangeItemListCache[index];

            item.name = name;
            item.sqref = rangeText;
            item.hintText = hint;

            if (password != "••••••••") {
                item.password = password;
                item.algorithmName = "None";
            }

            let $rangeItemContainer = $("#luckysheet-protection-rangeItem-container");

            let $rangeitem = $rangeItemContainer.find("> div.luckysheet-protection-rangeItem").eq(index);

            let $name = $rangeitem.find(".luckysheet-protection-rangeItem-name");

            let passwordTxt = "";
            if (password != null && password.length > 0) {
                passwordTxt = '<i class="icon iconfont luckysheet-iconfont-bianji2" title="' + local_protection.rangeItemHasPassword + '"></i>';
            }

            $name.html(name + passwordTxt).attr("title", name);

            let $range = $rangeitem.find(".luckysheet-protection-rangeItem-range");

            $range.html(rangeText).attr("title", rangeText);
        }



        $("#luckysheet-protection-rangeItem-dialog").hide();
        $("#luckysheet-modal-dialog-mask").hide();

    });


    //sheet validation check passWord
    $(document).off("click.luckysheetProtection.validationConfirm").on("click.luckysheetProtection.validationConfirm", "#luckysheet-protection-sheet-validation-confirm", function(e) {
        let $validation = $("#luckysheet-protection-sheet-validation");
        let aut = validationAuthority;

        if (aut == null) {
            restoreProtectionConfig(validationAuthority);
            $validation.hide();
            $("#luckysheet-modal-dialog-mask").hide();
            $("#luckysheet-modal-dialog-slider-protection").show();
            luckysheetsizeauto();
            return;
        }

        let $input = $validation.find("input");
        let password = $input.val();


        if (password == null || password.length == 0) {
            alert(local_protection.checkPasswordNullalert);
            return;
        }

        if (aut.algorithmName != null && aut.algorithmName != "None") {
            if (aut.saltValue != null && aut.saltValue.length > 0) {
                var hasher = CryptoApi.getHasher(aut.algorithmName);
                password = CryptoApi.hmac(aut.saltValue, password, hasher);
            }
            else {
                password = CryptoApi.hash(aut.algorithmName, password);
            }
        }

        if (password == aut.password) {
            restoreProtectionConfig(validationAuthority);
            $validation.hide();
            $("#luckysheet-modal-dialog-mask").hide();
            $("#luckysheet-modal-dialog-slider-protection").show();
            luckysheetsizeauto();
            firstInputSheetProtectionPassword = false;
        }
        else {
            alert(local_protection.checkPasswordWrongalert);
        }

    });

    $("#luckysheet-protection-check-selectLockedCells").change(function() {
        let $selectLockedCells = $("#luckysheet-protection-check-selectLockedCells"), $selectunLockedCells = $("#luckysheet-protection-check-selectunLockedCells");

        let selectLockedCellsChecked = $selectLockedCells.is(":checked"), selectunLockedCellsChecked = $selectunLockedCells.is(":checked");

        if (selectLockedCellsChecked) {
            $selectunLockedCells.prop('checked', true);
        }
    });

    $("#luckysheet-protection-check-selectunLockedCells").change(function() {
        let $selectLockedCells = $("#luckysheet-protection-check-selectLockedCells"), $selectunLockedCells = $("#luckysheet-protection-check-selectunLockedCells");

        let selectLockedCellsChecked = $selectLockedCells.is(":checked"), selectunLockedCellsChecked = $selectunLockedCells.is(":checked");

        if (!selectunLockedCellsChecked) {
            $selectLockedCells.prop('checked', false);
        }
    });


    //Cell range select controll
    $(document).off("click.luckysheetProtection.dvRange").on("click.luckysheetProtection.dvRange", "#protection-allowRangeAdd-range .fa-table", function(e) {
        $("#luckysheet-protection-rangeItem-dialog").hide();

        let dataSource = "0";
        let txt = $(this).siblings("input").val().trim();

        dataVerificationCtrl.rangeDialog(dataSource, txt);

        dataVerificationCtrl.selectRange = [];

        let range = dataVerificationCtrl.getRangeByTxt(txt);
        if (range.length > 0) {
            for (let s = 0; s < range.length; s++) {
                let r1 = range[s].row[0], r2 = range[s].row[1];
                let c1 = range[s].column[0], c2 = range[s].column[1];

                let row = Store.visibledatarow[r2],
                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];
                let col = Store.visibledatacolumn[c2],
                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];

                dataVerificationCtrl.selectRange.push({
                    "left": col_pre,
                    "width": col - col_pre - 1,
                    "top": row_pre,
                    "height": row - row_pre - 1,
                    "left_move": col_pre,
                    "width_move": col - col_pre - 1,
                    "top_move": row_pre,
                    "height_move": row - row_pre - 1,
                    "row": [r1, r2],
                    "column": [c1, c2],
                    "row_focus": r1,
                    "column_focus": c1
                });
            }
        }

        selectionCopyShow(dataVerificationCtrl.selectRange);
    });
    $(document).off("click.luckysheetProtection.dvRange2").on("click.luckysheetProtection.dvRange2", "#luckysheet-protection-rangeItem-dialog .show-box-item-dropdown .range .fa-table", function(e) {
        $("#luckysheet-protection-rangeItem-dialog").hide();

        let dataSource = "1";
        let txt = $(this).siblings("input").val().trim();

        dataVerificationCtrl.rangeDialog(dataSource, txt);

        dataVerificationCtrl.selectRange = [];

        let range = dataVerificationCtrl.getRangeByTxt(txt);
        if (range.length > 0) {
            for (let s = 0; s < range.length; s++) {
                let r1 = range[s].row[0], r2 = range[s].row[1];
                let c1 = range[s].column[0], c2 = range[s].column[1];

                let row = Store.visibledatarow[r2],
                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];
                let col = Store.visibledatacolumn[c2],
                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];

                dataVerificationCtrl.selectRange.push({
                    "left": col_pre,
                    "width": col - col_pre - 1,
                    "top": row_pre,
                    "height": row - row_pre - 1,
                    "left_move": col_pre,
                    "width_move": col - col_pre - 1,
                    "top_move": row_pre,
                    "height_move": row - row_pre - 1,
                    "row": [r1, r2],
                    "column": [c1, c2],
                    "row_focus": r1,
                    "column_focus": c1
                });
            }
        }

        selectionCopyShow(dataVerificationCtrl.selectRange);
    });
    $(document).off("click.luckysheetProtection.dvRangeConfirm").on("click.luckysheetProtection.dvRangeConfirm", "#luckysheet-dataVerificationRange-dialog-confirm", function(e) {
        let txt = $(this).parents("#luckysheet-dataVerificationRange-dialog").find("input").val();

        let $input = $("#protection-allowRangeAdd-range input"), inputValue = $input.val();
        if (inputValue.substr(inputValue.length - 1, 1) == ",") {
            $input.val(inputValue + txt);
        }
        else {
            $input.val(txt);
        }
        $("#luckysheet-dataVerificationRange-dialog").hide();
        $("#luckysheet-modal-dialog-mask").show();
        $("#luckysheet-protection-rangeItem-dialog").show();

        let range = [];
        selectionCopyShow(range);
    });
    $(document).off("click.luckysheetProtection.dvRangeClose").on("click.dvRangeClose", "#luckysheet-dataVerificationRange-dialog-close", function(e) {
        $("#luckysheet-dataVerificationRange-dialog").hide();
        $("#luckysheet-modal-dialog-mask").show();
        $("#luckysheet-protection-rangeItem-dialog").show();

        let range = [];
        selectionCopyShow(range);
    });
    $(document).on("click.luckysheetProtection.luckysheetProtection", "#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close", function(e) {
        $("#luckysheet-dataVerificationRange-dialog").hide();
        $("#luckysheet-modal-dialog-mask").show();
        $("#luckysheet-protection-rangeItem-dialog").show();

        let range = [];
        selectionCopyShow(range);
    });
}

//protect range config
function initialProtectionRangeModal(file) {
    if (isInitialProtectionAddRang) {
        return;
    }
    isInitialProtectionAddRang = true;
    let _locale = locale();
    let local_protection = _locale.protection;
    const locale_button = _locale.button;
    $("body").append(replaceHtml(modelHTML, {
        "id": "luckysheet-protection-rangeItem-dialog",
        "addclass": "luckysheet-protection-rangeItem-dialog",
        "title": local_protection.allowRangeTitle,
        "content": `
            <div class="luckysheet-protection-rangeItem-content">
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">
                        ${local_protection.allowRangeAddTitle}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">
                        <input class="luckysheet-protection-rangeItemiInput" id="protection-allowRangeAdd-title"  placeHolder="${local_protection.allowRangeAddtitleDefault}">
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">
                        ${local_protection.allowRangeAddSqrf}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">
                        <div id="protection-allowRangeAdd-range" class="range">
                            <input class="formulaInputFocus" spellcheck="false" placeHolder="${local_protection.selectCellRangeHolder}">
                            <i class="fa fa-table" aria-hidden="true" title="${local_protection.selectCellRange}"></i>
                        </div>
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">
                        ${local_protection.allowRangeAddTitlePassword}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">
                        <input class="luckysheet-protection-rangeItemiInput" id="protection-allowRangeAdd-password"  placeHolder="${local_protection.enterPassword}">
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">
                        ${local_protection.allowRangeAddTitleHint}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">
                        <textarea class="luckysheet-protection-rangeItemTextarea" id="protection-allowRangeAdd-hint"  placeHolder="${local_protection.allowRangeAddTitleHintTitle}"></textarea>
                    </div>
                </div>
            </div>
        `,
        "botton": `<button id="luckysheet-protection-rangeItem-confirm" class="btn btn-primary">${locale_button.insert}</button>
                    <button class="btn btn-default luckysheet-model-close-btn">${locale_button.cancel}</button>`,
        "style": "z-index:100003"
    }));
}


//Protect sheet initial
function initialProtectionRIghtBar(file) {
    const _locale = locale();
    const local_protection = _locale.protection;
    const locale_button = _locale.button;

    let authorityItemHtml = "";
    for (let i = 0; i < authorityItemArr.length; i++) {
        let name = authorityItemArr[i];

        authorityItemHtml += `
            <div class="luckysheet-slider-protection-row" style="height:18px;">
                <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                <label for="luckysheet-protection-check-${name}"><input id="luckysheet-protection-check-${name}" name="luckysheet-protection-check-${name}" type="checkbox">${local_protection[name]}</label>
                </div>
            </div>
        `;
    }

    const protectionModalHtml = `
    <div id="luckysheet-modal-dialog-slider-protection" class="luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot" style="display:none;">
        <div class="luckysheet-modal-dialog-slider-title"> <span>${local_protection.protectiontTitle}</span> <span id="luckysheet-modal-dialog-protection-close" title="${locale_button.close}"><i class="fa fa-times" aria-hidden="true"></i></span> </div>
        <div class="luckysheet-modal-dialog-slider-content">
            <div class="luckysheet-slider-protection-config" style="top:10px;height:115px">
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                    <label for="protection-swichProtectionState"><input id="protection-swichProtectionState" name="protection-swichProtectionState" type="checkbox">${local_protection.swichProtectionTip}</label>
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row" style="height:23px;">
                    <div class="luckysheet-slider-protection-column" style="width:98%;">
                        <input class="luckysheet-protection-input" id="protection-password"  placeHolder="${local_protection.enterPassword}">
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row" style="height:47px;margin-top:4px;">
                    <div class="luckysheet-slider-protection-column" style="width:98%;">
                        <textarea class="luckysheet-protection-textarea" id="protection-hint"  placeHolder="${local_protection.enterHint}"></textarea>
                    </div>
                </div>
            </div>
            <div class="luckysheet-slider-protection-config" style="top:130px;height:290px;border-top:1px solid #c5c5c5">
                <div class="luckysheet-slider-protection-row" style="height:20px;">
                    ${local_protection.authorityTitle}
                </div>
                ${authorityItemHtml}
            </div>
            <div class="luckysheet-slider-protection-config" style="top:440px;bottom:45px;border-top:1px solid #c5c5c5">
                <div class="luckysheet-slider-protection-row" style="height:25px;">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:0px;line-height: 25px;">
                        ${local_protection.allowRangeTitle}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x" style="left:70%;">
                        <div class="luckysheet-slider-protection-ok luckysheet-slider-protection-addRange" id="luckysheet-slider-protection-addRange">
                            ${local_protection.allowRangeAdd}
                        </div>
                    </div>
                </div>

                <div id="luckysheet-protection-rangeItem-container" class="luckysheet-slider-protection-row" style="top:25px;bottom:0px;position:absolute">
                   
                </div>
            </div>
            <div class="luckysheet-slider-protection-config" style="bottom:0px;height:45px">
                <div class="luckysheet-slider-protection-column luckysheet-protection-column-5x" style="left:0px;">
                    <div class="luckysheet-slider-protection-ok" id="luckysheet-slider-protection-ok">
                        ${locale_button.confirm}
                    </div>
                </div>
                <div class="luckysheet-slider-protection-column luckysheet-protection-column-5x" style="left:50%;">
                    <div class="luckysheet-slider-protection-cancel" id="luckysheet-slider-protection-cancel">
                        ${locale_button.cancel}
                    </div>
                </div>
            </div>
        </div>
    </div>
    `;

    $("body").append(protectionModalHtml);


    //Password input initial for sheet Protection
    $("body").append(replaceHtml(modelHTML, {
        "id": "luckysheet-protection-sheet-validation",
        "addclass": "luckysheet-protection-sheet-validation",
        "title": local_protection.validationTitle,
        "content": `
            <div class="luckysheet-slider-protection-row">
                <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                    ${local_protection.validationTips}
                </div>
            </div>
            <div class="luckysheet-slider-protection-row" style="margin-top:20px">
                <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                    <input type="password" class="luckysheet-protection-rangeItemiInput" placeHolder="${local_protection.validationInputHint}">
                </div>
            </div>
        `,
        "botton": `<button id="luckysheet-protection-sheet-validation-confirm" class="btn btn-primary">${locale_button.confirm}</button>
                    <button class="btn btn-default luckysheet-model-close-btn">${locale_button.cancel}</button>`,
        "style": "z-index:100003"
    }));

}


function restoreProtectionConfig(aut) {
    if (aut == null) {
        aut = {};
    }
    for (let i = 0; i < authorityItemArr.length; i++) {
        let name = authorityItemArr[i];
        let checkId = "luckysheet-protection-check-" + name;
        let authorityValue = aut[name];
        if (authorityValue == null) {
            authorityValue = 0;
        }

        if (authorityValue == null && name in { selectLockedCells: 1, selectunLockedCells: 1 }) {
            authorityValue = 1;
        }

        $("#" + checkId).prop('checked', authorityValue == 1 ? true : false);
    }

    if (aut.password != null && aut.password.length > 0) {
        if (aut.algorithmName == "None" || aut.algorithmName == null) {
            $("#protection-password").val(aut.password);
        }
        else {
            $("#protection-password").val("••••••••");
        }
    }
    else {
        $("#protection-password").val("");
    }

    let sheet = aut.sheet;
    if (aut.sheet == null) {
        sheet = 0;
    }
    $("#protection-swichProtectionState").prop('checked', sheet == 1 ? true : false);

    let hintText = aut.hintText;
    if (hintText == null) {
        hintText = "";
    }
    $("#protection-hint").val(hintText);


    rangeItemListCache = [];
    $("#luckysheet-protection-rangeItem-container").empty();
    let allowRangeList = aut.allowRangeList;
    if (allowRangeList != null && allowRangeList.length > 0) {
        for (let i = 0; i < allowRangeList.length; i++) {
            let item = allowRangeList[i];
            addRangeItem(item);
            rangeItemListCache.push(item);
        }
    }

}

export function openProtectionModal(file) {
    if (!isInitialProtection) {
        initialProtectionRIghtBar(file);
        initialEvent(file);
        isInitialProtection = true;
    }

    updatingSheetFile = file;


    if (file != null && file.config != null && file.config.authority != null) {
        let aut = file.config.authority;
        if (firstInputSheetProtectionPassword && aut.sheet == 1 && aut.password != null && aut.password.length > 0) {
            validationAuthority = aut;
            $("#luckysheet-protection-sheet-validation input").val("");
            openSelfModel("luckysheet-protection-sheet-validation");
            return;
        }
        else {//retore protection config
            restoreProtectionConfig(aut);
        }
    }
    else {//protection initial config
        $("#luckysheet-protection-check-selectLockedCells").prop('checked', true);
        $("#luckysheet-protection-check-selectunLockedCells").prop('checked', true);
    }

    $("#luckysheet-modal-dialog-slider-protection").show();
    luckysheetsizeauto();

}

export function closeProtectionModal() {
    $("#luckysheet-protection-rangeItem-dialog").hide();
    $("#luckysheet-modal-dialog-slider-protection").hide();
    luckysheetsizeauto();
}




function checkProtectionLockedSqref(r, c, aut, local_protection, isOpenAlert = true, isLock = true) {
    let isPass = false;
    let rangeAut = aut.allowRangeList;
    if (rangeAut != null && rangeAut.length > 0) {
        let isExists = false;
        for (let i = 0; i < rangeAut.length; i++) {
            let ra = rangeAut[i];
            let sqref = ra.sqref;
            let range = dataVerificationCtrl.getRangeByTxt(sqref);

            if (range.length > 0) {
                for (let s = 0; s < range.length; s++) {
                    let r1 = range[s].row[0], r2 = range[s].row[1];
                    let c1 = range[s].column[0], c2 = range[s].column[1];

                    if (r >= r1 && r <= r2 && c >= c1 && c <= c2) {
                        isExists = true;
                        break;
                    }
                }
            }

            if (isExists) {

                let password = ra.password;
                if (password != null && password.length > 0 && !(sqref in inputRangeProtectionPassword)) {
                    if (isOpenAlert) {
                        openRangePasswordModal(ra);
                        $("#luckysheet-selection-copy .luckysheet-selection-copy").hide();
                    }
                    return false;
                }
                else {
                    isPass = true;
                }

                break;
            }
        }
    }
    if (!isPass && !isLock) isPass = true
    if (!isPass && isOpenAlert) {
        let ht;
        if (aut.hintText != null && aut.hintText.length > 0) {
            ht = aut.hintText;
        }
        else {
            ht = local_protection.defaultSheetHintText;
        }
        tooltip.info("", ht);
        $("#luckysheet-selection-copy .luckysheet-selection-copy").hide();
    }

    return isPass;
}


function openRangePasswordModal(rangeAut) {
    const _locale = locale();
    const local_protection = _locale.protection;
    const locale_button = _locale.button;

    if (!initialRangePasswordHtml) {
        //Password input initial for range
        $("body").append(replaceHtml(modelHTML, {
            "id": "luckysheet-protection-range-validation",
            "addclass": "luckysheet-protection-sheet-validation",
            "title": local_protection.validationTitle,
            "content": `
                <div class="luckysheet-slider-protection-row">
                    <div id="luckysheet-protection-range-validation-hint" class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                        
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row" style="margin-top:20px">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                        <input type="password" class="luckysheet-protection-rangeItemiInput" placeHolder="${local_protection.validationInputHint}">
                    </div>
                </div>
            `,
            "botton": `<button id="luckysheet-protection-range-validation-confirm" class="btn btn-primary">${locale_button.confirm}</button>
                        <button class="btn btn-default luckysheet-model-close-btn">${locale_button.cancel}</button>`,
            "style": "z-index:100003"
        }));
    }

    initialRangePasswordHtml = true;



    openSelfModel("luckysheet-protection-range-validation");

    let $hint = $("#luckysheet-protection-range-validation-hint");
    if (rangeAut.hintText != null && rangeAut.hintText.length > 0) {
        $hint.html(rangeAut.hintText);
    }
    else {
        $hint.html(local_protection.defaultRangeHintText);
    }
    let $rangeV = $("#luckysheet-protection-range-validation");
    let $input = $rangeV.find("input");
    $input.val("");

    $("#luckysheet-protection-range-validation-confirm").off("click").on("click", function() {
        let password = $input.val();

        if (password == null || password.length == 0) {
            alert(local_protection.checkPasswordNullalert);
            return;
        }

        if (rangeAut.algorithmName != null && rangeAut.algorithmName != "None") {
            // password = CryptoApi.hash(rangeAut.algorithmName, password);
            if (rangeAut.saltValue != null && rangeAut.saltValue.length > 0) {
                var hasher = CryptoApi.getHasher(rangeAut.algorithmName);
                password = CryptoApi.hmac(rangeAut.saltValue, password, hasher);
            }
            else {
                password = CryptoApi.hash(rangeAut.algorithmName, password);
            }
        }

        if (password == rangeAut.password) {
            inputRangeProtectionPassword[rangeAut.sqref] = 1;
            $rangeV.hide();
            $("#luckysheet-modal-dialog-mask").hide();
            alert(local_protection.checkPasswordSucceedalert);
        }
        else {
            alert(local_protection.checkPasswordWrongalert);
        }

    });

}

//protection state
export function checkProtectionNotEnable(sheetIndex) {
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);
    if (sheetFile == null) {
        return true;
    }

    if (sheetFile.config == null || sheetFile.config.authority == null) {
        return true;
    }

    let aut = sheetFile.config.authority;

    if (aut == null || aut.sheet == null || aut.sheet == 0) {
        return true;
    }

    const _locale = locale();
    const local_protection = _locale.protection;

    let ht;
    if (aut.hintText != null && aut.hintText.length > 0) {
        ht = aut.hintText;
    }
    else {
        ht = local_protection.defaultSheetHintText;
    }
    tooltip.info("", ht);

    return false;
}

//cell locked state
export function checkProtectionLocked(r, c, sheetIndex, isOpenAlert = true, isLock = true) {

    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);
    if (sheetFile == null) {
        return true;
    }
    let data = sheetFile.data, cell = data[r][c], aut = sheetFile.config.authority;
    if (cell && cell.lo === 1) {
        return false;
    }
    if (sheetFile.config == null || sheetFile.config.authority == null) {
        return true;
    }



    if (aut == null || aut.sheet == null || aut.sheet == 0) {
        return true;
    }

    if (cell && cell.lo === 0) { // lo为0的时候才是可编辑
        return true;
    }

    const _locale = locale();
    const local_protection = _locale.protection;

    return checkProtectionLockedSqref(r, c, aut, local_protection, isOpenAlert, isLock);
}

//cell hidden state
export function checkProtectionCellHidden(r, c, sheetIndex) {
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);
    if (!sheetFile || (sheetFile.data && !sheetFile.data[r]) || (sheetFile.data && !sheetFile.data[r][c])) {
        return true;
    }

    if (sheetFile.config == null || sheetFile.config.authority == null) {
        return true;
    }

    let data = sheetFile.data, cell = data[r][c], aut = sheetFile.config.authority;

    if (aut == null || aut.sheet == null || aut.sheet == 0) {
        return true;
    }

    if (cell == null || cell.hi == null || cell.hi == 0) {
        return true;
    }

    return false;
}

//cell range locked state
export function checkProtectionLockedRangeList(rangeList, sheetIndex) {
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);

    if (sheetFile == null) {
        return true;
    }

    if (sheetFile.config == null || sheetFile.config.authority == null) {
        return true;
    }

    let aut = sheetFile.config.authority;

    if (aut == null || aut.sheet == null || aut.sheet == 0) {
        return true;
    }

    if (rangeList == null || rangeList.length == 0) {
        return true;
    }

    const _locale = locale();
    const local_protection = _locale.protection;

    for (let s = 0; s < rangeList.length; s++) {
        let r1 = rangeList[s].row[0], r2 = rangeList[s].row[1];
        let c1 = rangeList[s].column[0], c2 = rangeList[s].column[1];

        for (let r = r1; r <= r2; r++) {
            for (let c = c1; c <= c2; c++) {
                const cell = sheetFile.data[r][c] || {}
                let isLock = cell.lo === undefined || cell.lo === 1, // 单元格是否锁定
                    isPass = checkProtectionLockedSqref(r, c, aut, local_protection, true, isLock);
                if (!isPass) {
                    return false;
                }
            }
        }
    }

    return true;
}

//selectLockedCells  , selectunLockedCells  and cell state
export function checkProtectionSelectLockedOrUnLockedCells(r, c, sheetIndex) {
    const _locale = locale();
    const local_protection = _locale.protection;
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);
    if (sheetFile == null) {
        return true;
    }

    if (sheetFile.config == null || sheetFile.config.authority == null) {
        return true;
    }

    let data = sheetFile.data, cell = data[r][c], aut = sheetFile.config.authority;

    if (aut == null || aut.sheet == null || aut.sheet == 0) {
        return true;
    }

    if (cell && cell.lo === 0) { // lo为0的时候才是可编辑
        if (aut.selectunLockedCells == 1 || aut.selectunLockedCells == null) {
            return true;
        }
        else {
            return false;
        }
    }
    else {//locked??
        let isAllEdit = checkProtectionLockedSqref(r, c, aut, local_protection, false);//dont alert password model
        if (isAllEdit) {//unlocked
            if (aut.selectunLockedCells == 1 || aut.selectunLockedCells == null) {
                return true;
            }
            else {
                return false;
            }
        }
        else {//locked
            if (aut.selectLockedCells == 1 || aut.selectLockedCells == null) {
                return true;
            }
            else {
                return false;
            }
        }
    }


}



//selectLockedCells or selectunLockedCells authority, highlight cell 
export function checkProtectionAllSelected(sheetIndex) {
    const _locale = locale();
    const local_protection = _locale.protection;
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);
    if (sheetFile == null) {
        return true;
    }

    if (sheetFile.config == null || sheetFile.config.authority == null) {
        return true;
    }

    let aut = sheetFile.config.authority;

    if (aut == null || aut.sheet == null || aut.sheet == 0) {
        return true;
    }

    let selectunLockedCells = false;
    if (aut.selectunLockedCells == 1 || aut.selectunLockedCells == null) {
        selectunLockedCells = true;
    }

    let selectLockedCells = false;
    if (aut.selectLockedCells == 1 || aut.selectLockedCells == null) {
        selectLockedCells = true;
    }

    if (selectunLockedCells && selectLockedCells) {
        return true;
    }

    return false;
}

//formatCells authority, bl cl fc fz ff ct  border etc.
export function checkProtectionFormatCells(sheetIndex) {

    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);
    if (sheetFile == null) {
        return true;
    }

    if (sheetFile.config == null || sheetFile.config.authority == null) {
        return true;
    }

    let aut = sheetFile.config.authority;

    if (aut == null || aut.sheet == null || aut.sheet == 0) {
        return true;
    }

    if (aut.formatCells == 1 || aut.formatCells == null) {
        return true;
    }

    const _locale = locale();
    const local_protection = _locale.protection;

    let ht;
    if (aut.hintText != null && aut.hintText.length > 0) {
        ht = aut.hintText;
    }
    else {
        ht = local_protection.defaultSheetHintText;
    }
    tooltip.info("", ht);

    return false;
}

//formatColumns authority: controll column hidden and width
//formatRows authority: controll row hidden and height
//insertColumns authority
//insertRows authority
//insertHyperlinks authority:Hyperlinks is not incomplete
//deleteColumns authority
//deleteRows authority
//sort authority
//filter authority
//usePivotTablereports authority
//editObjects authority: insert,delete,update for image, chart, comment,shape etc. 
//editScenarios authority: Scenarios features is uncompleted

export function checkProtectionAuthorityNormal(sheetIndex, type = "formatColumns", isAlert = true) {

    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);
    if (sheetFile == null) {
        return true;
    }

    if (sheetFile.config == null || sheetFile.config.authority == null) {
        return true;
    }

    let aut = sheetFile.config.authority;

    if (aut == null || aut.sheet == null || aut.sheet == 0) {
        return true;
    }

    if (aut[type] == 1 || aut[type] == null) {
        return true;
    }

    if (isAlert) {
        const _locale = locale();
        const local_protection = _locale.protection;

        let ht;
        if (aut.hintText != null && aut.hintText.length > 0) {
            ht = aut.hintText;
        }
        else {
            ht = local_protection.defaultSheetHintText;
        }
        tooltip.info("", ht);
    }

    return false;
}