/*-
 * ============LICENSE_START=======================================================
 * SDC
 * ================================================================================
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */

import {  Component, DisplayModule , PropertyModel } from '../models';
import { ComponentMetadata } from '../models/component-metadata';

export interface IModalsHandler {

    openEditPropertyModal(property: PropertyModel, component: Component, filteredProperties: PropertyModel[], isPropertyOwnValue: boolean,
                          propertyOwnerType: string, propertyOwnerId: string): ng.IPromise<any>;
}

export class ModalsHandler implements IModalsHandler {

    static '$inject' = [
        '$uibModal',
        '$q'
    ];

    constructor(private $uibModal: ng.ui.bootstrap.IModalService,
                private $q: ng.IQService) {
    }

    openUpdateIconModal = (component: Component): ng.IPromise<any> => {
        const deferred = this.$q.defer();
        const modalOptions: ng.ui.bootstrap.IModalSettings = {
            templateUrl: '../view-models/modals/icons-modal/icons-modal-view.html',
            controller: 'Sdc.ViewModels.IconsModalViewModel',
            size: 'sdc-auto',
            backdrop: 'static',
            resolve: {
                component: (): Component => {
                    return component;
                }
            }
        };
        const modalInstance: ng.ui.bootstrap.IModalServiceInstance = this.$uibModal.open(modalOptions);
        deferred.resolve(modalInstance.result);
        return deferred.promise;
    }

    /**
     *
     * This function openes up the edit property modal
     *
     * @param property - the property to edit
     * @param component - the component who is the owner of the property
     * @param filteredProperties - the filtered properties list to scroll between in the edit modal
     * @param isPropertyValueOwner - boolean telling if the component is eligible of editing the property
     * @returns {IPromise<T>} - Promise telling if the modal has opened or not
     */
    openEditPropertyModal = (property: PropertyModel, component: Component | ComponentMetadata, filteredProperties: PropertyModel[],
                             isPropertyValueOwner: boolean, propertyOwnerType: string, propertyOwnerId: string): ng.IPromise<any> => {
        const deferred = this.$q.defer();

        const modalOptions: ng.ui.bootstrap.IModalSettings = {
            templateUrl: '../view-models/forms/property-forms/component-property-form/property-form-view.html',
            controller: 'Sdc.ViewModels.PropertyFormViewModel',
            size: 'sdc-l',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                property: (): PropertyModel => {
                    return property;
                },
                component: (): Component => {
                    return component as Component;
                },
                filteredProperties: (): PropertyModel[] => {
                    return filteredProperties;
                },
                isPropertyValueOwner: (): boolean => {
                    return isPropertyValueOwner;
                },
                propertyOwnerType: (): string => {
                    return propertyOwnerType;
                },
                propertyOwnerId: (): string => {
                    return propertyOwnerId;
                }
            }
        };

        const modalInstance: ng.ui.bootstrap.IModalServiceInstance = this.$uibModal.open(modalOptions);
        deferred.resolve(modalInstance.result);
        return deferred.promise;
    }

    /**
     *
     * This function openes up the edit property modal
     *
     * @param property - the property to edit
     * @param filteredProperties - the filtered properties list to scroll between in the edit modal
     * @param isPropertyValueOwner - boolean telling if the component is eligible of editing the property
     * @returns {IPromise<T>} - Promise telling if the modal has opened or not
     */
    newOpenEditPropertyModal = (property: PropertyModel, filteredProperties: PropertyModel[], isPropertyValueOwner: boolean, propertyOwnerType: string, propertyOwnerId: string): ng.IPromise<any> => {
        const deferred = this.$q.defer();

        const modalOptions: ng.ui.bootstrap.IModalSettings = {
            templateUrl: '../view-models/forms/property-forms/component-property-form/property-form-view.html',
            controller: 'Sdc.ViewModels.PropertyFormViewModel',
            size: 'sdc-l',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                property: (): PropertyModel => {
                    return property;
                },
                filteredProperties: (): PropertyModel[] => {
                    return filteredProperties;
                },
                isPropertyValueOwner: (): boolean => {
                    return isPropertyValueOwner;
                },
                propertyOwnerType: (): string => {
                    return propertyOwnerType;
                },
                propertyOwnerId: (): string => {
                    return propertyOwnerId;
                }
            }
        };

        const modalInstance: ng.ui.bootstrap.IModalServiceInstance = this.$uibModal.open(modalOptions);
        deferred.resolve(modalInstance.result);
        return deferred.promise;
    }

    openEditModulePropertyModal = (property: PropertyModel, component: Component, selectedModule: DisplayModule, filteredProperties: PropertyModel[]): ng.IPromise<any> => {
        const deferred = this.$q.defer();

        const modalOptions: ng.ui.bootstrap.IModalSettings = {
            templateUrl: '../view-models/forms/property-forms/base-property-form/property-form-base-view.html',
            controller: 'Sdc.ViewModels.ModulePropertyView',
            size: 'sdc-l',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                originalProperty: (): PropertyModel => {
                    return property;
                },
                component: (): Component => {
                    return component as Component;
                },
                selectedModule: (): DisplayModule => {
                    return selectedModule;
                },
                filteredProperties: (): PropertyModel[] => {
                    return filteredProperties;
                }
            }
        };

        const modalInstance: ng.ui.bootstrap.IModalServiceInstance = this.$uibModal.open(modalOptions);
        deferred.resolve(modalInstance.result);
        return deferred.promise;
    }

}