/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

import {
    MatSnackBarConfig,
    MatSnackBar
} from '@angular/material';
import { FdsCoasterComponent } from '@flow-design-system/coaster';
import $ from 'jquery';

export function ISnackBarConfig() {
    this.title = '';
    this.message = '';
    this.snackBarRef = undefined;
    this.viewContainerRef = undefined;
}

ISnackBarConfig.prototype = {
    contstructor: ISnackBarConfig
};

$.extend(ISnackBarConfig, MatSnackBarConfig);

export function ICoasterConfig() {
    this.icon = '';
    this.color = '';
}

ICoasterConfig.prototype = {
    contstructor: ICoasterConfig
};

$.extend(ICoasterConfig, ISnackBarConfig);

/**
 * FdsSnackBarService constructor.
 *
 * @param MatSnackBar      The angular material MatSnackBar.
 * @constructor
 */
export function FdsSnackBarService(MatSnackBar) {
    this.snackBarService = MatSnackBar;
}

FdsSnackBarService.prototype = {
    contstructor: FdsSnackBarService,

    /**
     * Wrapper function over the open() method in MatSnackBar.
     *
     * @param message               The message to show in the snackbar.
     * @param action                The label for the snackbar action.
     * @param config                Additional configuration options for the snackbar.
     *
     * @returns {MatSnackBarRef}    The reference to the snackbar.
     */
    open: function (message, action, config) {
        return this.snackBarService.open(message, action, config);
    },

    /**
     * Wrapper function over the openFromComponent() method in MatSnackBar.
     * Opens a snackbar containing the given component.
     *
     * @param component     The angular ComponentType<T>.
     * @param config        The angular material MatSnackBarConfig.
     *
     * @returns {MatSnackBarRef}    The reference to the snackbar.
     */
    openFromComponent: function (component, config) {
        return this.snackBarService.openFromComponent(component, config);
    },

    /**
     * Wrapper function over the dismiss() method in MatSnackBar.
     * Dismisses the currently-open snackbar.
     */
    dismiss: function () {
        this.snackBarService.dismiss();
    },

    /**
     * Opens a coaster snackbar with the provided config.
     *
     * @param config     ICoasterConfig {
     *                                      message?: string;
     *                                      title?: string;
     *                                      snackBarRef?: MatSnackBarRef;
     *                                      viewContainerRef?: ViewContainerRef;
     *                                      icon?: string;
     *                                      color?: string;
     *                                   }
     *
     * @returns {MatSnackBarRef}    The reference to the snackbar.
     */
    openCoaster: function (config) {
        const snackBarConfig = new ICoasterConfig();
        snackBarConfig.verticalPosition = config.verticalPosition;
        snackBarConfig.horizontalPosition = config.horizontalPosition;
        snackBarConfig.duration = config.duration;
        const snackBarRef = this.snackBarService.openFromComponent(FdsCoasterComponent, snackBarConfig);
        const coasterComponent = snackBarRef.instance;
        coasterComponent.snackBarRef = snackBarRef;
        if (config.title) {
            coasterComponent.title = config.title;
        }
        if (config.message) {
            coasterComponent.message = config.message;
        }
        if (config.icon) {
            coasterComponent.icon = config.icon;
        }
        if (config.color) {
            coasterComponent.color = config.color;
        }
        return snackBarRef;
    },
};

FdsSnackBarService.parameters = [MatSnackBar];
