import { Palette } from 'cpt2js';
import * as GeoTIFF from 'geotiff';

type TextureDataArray = GeoTIFF.TypedArray | Uint8ClampedArray;
interface TextureData {
    data: TextureDataArray;
    width: number;
    height: number;
}

type DatetimeISOString = string;
type DatetimeISOStringRange = [start: DatetimeISOString, end: DatetimeISOString];

declare enum ImageType {
    SCALAR = "SCALAR",
    VECTOR = "VECTOR"
}

type ImageUnscale = [min: number, max: number] | null;

declare enum UnitSystem {
    METRIC = "METRIC",
    IMPERIAL = "IMPERIAL",
    NAUTICAL = "NAUTICAL"
}

interface UnitFormat {
    system: UnitSystem;
    unit: string;
    scale?: number;
    offset?: number;
    decimals?: number;
}

interface ClientConfig {
    url?: string;
    accessToken?: string;
    dataFormat?: string;
    unitSystem?: UnitSystem;
    attributionLinkClass?: string;
    datetimeInterpolate?: boolean;
}
interface Dataset {
    title: string;
    unitFormat: UnitFormat;
    attribution: string;
    datetimeRange: DatetimeISOStringRange;
    datetimes: DatetimeISOString[];
    palette: Palette;
}
interface DatasetSlice {
    datetimes: DatetimeISOString[];
}
interface DatasetData {
    image: TextureData;
    image2: TextureData | null;
    imageWeight: number;
    imageType: ImageType;
    imageUnscale: ImageUnscale;
    bounds: [number, number, number, number];
}
declare class Client {
    #private;
    constructor(config: ClientConfig);
    getConfig(): ClientConfig;
    setConfig(config: ClientConfig): void;
    updateConfig(config: Partial<ClientConfig>): void;
    loadCatalog(config?: ClientConfig): Promise<string[]>;
    loadDataset(dataset: string, config?: ClientConfig): Promise<Dataset>;
    loadDatasetSlice(dataset: string, datetimeRange: DatetimeISOStringRange, config?: ClientConfig): Promise<DatasetSlice>;
    loadDatasetData(dataset: string, datetime: DatetimeISOString, config?: ClientConfig): Promise<DatasetData>;
}

export { Client, type ClientConfig, type Dataset, type DatasetData, type DatasetSlice };
