/**
 * Toast group.
 * @constructor ApToastGroup
 */

"use strict";

import React, {PropTypes as types} from 'react';
import ApToast from './ap_toast';
import {ApPureMixin} from 'apeman-react-mixins';
import ApInfoToast from './ap_info_toast';
import ApWarnToast from './ap_warn_toast';
import ApErrorToast from './ap_error_toast';
import Toaster from './toaster';
import classnames from 'classnames';

/** @lends ApToastGroup */
let ApToastGroup = React.createClass({

    //--------------------
    // Specs
    //--------------------

    propTypes: {
        duration: types.number,
        toaster: types.instanceOf(Toaster)
    },

    mixins: [
        ApPureMixin
    ],

    statics: {
        Toaster: Toaster
    },

    getInitialState() {
        let state = {_date: null};
        Toaster.levels.forEach(level => {
            state[level] = null;
        });
        return state;
    },

    getDefaultProps() {
        return {
            toaster: null
        };
    },

    render() {
        let s = this;
        let {state, props} = s;
        let {duration} = props;
        return (
            <div className={classnames('ap-toast-group', props.className)}>
                <ApToast message={state.default} duration={duration}/>
                <ApInfoToast message={state.info} duration={duration}/>
                <ApWarnToast message={state.warn} duration={duration}/>
                <ApErrorToast message={state.error} duration={duration}/>
                {props.children}
            </div>
        );
    },

    //--------------------
    // Lifecycle
    //--------------------

    componentDidMount() {
        let s = this,
            {props} = s;
        if (props.toaster) {
            s.bindToaster(props.toaster);
        }
    },

    componentWillReceiveProps(nextProps) {
        let s = this,
            {props} = s;
        if (nextProps.toaster) {
            s.unbindToaster(props.toaster);
            s.bindToaster(nextProps.toaster);
        }
    },

    componentWillUnmount() {
        let s = this,
            {props} = s;
        if (props.toaster) {
            s.unbindToaster(props.toaster);
        }
    },

    //--------------------
    // Custom
    //--------------------

    /**
     * Bind toaster events.
     * @param toaster
     */
    bindToaster(toaster){
        let s = this;
        toaster.addListener('toast', s.handleToast);
    },

    /**
     * Unbind toaster events.
     * @param toaster
     */
    unbindToaster(toaster){
        let s = this;
        toaster.removeListener('toast', s.handleToast);
    },

    /**
     * Handle toaster events.
     * @param data
     */
    handleToast(data){
        let s = this;
        let state = {_date: new Date()};
        Toaster.levels.forEach(level => {
            state[level] = data.level === level ? data.message : null;
        });
        s.setState(state);
    }
});

module.exports = ApToastGroup;