//@ts-check
"use strict";

(function () {
    /**
     * the module that will contain this component
    */
    var module = "app";
    var component = {
        selector: `assmnt-ctlg-filters`,
        bindings: {
            options: "=?",
            ngModel: "=?",

            //  bindings go here
        },
        templateUrl: "_assess/assessments/catalog/assmnt-ctlg-filters/assmnt-ctlg-filters-cf35a780f5.html",
        controllerAs: "ctrl",
        controller: /** @class */ function (
            $rootScope,
            $scope,
            $timeout,
            $location,
            BestDropdown,
            config,
            assessmentService,
            $filter,
            newCoursesService
        ) {
            let ctrl = this;
            ctrl.options = ctrl.options || null;
            ctrl.ngModel = Object.assign(provideDefaultModel(), ctrl.options.default || {})
            ctrl.fieldsObj = {};
            ctrl.denominator = Date.now() + Math.floor(Math.random() * 1000);
            ctrl.dateRange = {
                startDate: null,
                endDate: null,
                dateType: ""
            };
            $scope.cronbach = {
                min: 0,
                max: 1,
            };

            console.log(ctrl.ngModel)

            $scope.$watch('cronbach', function (newValue, oldValue, scope) {

                if (newValue.min != oldValue.min || newValue.max != oldValue.max) {
                    $scope.btnDisabled = false;
                    $scope.applyDistrBands = true
                }

                $scope.cronbachMin = $scope.cronbach.min
                $scope.cronbachMax = $scope.cronbach.max
                $scope.cronbach['min'] = $scope.cronbachMin
                $scope.cronbach['max'] = $scope.cronbachMax

            }, true);


            ctrl.ngUnsubscribe = new rxjs.Subject();
            ctrl.options = Object.assign(provideDefaultOption(), ctrl.options)

            ctrl.checkFilter = checkFilter;
            ctrl.resetFilters = resetFilters;
            ctrl.search = search;
            ctrl.getMode = getMode;
            ctrl.isFilterAvailable = isFilterAvailable;
            ctrl.setDateRangeFilterBy = setDateRangeFilterBy;
            ctrl.turnDateFilterOnOff = turnDateFilterOnOff;

            function sendData(data){
                if(!ctrl.options || !ctrl.options.stream$) return;
                let dataObj = Object.assign(data, {from: "assessFilters.ctrl"})
                ctrl.options.stream$.next(dataObj);
            }

            if(ctrl.options && ctrl.options.stream$){

                ctrl.options.stream$.pipe(
                    rxjs.operators.takeUntil(ctrl.ngUnsubscribe),
                    rxjs.operators.filter(ev => ev.from !== 'assessFilters.ctrl'),
                    // rxjs.operators.skip(1),
                    rxjs.operators.distinct()
                ).subscribe((data) => {
                    if(data && data.action == "refresh") search()
                });

            }
            function isFilterAvailable (filterName){
                if(!ctrl.options || !ctrl.options.filters || ctrl.options.filters.length == 0) return true;
                else return ctrl.options.filters.includes(filterName)
            }
            function search(){
                const filters = angular.copy(ctrl.ngModel);
                let loc = getLocation();
                filters['omitBank'] = loc == "/eLearning/eCourse" ?? false;
                filters['cronbach'] = $scope.cronbach;
                if(!ctrl.options.doNotStoreData) localStorage.setItem(`Assess.Filters.${getLocation()}`, JSON.stringify(filters));

                sendData({action: "search", filters: filters})
            }

            function provideDefaultOption (){
                return {
                    mode: "catalog", //catalog | testManager
                    doNotStoreData: false
                }
            }
            //dynamic filters
            ctrl.filters = getDynamicFilters();


            function getDynamicFilters (){
                let data = [
                    {"id" : "author", "name" : "Author", "type": "dropdown", setFct: setAuthorFilter, data: []},
                    {"id" : "grades", "name" : "Grade", "type": "tag", setFct: fetchGrade, data: []},
                    {"id" : "subjects", "name" : "Subject", "type": "checkbox", setFct: fetchSubjects, data: []},
                    {"id" : "contentAreas", "name" : "Content Area", "type": "dropdown", setFct: setContentAreaFilter, data: []},
                    {"id" : "banks", "name" : "Bank", "type": "checkbox", setFct: fetchBanks, data: []},
                    {"id" : "testTypes", "name" : "Test Type", "type": "checkbox", setFct: fetchTestType, data: []},
                    {"id" : "contentTypes", "name" : "Content Type", "type": "checkbox", setFct: fetchContentType, data: []},
                    {"id" : "status", "name" : "Status", "type": "checkbox", setFct: assessmentService.getStatus, data: []},
                    {"id" : "activeWindow", "name" : "Active Window", "type": "checkbox", setFct: assessmentService.getActiveWindow, data: []},
                    {"id" : "cronbach", "name" : "Cronbach's Alpha", "type": "slider", setFct: setCronbachFilter, data: $scope.cronbach}
                ]
                if(["moduleAssessAddModal", "moduleAssessCopyModal"].includes(getDirectiveLocation())) {
                    let foundIndex,
                    courseObj = {"id" : "digitalCourseIds", "name" : "Course", "type": "checkbox", setFct: fetchDigitalCourse, data: []};
                    foundIndex = data.findIndex(x => x.id == "banks");
                    if(foundIndex >= 0) data[foundIndex] = courseObj;
                    else data.push(courseObj);
                }
                if(getMode() == "testManager") data = data.filter(e=>!["author", "contentTypes", "status", "activeWindow"].includes(e.id))
                else data = data.filter(e=>isFilterAvailable(e.id))
                return data;
            }
            function provideDefaultModel(){
                let data = {
                    sharedAndTargeted: false,
                    searchType: [{id: 'MyAssessments', text: 'My Assessments'}],
                    sharedBySchools: [],
                    description: "",
                    idTextSearch: "",
                    dateRange: null
                }
                if (getMode() == "testManager") data["onlyActiveAdministrationWindow"] = true
                else {
                    for (const i in data){
                        if(!isFilterAvailable(i)) delete data[i]
                    }
                }
                return data
            }
            //////////////////////

            function activate() {
                setFilters()
                //  initialization logic goes here
                let destroy = $scope.$on("$destroy", () => {
                    destroy();

                    ctrl.ngUnsubscribe.next();
                    ctrl.ngUnsubscribe.complete();
                });
            }

            function checkFilter (filterId, preselect=true){
                for (let i = 0; i <  ctrl.filters.length; i++) {
                    const element =  ctrl.filters[i];
                    if(element.id == filterId && element.data){
                        if(preselect) element.data.map(e=> ctrl.ngModel[filterId].map(el=>el.id).includes(e.id)? e.selected = true: false)
                        ctrl.ngModel[filterId] = element.data.filter(e => e.selected)
                        break
                    }
                }
            }

            function resetFilters(filterId = null) {
                if (filterId == "cronbach") {
                    $scope.cronbach = {
                        min: 0,
                        max: 1,
                    };
                }
                $timeout(() => {
                    if(!filterId){
                        ctrl.ngModel = Object.assign(provideDefaultModel(), ctrl.options.default || {})

                        if(!ctrl.options.doNotStoreData) localStorage.removeItem(`Assess.Filters.${getLocation()}`);

                        setFilters();
                    }
                    else {
                        ctrl.filters.forEach((filter, index) => {
                            if(filter.setFct && filterId == filter.id){
                                if(!ctrl.options.doNotStoreData) {
                                    const storedFilters = localStorage.getItem(`Assess.Filters.${getLocation()}`);
                                    if (storedFilters) {
                                        const filters = JSON.parse(storedFilters);
                                        // filters.idTextSearch="";
                                        // filters.description="";
                                        filters[filter.id] = [];

                                        localStorage.setItem(`Assess.Filters.${getLocation()}`, JSON.stringify(filters));
                                    }
                                }

                                setFilterData(filter).then(()=>{});
                            }
                        })
                    }
                })
            }

            function setFilters(){
                setAssessFilter();
                setDateRangeFilter();
                setCronbachFilter();
                ctrl.filters.forEach(function(filter, index){
                    if(filter.setFct){
                        setFilterData(filter)
                    }

                })
            }

            function setFilterData(filter) {
                return new Promise(function (resolve, reject) {
                    if(!ctrl.ngModel[filter.id]) ctrl.ngModel[filter.id] = [];

                    if(!ctrl.options.doNotStoreData) {
                        const storedFilters = localStorage.getItem(`Assess.Filters.${getLocation()}`);
                        if (storedFilters){
                            ctrl.ngModel = JSON.parse(storedFilters);
                            // ctrl.ngModel.idTextSearch="";
                            // ctrl.ngModel.description="";
                        }
                    }

                    if (filter.type == "dropdown") {
                        filter.setFct();
                        resolve(null);
                    }

                    if (filter.type == "tag") {
                        filter.setFct().then((res) => {
                            res = res.map((item) => {
                                if (ctrl.ngModel[filter.id])
                                    item.selected = ctrl.ngModel[filter.id]
                                    .includes(item.id);
                                return item;
                            });
                            filter.data = res;
                            checkFilter(filter.id);
                            resolve(null);
                        });
                    }

                    if (filter.type == "checkbox") {
                        filter.setFct().then((res) => {
                            res = res.map((item) => {
                                if (ctrl.ngModel[filter.id])
                                    item.selected = ctrl.ngModel[filter.id]
                                    .includes(item.id);
                                return item;
                            });
                            filter.data = res;
                            checkFilter(filter.id);
                            resolve(null);
                        });
                    }
                })
            }

            function fetchBanks(){
                return new Promise(function (resolve, reject) {
                    // if pl?
                    // if() return resolve([{
                    //     label: "Professional Learning",
                    //     value: "Professional Learning",
                    //     selected: false
                    // }])
                    return assessmentService.getBanks().then((res)=>{
                        resolve(res.filter(e=> (e.value != "Professional Learning" && e.source != "digitalCourse") ||(e.value && e.value.toLowerCase().includes("cva"))).map(e=>{
                            return {
                                id: e.label,
                                text: e.value
                            }
                        }))
                    })

                })
            }

            function fetchDigitalCourse(){
                return new Promise(function (resolve, reject) {
                    // if pl?
                    // if() return resolve([{
                    //     label: "Professional Learning",
                    //     value: "Professional Learning",
                    //     selected: false
                    // }])
                    return newCoursesService.fetch({
                        filters: {
                            limit: Number.MAX_SAFE_INTEGER,
                        },
                        shape: ["courseId", "digitalCourseId", "courseName"]
                    })
                    .then(res => res.map((e) => {
                        return {
                            text: e.courseName,
                            id: e.digitalCourseId
                        }
                    }))
                    .then((res)=>{
                        resolve(res)
                    })

                })
            }

            function fetchGrade(){
                return new Promise(function (resolve, reject) {
                    // grades filter
                    // if pl?
                    // if() return resolve([{
                    //         value: "District",
                    //         label: "District",
                    //         selected: $rootScope.assessmentSearchSelectedFilter.grades.indexOf("District") > -1 ? true: false
                    //     }])
                    return assessmentService.getGrades().then((res)=>{
                        resolve(res.map(e=>{
                            return {id: e, text: e}
                        }))
                    })

                })

            }

            function fetchSubjects(){
                return new Promise(function (resolve, reject) {
                    // if pl?
                    // if() {
                    //     $http({
                    //         method: 'POST',
                    //         url: config.teachserver + '/getSystemParms',
                    //         data: "",
                    //         headers: $rootScope.headers
                    //     }).success(function (response) {
                    //         $scope.subjects = [];
                    //         angular.forEach(response.resourceMetadata.subjects, function(subject,index){
                    //             $scope.subjects.push({
                    //                 id: index,
                    //                 text: subject
                    //             })
                    //         })
                    //     }).error(function(err) {
                    //         $rootScope.openAlert("danger","times","Failed to get attributes!");
                    //     });

                    // }


                    return assessmentService.getSubjects().then((res)=>{
                        resolve(res.map(e =>
                            {
                                return {id: e, text: e}
                            })
                        )
                    });
                })
            }

            function fetchTestType(){
                return new Promise(function (resolve, reject) {
                    return assessmentService.getTypes().then((res)=>{
                        resolve(res.map(e =>
                            {
                                return {id: e.value, text: e.label}
                            })
                        )
                    });
                })
            }

            function fetchContentType(){
                return new Promise(function (resolve, reject) {
                    return assessmentService.getContentTypes().then((res)=>{
                        resolve(res.map(e =>
                            {
                                return {id: e.value, text: e.label}
                            })
                        )
                    });
                })
            }

            function fetchSubjects(){
                return new Promise(function (resolve, reject) {
                    // if pl?
                    // if() {
                    //     $http({
                    //         method: 'POST',
                    //         url: config.teachserver + '/getSystemParms',
                    //         data: "",
                    //         headers: $rootScope.headers
                    //     }).success(function (response) {
                    //         $scope.subjects = [];
                    //         angular.forEach(response.resourceMetadata.subjects, function(subject,index){
                    //             $scope.subjects.push({
                    //                 id: index,
                    //                 text: subject
                    //             })
                    //         })
                    //     }).error(function(err) {
                    //         $rootScope.openAlert("danger","times","Failed to get attributes!");
                    //     });

                    // }


                    return assessmentService.getSubjects().then((res)=>{
                        resolve(res.map(e =>
                            {
                                return {id: e, text: e}
                            })
                        )
                    });
                })
            }

            function setAssessFilter(){
                setDD(
                    "searchType",
                    {
                        data: Object.values(
                            getSearchType()
                            // res.map(e=>{return{id: e, text: e}})
                        ),
                    }
                )
            }

            function turnDateFilterOnOff() {
                $scope.dateFilterOn = !$scope.dateFilterOn;
                if($scope.dateFilterOn) ctrl.ngModel.dateRange = ctrl.dateRange;
                if(!$scope.dateFilterOn) ctrl.ngModel.dateRange = {};
            }

            function setDateRangeFilterBy(val){
                    ctrl.dateRange.dateType = val;
            }

            function setDateRangeFilter(){
                $scope.dateFilterOn = false;
                var schoolYear = $rootScope.userSettings.reportControls.schoolYear;
                ctrl.dateRange.startDate = new Date();
                ctrl.dateRange.endDate = new Date();
                function convertTimezone(date){
                    new Date(Date.UTC(date));
                    return date;
                }
                var tempStartDate = convertTimezone(ctrl.dateRange.startDate);
                var tempEndDate = convertTimezone(ctrl.dateRange.endDate);
                tempEndDate.setDate(tempEndDate.getDate() + 1);
                ctrl.dateRange.startDate = $filter('date')(tempStartDate, "MM/dd/yyyy HH:mm");
                ctrl.dateRange.endDate = $filter('date')(tempEndDate, "MM/dd/yyyy HH:mm");
                $("#StartDateFilterAssess").daterangepicker({
                    drops: "auto",
                    locale: {
                        format: "MM/DD/YYYY hh:mm A"
                    },
                    timePicker: true,
                    timePicker24Hour: false,
                    singleDatePicker: true,
                    showDropdowns: true,
                    minYear: parseInt(moment().format("YYYY"), 10) - 1,
                    maxYear: parseInt(moment().format("YYYY"), 10) + 1,
                    startDate: ctrl.dateRange.startDate
                    // startDate: ($("#StartDateFilter").data('daterangepicker') ? ctrl.dateRange.startDate  : "07/01/20" + schoolYear.split("-")[0] + " 11:46") //.subtract(1, 'years').startOf('month').startOf('day'))
                });
                $("#EndDateFilterAssess").daterangepicker({
                    drops: "auto",
                    locale: {
                        format: "MM/DD/YYYY hh:mm A"
                    },
                    timePicker: true,
                    timePicker24Hour: false,
                    singleDatePicker: true,
                    showDropdowns: true,
                    minYear: parseInt(moment().format("YYYY"), 10) - 1,
                    maxYear: parseInt(moment().format("YYYY"), 10) + 1,
                    startDate: ctrl.dateRange.endDate
                });
            }

            function getSearchType(){
                if(getMode() == "testManager"){
                    let data = [
                        {id: 'AllAssessments', text: 'All Assessments'},
                        {id: 'MyAssessments', text: 'My Assessments'},
                        {id: 'RequiredAssessments', text: 'Required Assessments'},
                    ]
                    if($rootScope.userSettings.setSchoolLevelTargets || $rootScope.userSettings.hasNoOverallRestriction) {
                        data.push({
                            id: "TargetedBySchool",
                            text: "Targeted by School"
                        });
                    }
                    return (data)
                }
                return ([
                    {id: 'AllAssessments', text: 'All Assessments'},
                    {id: 'MyAssessments', text: 'My Assessments'},
                    {id: 'Shared', text: 'Shared'},
                    {id: 'RequiredAssessments', text: 'Required Assessments'},
                    {id: 'Archived', text: 'Archived'},
                ])


            }

            function getMode(){
                return ctrl.options.mode
            }

            function getDirectiveLocation(){
                return ctrl.options.location
            }

            function getStringData (){
                let searchType = "",
                idTextSearch = "",
                descriptionTextSearch = "",
                grades = [],
                subjects = [],
                contentAreas = [],
                contentTypes = [],
                banks = [],
                testTypes = [],
                status = "",
                hasActiveWindow = "",
                cronbach = {};

                if(ctrl.ngModel["searchType"] && ctrl.ngModel["searchType"][0]) searchType = ctrl.ngModel["searchType"][0].id;
                if(ctrl.ngModel["idTextSearch"] && ctrl.ngModel["idTextSearch"] != "") idTextSearch = ctrl.ngModel["idTextSearch"];
                if(ctrl.ngModel["descriptionTextSearch"] && ctrl.ngModel["descriptionTextSearch"] != "") descriptionTextSearch = ctrl.ngModel["descriptionTextSearch"];
                if(ctrl.ngModel["grades"] && ctrl.ngModel["grades"].length > 0) grades = ctrl.ngModel["grades"].map(e=>e.id);
                if(ctrl.ngModel["subjects"] && ctrl.ngModel["subjects"].length > 0) subjects = ctrl.ngModel["subjects"].map(e=>e.id);
                if(ctrl.ngModel["contentAreas"] && ctrl.ngModel["contentAreas"].length > 0) contentAreas = ctrl.ngModel["contentAreas"].map(e=>e.id);
                if(ctrl.ngModel["contentTypes"] && ctrl.ngModel["contentTypes"].length > 0) contentTypes = ctrl.ngModel["contentTypes"].map(e=>e.id);
                if(ctrl.ngModel["banks"] && ctrl.ngModel["banks"].length > 0) banks = ctrl.ngModel["banks"].map(e=>e.id);
                if(ctrl.ngModel["testTypes"] && ctrl.ngModel["testTypes"].length > 0) testTypes = ctrl.ngModel["testTypes"].map(e=>e.id);
                if(ctrl.ngModel["status"] && ctrl.ngModel["status"][0]) status = ctrl.ngModel["status"][0].id;
                if(ctrl.ngModel["hasActiveWindow"] && ctrl.ngModel["hasActiveWindow"][0]) hasActiveWindow = ctrl.ngModel["hasActiveWindow"][0].id;
                if(ctrl.ngModel["cronbach"] && ctrl.ngModel["cronbach"]['min'] && ctrl.ngModel["cronbach"]['max']) cronbach = ctrl.ngModel["cronbach"][0].id;

                let data = "descriptionTextSearch=" + descriptionTextSearch + "&searchType=" + searchType +
                "&grades=" + JSON.stringify(grades) + "&subjects=" + JSON.stringify(subjects) + "&contentAreas=" + JSON.stringify(contentAreas) + "&banks=" + JSON.stringify(banks) + "&idTextSearch=" + idTextSearch +
                "&testTypes=" + JSON.stringify(testTypes) + "&contentTypes=" + JSON.stringify(contentTypes) + "&status=" + status +"&sortField=" + $rootScope.sortField + "&cronbach=" + cronbach +
                "&hasActiveWindow=" + hasActiveWindow + "&sharedBySchools=" +
                JSON.stringify(ctrl.ngModel['sharedBySchools']) + "&sharedAndTargeted=" + ctrl.ngModel['sharedAndTargeted'];
                return data;
            }

            function setAuthorFilter(){
                setDD(
                    "author",
                    {
                        minimumResultsForSearch: 1,
                        width: '100%',
                        multiple: false,
                        editable:false,
                        closeOnSelect: false,

                        allowClear: true,
                        placeholder:'',
                        data: ctrl.ngModel.author ? ctrl.ngModel.author : [],
                        initSelection: function(element,callback){
                            // if ($rootScope.assessmentSearchSelectedFilter.author && $rootScope.assessmentSearchSelectedFilter.author.length > 0) {
                            //     callback($rootScope.assessmentSearchSelectedFilter.author)
                            // } else {
                            //     callback([])
                            // }

                            callback(ctrl.ngModel.author ? ctrl.ngModel.author : []);
                        },
                        ajax: {
                            url: config.assessmentserver + "/getAssessmentSearchAuthor",
                            type: "POST",
                            headers: $rootScope.headers,
                            dataType: 'json',
                            delay: 250,
                            data: function (params) {
                                let data = getStringData();
                                if(params.page && params.page != "") data = data + "&page=" + params.page;
                                if(params.term && params.term != "") data = data + "&authorText=" + params.term;
                                return data
                            },
                            processResults: function (data) {

                                return {
                                    results: data.data,
                                    pagination: {
                                        more: data.length == 50
                                    }
                                };
                            },
                            cache: true
                        }
                    }
                )
            }

            function setCronbachFilter(){
                $scope.cronbach = {
                    min: 0,
                    max: 1,
                }
            }

            function setSharedByFilter(){
                setDD(
                    "sharedBySchools",
                    {
                        //minimumInputLength: 4,
                        width: '100%',
                        editable: false,
                        closeOnSelect: false,
                        multiple: true,
                        allowClear: true,
                        placeholder:'',
                        initSelection: function(element,callback){
                            // if ($rootScope.assessmentSearchSelectedFilter.author && $rootScope.assessmentSearchSelectedFilter.author.length > 0) {
                            //     callback($rootScope.assessmentSearchSelectedFilter.author)
                            // } else {
                            //     callback([])
                            // }
                            callback([])
                        },
                        ajax: {
                            method: 'POST',
                            url: config.assessmentserver + "/getAssessmentSearchSharedSchools",
                            headers: $rootScope.headers,
                            dataType: 'json',
                            delay: 250,
                            data: function (params) {
                                return getStringData()
                            },
                            processResults: function (data) {
                                let schools = data, mySchools;
                                mySchools = schools.filter((school) => {
                                    return $rootScope.userSettings.schools.includes(school.id)
                                })
                                .map((school) => {
                                    return {
                                        id: school.id,
                                        text: school.text
                                    }
                                });

                                let otherSchools = schools.filter((school) => {
                                    return !$rootScope.userSettings.schools.includes(school.id)
                                })
                                .map((school) => {
                                    return {
                                        id: school.id,
                                        text: school.text
                                    }
                                });
                                if ($rootScope.userSettings.schools.length > 1) {
                                    data = [
                                        {
                                            'text': "My Schools",
                                            'children': mySchools
                                        },
                                        {
                                            'text': "Other Schools",
                                            'children': otherSchools
                                        }
                                    ]
                                }
                                else {
                                    data = mySchools;
                                }
                                return {
                                    results: data,
                                    pagination: {
                                        more: false
                                    }
                                };
                            },
                            cache: true
                        }
                    }
                )
            }

            function setContentAreaFilter(){

                // if pl?
                // if(){
                //     $rootScope.getContentAreasPL(function (data) {
                //         $scope.AssessmentContentAreas = [];
                //         data.unshift("Professional Learning");
                //         angular.forEach(data, function(contentArea,index){
                //             $scope.AssessmentContentAreas.push({
                //                 id: contentArea,
                //                 text: contentArea,
                //                 selected: $rootScope.assessmentSearchSelectedFilter.contentAreas.indexOf(contentArea) > -1
                //             })
                //         });

                //         if ($('#FilterAssess_CArea').hasClass("select2-hidden-accessible")) {
                //             $('#FilterAssess_CArea').select2('destroy').empty();
                //             $('#FilterAssess_CArea').off('select2:select');
                //             $('#FilterAssess_CArea').off('select2:unselect');
                //         }
                //         $('#FilterAssess_CArea').select2({
                //             multiple:true,
                //             minimumResultsForSearch: 12,
                //             width: "100%",
                //             data: $scope.AssessmentContentAreas
                //         }).on('select2:select', function (e) {
                //             $rootScope.assessmentSearchSelectedFilter.contentAreas.push(e.params.data.text);
                //             $scope.$apply();
                //         }).on('select2:unselect', function (e) {
                //             var contentAreaIndex = $rootScope.assessmentSearchSelectedFilter.contentAreas.indexOf(e.params.data.text);
                //             $rootScope.assessmentSearchSelectedFilter.contentAreas.splice(contentAreaIndex,1);
                //             $scope.$apply();
                //         })
                //     });
                // }

                return assessmentService.getContentAreas().then((res)=>{
                    setDD(
                        "contentAreas",
                        {
                            data: Object.values(
                                 res.map((e)=>{if (e.trim() != "") return{id: e, text: e}})
                            ),
                            multiple: true,
                            minimumResultsForSearch: 12,
                            width: "100%",
                        }
                    )
                })
            }

            function setDD(ddName = null, meta = {}){
                if(!ddName || ddName == "") return;

                let settings = {
                    data: [],
                    multiple: false,
                    minimumResultsForSearch: Infinity,
                }

                if(meta) settings = Object.assign({}, settings, meta);
                try {

                if(ctrl.fieldsObj[ddName]) ctrl.fieldsObj[ddName].dispose()
                } catch (error) {
                    console.log(error)
                }
                ctrl.fieldsObj[ddName] = new BestDropdown(
                    "acf_" + ddName + "_" + ctrl.denominator,
                    settings
                );
                ctrl.fieldsObj[ddName].selection
                    .subscribe(e => {
                        if (e === null || e === undefined) return;
                        if(!settings.multiple) ctrl.ngModel[ddName] = []
                        ctrl.ngModel[ddName].push({id: e.params.data.id, text: e.params.data.text})
                        if(ddName == "searchType" &&  e.params.data.id == "Shared") $timeout(()=>{setSharedByFilter()},250)
                    });

                ctrl.fieldsObj[ddName].unselect$
                    .subscribe(e => {
                        if (e === null || e === undefined) return;
                        ctrl.ngModel[ddName] = e && e.params && e.params.data && e.params.data.id && ctrl.ngModel[ddName] ? ctrl.ngModel[ddName].filter(item => item.id != e.params.data.id) : [];
                    });
                $timeout(()=>{
                    ctrl.fieldsObj[ddName].change(null)
                    if(ctrl.ngModel && ctrl.ngModel[ddName] && ctrl.ngModel[ddName].length > 0){
                        ctrl.fieldsObj[ddName].change(ctrl.ngModel[ddName].map(e=>e.id));
                    }
                },50)
            }

            function getLocation() {
                return $location.path();
            }

            $timeout(function () {
                activate();
            }, 0,false);
        },
    };

    angular
        .module(module)
        .directive(to_camel_case(component.selector), () => bootstrap_component(component));
})();

