import * as L from 'leaflet';
import { FeatureCollection, Feature } from 'geojson';

declare global {
    interface Window {
        L?: typeof L;
    }
    namespace L {
        type HaloData = FeatureCollection<GeoJSON.Polygon | GeoJSON.MultiPolygon> | Feature<GeoJSON.Polygon | GeoJSON.MultiPolygon> | Feature<GeoJSON.Polygon | GeoJSON.MultiPolygon>[] | GeoJSON.Polygon | GeoJSON.MultiPolygon | GeoJSON.Polygon[] | GeoJSON.MultiPolygon[];
        interface MaskHaloOptions {
            mask?: L.PathOptions;
            halo?: L.PathOptions;
        }
        class MaskHalo extends L.FeatureGroup {
            constructor(data: HaloData, options?: L.MaskHaloOptions);
            setHalo(data: HaloData): MaskHalo;
        }
        interface Map {
            maskHalo(data: HaloData, options?: MaskHaloOptions): MaskHalo;
        }
        function maskHalo(data: HaloData, options?: MaskHaloOptions): MaskHalo;
    }
}

/**
 * Leaflet MaskHalo
 * @class
 * @param {L.Map} map - Leaflet map instance
 * @param {Object} options - Leaflet MaskHalo options
 *
 * @example
 *
 * ```
 * import L from "leaflet";
 * import "leaflet.maskhalo";
 *
 * const maskHalo = L.maskHalo(data, {
    mask: {
      fillColor: "#000",
        fillOpacity: 0.4,
      },
      halo: {
        color: "#165DFF",
        weight: 3,
      },
    });
 *
 * maskHalo.addTo(map);
 *
 * // 清除
 * maskHalo.clearLayers()
 * // 移除当前的
 * maskHalo.remove()
 * ```
 */
declare class MaskHalo extends L.FeatureGroup {
    private _options;
    private _halo;
    private _mask;
    constructor(data: L.HaloData, options?: L.MaskHaloOptions);
    /**
     * Add halo to the map
     *
     * @param data GeoJSON data
     *
     */
    _createLayers(data: L.HaloData): void;
    /**
     * Remove the mask layer.
     *
     */
    setHalo(data: L.HaloData): this;
}
declare function maskHalo(data: L.HaloData, options?: L.MaskHaloOptions): L.MaskHalo;

export { MaskHalo, maskHalo };
