export interface ISelf {
    self: any;
    discriminator: string;
}

export class ClickOptions {
    lnglat: ILngLat
    pixel: IPixel
    type: string
    target: { id: string }
}

type EventCallback = (event?: ClickOptions) => void;
export interface IMap extends ISelf {
    on(eventName: string, callback: EventCallback, component?: any);
    add(obj: IMarker | ITileLayer | any);
    remove(obj: IMarker | ITileLayer | any);
    clearMap();
    containerToLngLat(e: IPixel): ILngLat; //地图容器像素坐标转经纬度
    setCity(city: string);
    getCity(callback: Function): any;
    setZoom(zoom: number);
    setZoomAndCenter(zoom: number, pos: number[]);
    getZoom(): number;
    setCenter(pos: number[] | ILngLat);
    getCenter(): ILngLat;
    getBounds(): any;
    distance(a: number[], b: number[]): any;
    setAdministrativeAreaStyle(component: any, getData?: Function, setData?: Function): any; //自定义 行政区划 样式
}

export interface IMapOptions {
    zoom?: number;
    zooms?: number[];
}

export interface IMarker extends ISelf {
    id: string;
    _position: number[];
    on(eventName: string, callback: EventCallback, component?: any);
    setPosition(x: ILngLat | number[])
    setContent(html: string)
    setMap();
    getLngLatByMarkerEvent(map: IMap, e: any): ILngLat;
}

export class MarkerClusterOptions { //聚合物 click 数据类型
    cluster: any[]
    clusterData: any[]
    lnglat: ILngLat
    target: any
    markers: IMarker[]
}

type MarkerClusterCallback = (event: MarkerClusterOptions) => void;
export interface IMarkerCluster extends ISelf {
    on(eventName: string, callback: MarkerClusterCallback, component?: any): void;
    setData(list: any[]);
    setMaxZoom(zoom: number)
}

type HtmlRender = (...args) => string | HTMLElement;
type PixelRender = (...args) => IPixel;
export interface IRenderClusterMarker {
    getFirstImages(context: any): string;
    contentRender: HtmlRender;
    contentNonRender: HtmlRender;
    pixelRender: PixelRender;
    pixelNonRender: PixelRender;
}

export class IMarkOptions {
    position?: ILngLat | number[];
    content?: string;
    offset?: IPixel;
    map?: IMap;
    draggable?: boolean
}

export interface IPixel extends ISelf {
    x: number
    y: number
    getArray(): number[]
}

export interface ILngLat extends ISelf {
    typeName: string
    lng: number
    lat: number
    KL: number
    kT: number
    offset(x: number, y: number): ILngLat
    getArray(): number[]
}

export interface ILayer extends ISelf {

}

export interface IIconOptions {
    size?: ISize;
    imageSize?: ISize;
    image?: string;
}

export interface IIcon extends ISelf {

}

export interface ISize extends ISelf {

}

export interface ITileLayer extends ISelf {
    Satellite();
    RoadNet();
}

export interface IDrivingOptions {
    map?: IMap;
    policy?: string
    showTraffic?: boolean
    isOutline?: boolean
}

export class DrivingSearch { //Driving Search() 数据类型
    distance: number
    time: number
    tolls_distance: number
    steps: DrivingSearchSteps[]
    routes: any[] //伪代码
}
export class DrivingSearchSteps { //Driving Search() Steps 数据类型
    instruction: string
    orientation: string
    road: string
    distance: number
    time: number
    tolls_distance: number
}

type DrivingSearchCallback = (status: string, searchData: DrivingSearch) => void;
export interface IDriving extends ISelf {
    clear();
    search(component: any, posStart: ILngLat, posEnd: ILngLat, callback: DrivingSearchCallback);
}

export class AutocompleteSearch { //Autocomplete Search() 数据类型
    info: string
    count: number
    tips: AutocompleteSelect[]
}
export class AutocompleteSelect { //GaoDe POI 数据类型
    id: string
    name: string
    adcode: string
    district: string
    location: ILngLat
    type: string
    poi: { location: ILngLat }
}

type AutocompleteSearchCallback = (status: string, searchData: AutocompleteSearch) => void;
type AutocompleteSelectCallback = (event: AutocompleteSelect) => void;
export interface IAutocomplete extends ISelf {
    search(address: string, callback: AutocompleteSearchCallback)
    on(eventName: string, callback: AutocompleteSelectCallback)
}

export class PlaceSearchSearch { //PlaceSearch Search() 数据类型
    info: string
    poiList: PlaceSearchSearchTips
}
export class PlaceSearchSearchTips { //PlaceSearch Search() 数据类型
    pois: AutocompleteSelect[]
    pageIndex: number
    pageSize: number
    count: number
}

type PlaceSearchCallback = (status: string, searchData: PlaceSearchSearch) => void;
export interface IPlaceSearch extends ISelf {
    search(text: string, callback: PlaceSearchCallback);
}

export interface IMouseTool extends ISelf {
    rule(options: any)
    measureArea(options: any)
    close(isTrue: boolean)
}

export interface IInfoWindow extends ISelf {
    open(map: IMap);
    listen(html: any, event: string, callback: Function)
}

export interface ICircle extends ISelf {
    setRadius(num: number);
    setCenter(pos: number[])
    setMap(map: IMap)
}