/**
 * It is one of the js in index.html.
 * index.html is made of operations List , dashboard and topPage.
 *
 * @since cms:1.4.3.2&1.4.3.3 web:1.0
 */

var OL = {};

OL.operationList; //Operation json data
OL.operationGroupMaster; //category(operationGroupMaster) json data
OL.isOperationGroupMaster = 0; //0: category(operationGroupMaster) not exist 1: category(operationGroupMaster) exist
OL.operationSearchCriteria;

OL.sortIndex;
OL.operationGroupMasterId;

/**
 * process on page load.
 * 1.get all data.
 * 2.show operationList.
 * 3.show category(operationGroupMaster).
 */
OL.init = function () {
    console.log('OperationList start');

    //get all data of operation list scene
    OL.getAllDataWeb();

    //show operation list
    OL.createOperationList(OL.operationList);

    //show category(operationGroupMaster)
    OL.createCategory();
};

/**
 * get operation list all data
 * 1.operation list
 * 2.category(operationGroupMaster) list
 *
 * @param {String} searchKeyword
 * @param {Number} sortIndex
 * @param {String} searchStartDate
 * @param {String} searchEndDate
 * @param {Number} operationGroupMasterId
 */
OL.getAllDataWeb = function (searchKeyword, sortIndex, searchStartDate, searchEndDate, operationGroupMasterId) {
    let param = {};
    param.sid = COMMON.getSid();
    param.operationName = searchKeyword;
    param.sort = sortIndex;
    param.startDate = searchStartDate;
    param.endDate = searchEndDate;
    param.operationGroupMasterId = operationGroupMasterId;
    const url = CONSTANT.URL.BASE_CMS + ClientData.userInfo_accountPath() + CONSTANT.URL.BASE_CHECKAPI + CONSTANT.URL.ALL_OPERATION_LIST;

    COMMON.cmsAjax(url, param, false, function (json) {
        OL.operationList = json.operationList;
        OL.operationGroupMaster = json.operationGroupMasterList;
        OL.isOperationGroupMaster = json.isOperationGroupMaster;
        OL.operationSearchCriteria = json.operationSearchCriteria;
        OL.setSearchInfoWeb();
    });
};

/**
 * set search criteria when Initial display.
 */
OL.setSearchInfoWeb = function () {
    OL.sortIndex = OL.operationSearchCriteria.sort;
    $('#searchTaskName').val(OL.operationSearchCriteria.operationName);
    $('#searchStartDate').val(OL.operationSearchCriteria.startDate);
    $('#searchEndDate').val(OL.operationSearchCriteria.endDate);
    OL.operationGroupMasterId = OL.operationSearchCriteria.operationGroupMasterId;
};

/**
 * create operation list
 */
OL.createOperationList = function (operationList) {
    //Initialization
    OL.initActiveSortIndex();
    $('#operationTable').empty();

    if (!operationList) {
        return;
    }

    //create & show
    for (let i = 0; i < operationList.length; i++) {
        let operationTR = $('<tr/>');

        const operationNameTd = $(
            "<td class='operationId_" +
                operationList[i].operationId +
                "'><a href=\"javascript:OL.sendOperation('" +
                operationList[i].operationId +
                "', '" +
                operationList[i].operationType +
                "', '" +
                operationList[i].reportType +
                "', '" +
                operationList[i].enableAddReport +
                "');\"  class='d-block text-black text-decoration-none mb-1'>" +
                operationList[i].operationName +
                "</a><div class='fa-sm mobile_operation_date'><i class='far fa-clock fa-blue' style='color:blue;margin-right:10px'></i>" +
                OL.setOperationDate(operationList[i].operationStartDate) +
                ' ~ ' +
                OL.setOperationDate(operationList[i].operationEndDate) +
                '</div></td>',
        );
        const operationStartDateTd = $('<td/>', { class: 'operationStartDate' }).text(OL.setOperationDate(operationList[i].operationStartDate));
        const operationEndDateTd = $('<td/>', { class: 'operationEndDate' }).text(OL.setOperationDate(operationList[i].operationEndDate));

        operationTR.append(operationNameTd);
        operationTR.append(operationStartDateTd);
        operationTR.append(operationEndDateTd);

        $('.table tbody').append(operationTR);
    }
};

/**
 * add color to any sorting type when sortIndex exsist
 *
 * @param {Number} sortIndex
 */
OL.initActiveSortIndex = function (sortIndex) {
    if (!sortIndex && !OL.sortIndex) {
        OL.sortIndex = CONSTANT.SORT_TYPE.START_DATE_DESC;
    }

    $('.sort-type').each(function () {
        const sortType = $(this).data('sort');
        if (sortType == OL.sortIndex) {
            $('.sort-type').removeClass('active');
            $(this).addClass('active');
        }
    });
};

/**
 * set date for OperationList
 *
 * @param {String} date
 * @returns operationDate
 */
OL.setOperationDate = function (date) {
    const operationDate = date.replace(/-/g, '/').substring(0, 10);
    return operationDate;
};

/**
 * create category(operationGroupMaster).
 */
OL.createCategory = function () {
    if (!OL.isOperationGroupMaster) {
        return;
    }

    OL.initCategory();
    OL.createBreadcrumbList();
    OL.createCategoryList();
    OL.acdMenu();
};

/**
 * Initial processing of category(operationGroupMaster).
 */
OL.initCategory = function () {
    if (!OL.isOperationGroupMaster) {
        return;
    }

    $('#operationGroupMasterButton').removeClass('d-none');
    OL.setCategoryHeight();
    $(window).resize(function () {
        OL.setCategoryHeight();
    });
};

/**
 * change height category(operationGroupMaster)
 */
OL.setCategoryHeight = function () {
    const CATEGORY_HEIGHT = $('footer').offset().top - $('#category-menu').offset().top;
    $('#category-menu').css('overflow', 'scroll');
    $('#category-menu').height(CATEGORY_HEIGHT);
    $('#overlayDiv').height(CATEGORY_HEIGHT);
};

/**
 * create Breadcrumb List
 */
OL.createBreadcrumbList = function () {
    if (!OL.isOperationGroupMaster) {
        return;
    }

    $('#groupMasterPath').empty();
    if (typeof OL.operationGroupMasterId == 'undefined' || OL.operationGroupMasterId == 0) {
        $('#groupMasterPath').append('<li class="breadcrumb-item"><a href="#" class="text-decoration-none text-dark">' + COMMON.getMsg('all') + '</a></li>');
    } else {
        let treeList = [];
        OL.createBreadcrumbTree(treeList, OL.operationGroupMasterId);
        treeList.forEach(function (operationGroupMaster) {
            $('#groupMasterPath').append(
                '<li class="breadcrumb-item"><a onclick="OL.changeOperationGroupMaster(' +
                    operationGroupMaster.operationGroupMasterId +
                    ');" class="text-decoration-none text-dark">' +
                    operationGroupMaster.operationGroupMasterName +
                    '</a></li>',
            );
        });
    }
};

/**
 * create Breadcrumb tree List
 *
 * @param {list} treeList
 * @param {string} operationGroupMasterId
 * @returns
 */
OL.createBreadcrumbTree = function (treeList, operationGroupMasterId) {
    if (operationGroupMasterId == 0) {
        return treeList;
    }

    const groupMaster = OL.operationGroupMaster.filter(it => it.operationGroupMasterId == operationGroupMasterId)[0];
    OL.createBreadcrumbTree(treeList, groupMaster.parentOperationGroupMasterId);
    treeList.push(groupMaster);
    return treeList;
};

/**
 * create category(operationGroupMaster) structure
 */
OL.createCategoryList = function () {
    if (!OL.isOperationGroupMaster) {
        return;
    }

    //Create a side menu category structure
    $('.group-category-list').remove();
    OL.operationGroupMaster.sort(function (a, b) {
        if (a.operationGroupMasterLevel < b.operationGroupMasterLevel) return -1;
        if (a.operationGroupMasterLevel > b.operationGroupMasterLevel) return 1;
        return 1;
    });

    //common
    const noCategory = $("<dl id='groupMasterId_0' class='group-category-list'><dt><a onclick='OL.changeOperationGroupMaster(0);'>" + COMMON.getMsg('all') + '</a></dt></dl>');

    $('#category-menu').append(noCategory);

    //create category(operationGroupMaster) structure
    for (let i = 0; i < OL.operationGroupMaster.length; i++) {
        if (OL.operationGroupMaster[i].operationGroupMasterLevel == 0) {
            const categoryParent = $(
                '<dl id=groupMasterId_' +
                    OL.operationGroupMaster[i].operationGroupMasterId +
                    " class='group-category-list' style='overflow-x:auto;'><dt class='menu-ttl'><a onclick='OL.changeOperationGroupMaster(" +
                    OL.operationGroupMaster[i].operationGroupMasterId +
                    ");'>" +
                    OL.operationGroupMaster[i].operationGroupMasterName +
                    '</a></dt></dl>',
            );
            $('#category-menu').append(categoryParent);
        } else {
            if ($('#groupMasterId_' + OL.operationGroupMaster[i].parentOperationGroupMasterId + '>ul').length > 0) {
                const categoryChild = $(
                    "<li  id='groupMasterId_" +
                        OL.operationGroupMaster[i].operationGroupMasterId +
                        "' class=''><p class='category-li group-level-" +
                        OL.operationGroupMaster[i].operationGroupMasterLevel +
                        "'><a class='category-a' onclick='OL.changeOperationGroupMaster(" +
                        OL.operationGroupMaster[i].operationGroupMasterId +
                        ");'>" +
                        OL.operationGroupMaster[i].operationGroupMasterName +
                        '</a></p></li>',
                );
                $('#groupMasterId_' + OL.operationGroupMaster[i].parentOperationGroupMasterId + ' >ul').append(categoryChild);
            } else {
                const groupParents = '#groupMasterId_' + OL.operationGroupMaster[i].parentOperationGroupMasterId;
                $(groupParents + ' > p').addClass('sub-menu-ttl');
                const categoryChild = $(
                    "<ul style='display:none;' class=''><li class='' id='groupMasterId_" +
                        OL.operationGroupMaster[i].operationGroupMasterId +
                        "' class=''><p class='category-li group-level-" +
                        OL.operationGroupMaster[i].operationGroupMasterLevel +
                        "'><a class='category-a' onclick='OL.changeOperationGroupMaster(" +
                        OL.operationGroupMaster[i].operationGroupMasterId +
                        ");'>" +
                        OL.operationGroupMaster[i].operationGroupMasterName +
                        '</a></p></li></ul>',
                );
                $('#groupMasterId_' + OL.operationGroupMaster[i].parentOperationGroupMasterId).append(categoryChild);
            }
        }
    }
};

/**
 * Open/close category(operationGroupMaster) drawer menu
 */
OL.acdMenu = function () {
    //Hide accordion contents by default
    $('.drawer-menu dd').css('display', 'none');
    $('.drawer-menu2 ul').css('display', 'none');

    //second accordion
    $('.drawer-menu dt').on('click', function () {
        $('.sub-menu-ttl').removeClass('openAcd').next().slideUp('fast');
        $('.drawer-menu dt').not(this).removeClass('open').next().slideUp('fast');
        $(this).toggleClass('open').next().slideToggle('fast');
    });

    //third accordion
    $('.sub-menu-ttl').on('click', function () {
        $('.sub-menu-ttl').not($(this)).not($(this).parents().siblings('p')).removeClass('openAcd').next().slideUp('fast');
        $(this).toggleClass('openAcd').next().slideToggle('fast');
    });
};

/**
 * Sort the operationList by screen operation
 *
 * @param {Object} sortType
 */
OL.changeSortType = function (sortType) {
    $('.sort-type').removeClass('active');
    $(sortType).addClass('active');
    OL.sortIndex = $(sortType).attr('data-sort');
    const sortStr = sortType.dataset.sort;
    const sortNumber = parseFloat(sortStr);
    OL.sortOperationList(sortNumber);
    OL.createOperationList(OL.operationList);
};

/**
 * sort the operationList
 *
 * @param {Number} sortNumber
 */

OL.sortOperationList = function (sortNumber) {
    switch (sortNumber) {
        case CONSTANT.SORT_TYPE.NAME:
            OL.operationList.sort(function (a, b) {
                if (a.operationName > b.operationName) return 1;
                if (a.operationName < b.operationName) return -1;
                return 0;
            });
            break;
        case CONSTANT.SORT_TYPE.START_DATE_DESC:
            OL.operationList.sort(function (a, b) {
                if (OL.setOperationDate(a.operationStartDate) < OL.setOperationDate(b.operationStartDate)) return 1;
                if (OL.setOperationDate(a.operationStartDate) > OL.setOperationDate(b.operationStartDate)) return -1;
                return 0;
            });
            break;
        case CONSTANT.SORT_TYPE.START_DATE_ASC:
            OL.operationList.sort(function (a, b) {
                if (OL.setOperationDate(a.operationStartDate) > OL.setOperationDate(b.operationStartDate)) return 1;
                if (OL.setOperationDate(a.operationStartDate) < OL.setOperationDate(b.operationStartDate)) return -1;

                return 0;
            });
            break;
        case CONSTANT.SORT_TYPE.TYPE:
            OL.operationList.sort(function (a, b) {
                if (a.operationType < b.operationType) return 1;
                if (a.operationType > b.operationType) return -1;
                return 0;
            });
            break;
        case CONSTANT.SORT_TYPE.LAST_EDIT_DATE:
            const defaultDate = '1900-01-01 09:00:00';
            OL.operationList.sort(function (a, b) {
                if (!a.operationOpenDate) {
                    a.operationOpenDate = defaultDate;
                }
                if (!b.operationOpenDate) {
                    b.operationOpenDate = defaultDate;
                }
                if (a.operationOpenDate < b.operationOpenDate) return 1;
                if (a.operationOpenDate > b.operationOpenDate) return -1;
                return 0;
            });
            break;
    }
};

/**
 * search operarionList
 */
OL.search = function () {
    COMMON.showLoading();
    const searchKeyword = $('#searchTaskName').val();
    const searchStartDate = $('#searchStartDate').val();
    const searchEndDate = $('#searchEndDate').val();

    if (searchStartDate && searchEndDate && searchStartDate > searchEndDate) {
        COMMON.closeLoading();
        COMMON.displayAlert('dateError');
        return;
    }

    OL.getAllDataWeb(searchKeyword, OL.sortIndex, searchStartDate, searchEndDate, OL.operationGroupMasterId);
    OL.createOperationList(OL.operationList);
    OL.createCategory();
    COMMON.closeLoading();
};

/**
 * change the operationList by select the category(OperationGroupMaster)
 * @param {Number} operationGroupMasterId
 */
OL.changeOperationGroupMaster = function (operationGroupMasterId) {
    if ($('#category-menu').hasClass('open')) {
        $('#category-toggle-button').click();
        $('body').css('overflow', 'visible');
    }
    OL.operationGroupMasterId = operationGroupMasterId;
    OL.search();
};

/**
 * open the category(OperationGroupMaster)
 */
OL.openCategory = function () {
    window.scrollTo(0, 0);
    if ($('#category-menu').hasClass('open')) {
        $('body').css('overflow', 'visible');
    } else {
        $('body').css('overflow', 'hidden');
    }
};

/**
 * reset search
 */
OL.resetSearch = function () {
    $('#searchTaskName').val('');
    $('#searchStartDate').val('');
    $('#searchEndDate').val('');
    OL.changeSortType($('#defaultSort'));
};

/**
 * Transition to the report form or operation list screen
 *
 * @param {String} operationId
 */
OL.sendOperation = function (operationId, operationType, reportType, enableAddReport) {
    //save operation logs. needed for sorting
    OL.saveOperationReadingLog(operationId, operationType, reportType);

    //Transition to the report form or operation list screen
    let params = {};
    params.sid = COMMON.getSid();
    params.operationId = operationId;
    const url = OL.createUrlOfOperation(enableAddReport, reportType);
    COMMON.postCommunication(url, params);
};

/**
 * save operation logs. needed for sorting
 *
 * @param {String} operationId
 * @param {String} operationType
 * @param {String} reportType
 */
OL.saveOperationReadingLog = function (operationId, operationType, reportType) {
    let params = {};
    params.sid = COMMON.getSid();
    params.operationId = operationId;
    params.deviceType = CONSTANT.DEVICE_TYPE.WEB;
    params.operationType = operationType;
    params.reportType = reportType;
    const date = new Date();
    params.viewingStartDate = date.toLocaleString();
    const url = CONSTANT.URL.BASE_CMS + ClientData.userInfo_accountPath() + CONSTANT.URL.BASE_HTML + CONSTANT.URL.OPERATION_VIEW_LOG;
    COMMON.cmsAjax(url, params, false);
};

/**
 * return url of cms Operation Scene
 *
 * @param {boolean} enableAddReport
 * @param {Number} reportType
 * @returns url
 */
OL.createUrlOfOperation = function (enableAddReport, reportType) {
    let baseUrl = CONSTANT.URL.BASE_CMS + ClientData.userInfo_accountPath() + CONSTANT.URL.BASE_HTML;
    if (reportType == CONSTANT.REPORT_TYPE.ROUTINE || enableAddReport == '1') {
        return baseUrl + CONSTANT.URL.TASK_REPORT_LIST;
    } else {
        return baseUrl + CONSTANT.URL.ENTRY_REPORT;
    }
};
