import { List } from "../dataType/List";
import { Geometry } from "../models/Geometry";
import { ActiveList } from "./ActiveList";
import { GeometryLayer } from "./GeometryLayer";
import { ActiveDictionary } from "./data";
/**
 * @class Map.DrawingTools
 * @since ui.Map
 */
export class DrawingTools extends ActiveDictionary {
    geometryLayers: GeometryLayer[] = [];
    drawModes: string[] = ['point', 'line', 'polygon', 'rectangle'];
    layersShown: boolean;
    linked: boolean = false;
    selected: GeometryLayer = null;
    shape: string = null;
    shown: boolean = true;
    curDrawMode: string;//当前绘制模式
    drawControl: any;
    /**
     * @hideconstructor
     * 绘图工具
     * @param {List<GeometryLayer>} layers 用于初始化绘图工具的GeometryLayer数组
     * @param {string} shape 要画的图形形状。可使用的值有:point、line、polygon、rectangle
     * @param {GeometryLayer} selected 当前选择的图层
     * @param {boolean} shown 是否显示绘图工具,默认为true
     * @param {boolean} linked 绘图工具是否链接到编辑器导入栏。当为false时,工具不显示导入的几何图形。默认为false
     * @returns 
     */
    constructor(layers?: GeometryLayer[], shape?: string, selected?: GeometryLayer, shown?: boolean, linked?: boolean) {
        super();
        if (!(this instanceof DrawingTools)) {
            return new DrawingTools(layers, shape, selected, shown, linked);
        }
        this.shape = shape;
        this.selected = selected;
        this.shown = shown;
        this.linked = linked;
        if (layers) {
            this.geometryLayers = layers;
        }
    }


    /**
     * 添加图层
     * @param {List<Geometry>} geometries 图形列表
     * @param {string}  name   图层名称
     * @param {string}  color  图层颜色
     * @param {boolean} shown  图层是否显示
     * @param {boolean} locked 图层是否锁定
     * @returns ui.Map.GeometryLayer
     */
    addLayer(geometries: List<Geometry>, name?: string, color?: string, shown?: boolean, locked?: boolean) {
        let gl = new GeometryLayer(geometries, name, color, shown, locked);
        this.geometryLayers.push(gl);
        return gl;
    }

    /**
     * 清除图层
     * @returns ui.Map.DrawingTools
     */
    clear() {
        return this;
    }

    /**
     * 开启绘制模式
     * @returns ui.Map.DrawingTools
     */
    draw() {
        //开启绘制模式
        return this;
    }

    /**
     * 开启编辑模式
     * @returns ui.Map.DrawingTools
     */
    edit() {
        //开启绘制模式
        return this;
    }

    /**
     * 获取绘图工具上可用的绘图模式。可用的绘制模式形状有:点、线、多边形和矩形。返回已启用的绘制模式列表
     * @returns List<string>
     */
    getDrawModes() {
        //获取可绘制的图形
        return this.drawModes;
    }

    /**
     * 返回绘图工具是否链接到编辑器中的导入栏
     * @returns boolean
     */
    getLinked() {
        return this.linked;
    }

    getMap() {
        return "";
    }

    /**
     * 返回选择的图层
     * @returns ui.Map.GeometryLayer
     */
    getSelected() {
        //获取选中的geometryLayer
        return this.selected;
    }

    /**
     * 返回在绘图模式下绘制的形状
     * @returns string
     */
    getShape() {
        return this.shape;
    }

    /**
     * 返回绘图工具是否显示
     * @returns boolean
     */
    getShown() {
        return this.shown;
    }

    /**
     * 返回绘图工具的图层列表
     * @returns  List<GeometryLayer>
     */
    layers() {
        return this.geometryLayers;
    }

    /**
     * 设置绘图模式。可使用的值有:point、line、polygon、rectangle
     * @param {List<string>} drawModes 要设置的绘制模式列表。默认为所有支持的
     * @returns ui.Map.DrawingTools
     */
    setDrawModes(drawModes: string[]) {
        this.drawModes = drawModes;
        return this;
    }

 
    /**
     * 设置绘图工具是否链接到编辑器中的导入栏
     * @param {boolean} linked 是否连接
     * @returns ui.Map.DrawingTools
     */
    setLinked(linked: boolean) {
        this.linked = linked;
        return this;
    }

    /**
     * 设置选择图层
     * @param {GeometryLayer} layer 选择的图层
     * @returns ui.Map.DrawingTools
     */
    setSelected(layer: GeometryLayer) {
        this.selected = layer;
        return this;
    }

    /**
     * 设置默认绘制的图形
     * @param {string} shape 图形
     * @returns ui.Map.DrawingTools
     */
    setShape(shape: string) {
        this.shape = shape;
        return this;
    }

    /**
     * 设置绘图工具是否显示
     * @param {boolean} shown 是否显示
     * @returns ui.Map.DrawingTools
     */
    setShown(shown: boolean) {
        this.shown = shown;
        return this;
    }

    onDraw(callback: Function) {
        if (callback) {
            callback(this);
        }
    }
    onEdit(callback: Function) {
        if (callback) {
            callback(this);
        }
    }
    onSelect(callback: Function) {
        if (callback) {
            callback(this);
        }
    }
    onErase(callback: Function) {
        if (callback) {
            callback(this);
        }
    }
}