// import * as util from '../core/utilities';
import { EventEmitter } from './EventEmitter';
import type { Map } from 'leaflet/src/map/index';

export abstract class Control<T> extends EventEmitter<T> {

    // @section
    // @aka Control options
    options = {
        position: 'topright',
    };
    protected _map;
    protected _container;

    // constructor(defaults?) {
    //     super();
    //     if (!(this instanceof Control)) {
    //         throw new TypeError("Control constructor cannot be called as a function.");
    //     }        
    //     // properties     
    //     // util.setOptions(this, defaults);
    // }

    getPosition() {
        return this.options.position;
    }

    getContainer() {
        return this._container;
    }

    abstract onRemove(map): void;
    
    abstract onAdd(map: any) : HTMLElement;

    addTo(map: Map): Control<T> {
        this._map = map;

        let container = this._container = this.onAdd(map);
        let pos = this.getPosition();//"topright"
        let corner = map.controlCorners[pos];
        if (container) {
            // $(container).addClass('gba-control');
            container.classList.add("gba-control");

            if (pos.indexOf('bottom') !== -1) {
                corner.insertBefore(container, corner.firstChild);
            }
            else {
                corner.appendChild(container);
            }
        }
        return this;
    }

    removeFrom(map) {
        let pos = this.getPosition(),
            corner = map._controlCorners[pos];

        corner.removeChild(this._container);
        this._map = null;

        if (this.onRemove) {
            this.onRemove(map);
        }
        return this;
    }

}

