(function () {
    'use strict';

    angular.module("semanthequeSidApp")
        .controller("ModalEntityListCtrl", ModalEntityListCtrl);

    function ModalEntityListCtrl($http, $q, $uibModalInstance, gettextCatalog, options) {

        var mainCtrl = this;
        mainCtrl.cancel = cancel;
        mainCtrl.cancelNewList = cancelNewList;
        mainCtrl.getLabel = getLabel;
        mainCtrl.getPage = getPage;
        mainCtrl.newList = newList;
        mainCtrl.ok = ok;
		mainCtrl.saveNewList = saveNewList;
        mainCtrl.selectList = selectList;

        mainCtrl.filter = {};

        init();


        /**
         * Initialisation du contrôleur
         */
        function init() {
            /**
             * options: {
             *  filter: paramètres de la requête de recherche (renseigner au moins le type)
             * }
             */
            _.extend(mainCtrl, options);
            // Chargement de la première page d'imports
            loadLists();
        }

        /**
         * Chargement de la page de liste suivante
         */
        function getPage() {
            if (mainCtrl.pagination.busy || (mainCtrl.loaded && mainCtrl.pagination.page >= mainCtrl.pagination.totalPages)) {
                return;
            }
            mainCtrl.pagination.busy = true;

            // var params = angular.copy(mainCtrl.filter);
            // params.borrower = _.pluck(params.borrower, "identifier");
			var params = {};
            params.page = mainCtrl.pagination.currentPage - 1;
            params.size = mainCtrl.pagination.itemsByPage;
			
			$http.get('/mes-listes-recherche/' + params.page + '/' + params.size)
                 .then(function (response) {
					var page = response.data;
					mainCtrl.pagination.totalItems = page.totalElements;
					mainCtrl.pagination.totalPages = page.totalPages;
					mainCtrl.lists = page.content || [];
					mainCtrl.pagination.busy = false;
					mainCtrl.loaded = true;
                 });
        }

        /**
         * Réinitialisation de la pagination
         */
        function clearPagination() {
            mainCtrl.loaded = false;
            mainCtrl.pagination = {
                currentPage: 1,
                itemsByPage: 15,
                totalItems: 0,
                totalPages: 0,
                busy: false
            };
            mainCtrl.lists = [];
        }

        /**
         * Rechargement de la liste de listes
         */
        function loadLists(event) {
            // l'appel vient d'un keypress
            if (event && (event.type === "keypress" && event.keyCode !== 13)) {
                return;
            }
            clearPagination();
            getPage({ pagination: mainCtrl.pagination });
        }

        /**
         * Sélection d'une liste
         * 
         * @param {any} list
         */
        function selectList(list) {
            mainCtrl.list = list;
            _.each(mainCtrl.lists, function (l) {
                if (!selectList || l !== list) {
                    delete l._selected;
                }
                else {
                    l._selected = true;
                }
            });
        }

        /**
         * Ouverture du formulaire de création d'une nouvelle liste
         */
        function newList() {
            mainCtrl._newList = true;
            mainCtrl._newListName = gettextCatalog.getString("Nouvelle liste du {{date}}", { date: moment().format("L LTS") });
        }

        /**
         * Création d'une nouvelle liste, et fermeture de la modale
         */
        function saveNewList() {
			$http.get('/ma-liste-new?title=' + encodeURIComponent(mainCtrl._newListName))
				 .then(function (response) {
                    $uibModalInstance.close(response.data);
                 });
        }
		
		function cancelNewList() {
            mainCtrl._newList = false;
        }
		
		/**
         * Libellé d'une liste
         * 
         * @param {any} list
         * @returns
         */
        function getLabel(list) {
            if (!list) {
                return;
            }
            var cnt = angular.isDefined(list.totalEntities) ? list.totalEntities : list.works.length + list.manifestations.length;
            return gettextCatalog.getString("{{title}} ({{totalEntities}})", { title: list.title, totalEntities: cnt });
        }
		
        /**
         * Sélection de la liste, et fermeture de la modale
         */
        function ok() {
            $uibModalInstance.close(mainCtrl.list);
        }

        /**
         * Annulation de la sélection de la liste, et fermeture de la modale
         */
        function cancel() {
            $uibModalInstance.dismiss("cancel");
        }
    };
})();