import type { Dataset } from 'gdal-async';
import Emittery from 'emittery';
import gdal from 'gdal-async';
import { OmnipresentEventData } from 'emittery';

export declare interface CreateInfo {
    outTileSize: number;
    overviewInfo: OverviewInfo;
    rb: {
        rx: number;
        ry: number;
        rxsize: number;
        rysize: number;
        ds?: Dataset;
    };
    wb: {
        wx: number;
        wy: number;
        wxsize: number;
        wysize: number;
        ds?: Dataset;
    };
    encoding: 'mapbox' | 'terrarium';
    dsPath: string;
    x: number;
    y: number;
    z: number;
    outputTile: string;
    type: 'terrain' | 'dom';
}

export declare interface DsInfo {
    ds: Dataset;
    path: string;
}

export declare interface EventMap {
    completed: {
        id: string;
        tileCount: number;
        createTileCount: number;
    };
    idle: {
        id: string;
        tileCount: number;
        createTileCount: number;
    };
}

export declare interface LevelInfo {
    tminx: number;
    tminy: number;
    tmaxx: number;
    tmaxy: number;
}

export declare interface LevelInfoDict {
    [key: number]: LevelInfo;
}

export declare interface Options {
    minZoom: number;
    maxZoom: number;
    epsg: number;
    encoding: 'mapbox' | 'terrarium';
    isClean: boolean;
    resampling: number;
    baseHeight: number;
    type: 'terrain' | 'dom';
    log: boolean;
}

export declare interface OverviewInfo {
    index?: number;
    startX: number;
    startY: number;
    width: number;
    height: number;
    resX: number;
    resY: number;
    endX?: number;
    endY?: number;
    path?: string;
}

export declare interface OverviewInfoDict {
    [key: number]: OverviewInfo;
}

export declare interface StatisticsInfo {
    tileCount: number;
    completeCount: number;
    levelInfo: LevelInfoDict;
}

/**
 * tif切片
 */
export declare class TIF2Tiles {
    private input;
    private output;
    private options;
    private queue;
    private pool;
    private log;
    private sourceDs;
    private projectDs;
    private projectPath;
    private encodePath;
    private tileBoundTool;
    statistics: StatisticsInfo;
    id: `${string}-${string}-${string}-${string}-${string}`;
    emitter: Emittery<EventMap, EventMap & OmnipresentEventData, never>;
    constructor(input: string, output: string, options: Options);
    getWorkerPath(): string;
    /**
     * 清理临时文件
     */
    recycle(): Promise<void>;
    /**
     * 重投影数据集
     */
    reproject(ds: Dataset, epsg: number, resampling: number): Promise<string>;
    /**
     * 构建影像金字塔
     * @param ds
     * @param  minZoom
     * @returns adjustZoom
     */
    buildPyramid(ds: gdal.Dataset, minZoom: number, resampling: number): {
        maxOverViewsZ: number;
        minOverViewsZ: number;
    };
    /**
     * 生成切片
     */
    generateTile(): Promise<void>;
    /**
     * 重置统计信息
     */
    resetStats(): void;
}

export { }
