/*eslint no-var: "error" */
/*eslint no-unused-vars: "off" */
/*eslint linebreak-style: "off" */
/*eslint no-trailing-spaces: "off" */
/*eslint-env es6*/
// Put this file in path/to/plugin/amd/src
// You can call it anything you like

import {call} from 'core/ajax';
import notification from 'core/notification';

import Vue from './vue/vue';

import Debugger from './util/debugger';
import {load_strings} from './util/string-helper';
import {ProcessStudyplan} from './studyplan-processor';

import TSComponents from './treestudyplan-components';
Vue.use(TSComponents);

import RVComponents from './report-viewer-components';
Vue.use(RVComponents);
import ModalComponents from './modedit-modal';
Vue.use(ModalComponents);

import PortalVue from './portal-vue/portal-vue.esm';
Vue.use(PortalVue);
import BootstrapVue from './bootstrap-vue/bootstrap-vue.esm';
Vue.use(BootstrapVue);


let debug = new Debugger("treestudyplanviewer");

let strings = load_strings({
    studyplan: {
        studyplan_select_placeholder: 'studyplan_select_placeholder',
    },
});

/**
 * Initialize the Page
 * @param {int} contextid The context we should attempt to work in (1:1 related to the category)
 * @param {int} categoryid The category we shoud attempt to work in (1:1 related to the context)
 */
export function init(contextid,categoryid) {
    // Make sure the id's are numeric and integer
    if(undefined === contextid || !Number.isInteger(Number(contextid)) || contextid < 1 ){ contextid = 1;} 
    else { contextid = Number(contextid);} // ensure a numeric value instead of string
    if(undefined === categoryid || !Number.isInteger(Number(categoryid))){ categoryid = 0;}
    else { categoryid = Number(categoryid);} // ensure a numeric value instead of string

    const in_systemcontext = (contextid <= 1);

    let app = new Vue({
        el: '#root',
        data: {
            displayedstudyplan: null,
            activestudyplan: null,
            associatedstudents: [],
            selectedstudent: null,
            studentstudyplan: null,
            loadingstudyplan: false,
            studyplans: [],
            text: strings.studyplan,
            toolbox: {
                right: true,
            },
            usedcontexts: [],
        },
        async mounted() {
            call([{
                methodname: 'local_treestudyplan_list_studyplans',
                args: {context_id: contextid}
            }])[0].done(function(response){
                const timingval = { present: 0, past: 1, future: 2};
                response.sort((a,b) => {
                    const timinga = TSComponents.studyplanTiming(a);
                    const timingb = TSComponents.studyplanTiming(b);

                    const t = timingval[timinga] - timingval[timingb];
                    if(t == 0){
                        // sort by name if timing is equal
                        return a.name.localeCompare(b.name);
                    }
                    else {
                        return t;
                    }
                });
                app.studyplans = response;
                // load studyplan from hash if applicable
                const hash = location.hash.replace('#','');
                const parts = hash.split("-");

                if(!!parts && parts.length > 0){
                    for(let idx in app.studyplans){
                        if(app.studyplans[idx].id == parts[0]){
                            app.selectStudyplan(app.studyplans[idx],parts[1]);
                            break;
                        }
                    }
                }
            }).fail(notification.exception);
            call([{
                methodname: 'local_treestudyplan_list_used_categories',
                args: { operation: 'view'}
            }])[0].done(function(response){
                const contexts = [];
                for(const ix in response){
                    if(response[ix].studyplancount >0){
                        contexts.push(response[ix]);
                    }
                }
                app.usedcontexts = contexts;
            }).fail(notification.exception);
        },
        computed: {
            dropdown_title(){
                if(this.activestudyplan && this.activestudyplan.name){
                    return this.activestudyplan.name;
                }
                else{
                    return this.text.studyplan_select_placeholder;
                }
            },
            contextid(){
                return contextid;
            }
        },
        methods: {
            switchContext(ctx){
                const params = new URLSearchParams(location.search);
                params.set('categoryid', ctx.id);
                window.location.search = params.toString();

            },
            closeStudyplan() {
                app.activestudyplan = null;
                app.associatedstudents = [];
                app.studentstudyplan = [];
                app.displayedstudyplan = null;
            },

            selectStudyplan(studyplan,studentid){
                // fetch studyplan
                app.loadingstudyplan = true;
                app.activestudyplan = null;
                app.associatedstudents = [];
                app.selectedstudent = null;
                app.studentstudyplan = null;
                call([{
                    methodname: 'local_treestudyplan_get_studyplan_map',
                    args: { id: studyplan.id}
                }])[0].done(function(response){
                    app.activestudyplan = ProcessStudyplan(response,true);
                    app.displayedstudyplan = app.activestudyplan;
                    app.loadingstudyplan = false;
                    location.hash = app.activestudyplan.id;
                    call([{
                        methodname: 'local_treestudyplan_all_associated',
                        args: { studyplan_id: studyplan.id}
                    }])[0].done(function(response){
                        app.associatedstudents = response;
                        if(studentid){
                            for(const student of app.associatedstudents){
                                if(student.id == studentid){
                                    app.showStudentView(student);
                                    break;
                                }
                            }
                        }
                    }).fail(notification.exception);

                }).fail(function(error){
                    notification.exception(error);
                    app.loadingstudyplan = false;
                });
            },
            showStudentView(student){
                app.selectedstudent = student;
                app.studentstudyplan = null;
                app.loadingstudyplan = true;
                call([{
                    methodname: 'local_treestudyplan_get_user_studyplan',
                    args: { userid: student.id, studyplanid: app.activestudyplan.id}
                }])[0].done(function(response){
                    app.studentstudyplan = ProcessStudyplan(response,false);
                    app.displayedstudyplan = app.studentstudyplan;
                    app.loadingstudyplan = false;
                    location.hash = app.activestudyplan.id + "-" + student.id;
                }).fail(function(error){
                    notification.exception(error);
                    app.loadingstudyplan = false;
                });


            },
            showOverview(){
                app.selectedstudent = null;
                app.studentstudyplan = null;
                app.displayedstudyplan = app.activestudyplan;
            }

        },
    });
}
