import EventEmitter from './event-emitter';
import {kebabToCamel} from './string';

/**
 * Base class for component controllers.
 */
export default class Component extends EventEmitter {
    /**
     * Contructor.
     *
     * @param {HTMLElement} $element The main component element
     * @param {$rootScope.Scope} $scope The element scope
     */
    constructor($element, $scope) {
        super();
        if (!$element) return;
        this.element = $element[0];
        this.element.$ctrl = this;
        this.$element = $element;
        this.$ = $scope;
    }

    $postLink() {
        if (!this.$element) return;
        let attrs = this.$element[0].attributes;
        let $scope = this.$;
        for (let attr of attrs) {
            if (attr.name.substr(0, 2) !== 'on') continue;
            let eventName = kebabToCamel(attr.name.substr(3));
            let callback = locals => $scope.$parent.$eval(attr.nodeValue, locals);
            this.on(eventName, callback);
        }
    }

    /**
     * The component owner window.
     */
    get window() {
        return this.document.defaultView;
    }
    /**
     * The component owner document.
     */
    get document() {
        return this.element.ownerDocument;
    }
}
Component.$inject = ['$element', '$scope'];