/**
 * @author zhangti
 * @description 几何缓冲区示例代码
 */
Cesium && (() => {
    /**
     * 笛卡尔转经纬度
     * @param {*} cartesian 
     */
    const cartesianToWGS84 = (cartesian) => {
        let ellipsoid = Cesium.Ellipsoid.WGS84
        let cartographic = ellipsoid.cartesianToCartographic(cartesian)
        return {
            lng: Cesium.Math.toDegrees(cartographic.longitude),
            lat: Cesium.Math.toDegrees(cartographic.latitude),
            alt: cartographic.height
        }
    }
    /**
     * 笛卡尔数组转经纬度数组
     * @param {*} cartesianArr 
     */
    const cartesianArrayToWGS84Array = (cartesianArr) => {

        return cartesianArr
            ? cartesianArr.map((item) => { return cartesianToWGS84(item) })
            : []
    }
    /**
     * 创建点
     * @param params
     */
    Cesium.drawPointGraphics = function (params) {

        return new Promise((resolve, reject) => {

            const _viewer = params.viewer
            const _style = params.style ||
            {
                image: 'src/location4.png',
                width: 35,
                height: 40,
                clampToGround: true,
                scale: 1,
                pixelOffset: new Cesium.Cartesian2(0, -20),
            }
            let _poiEntity = new Cesium.Entity(),
                _handlers,
                _position,
                _positions = [],
                _poiObj

            _viewer && (() => {
                _handlers = new Cesium.ScreenSpaceEventHandler(_viewer.scene.canvas)
                // left
                _handlers.setInputAction((movement) => {

                    let cartesian = _viewer.scene.camera.pickEllipsoid(movement.position, _viewer.scene.globe.ellipsoid)
                    cartesian && cartesian.x && (_position = cartesian, _positions.push(_position))

                }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
                // right
                _handlers.setInputAction((movement) => {

                    _handlers.destroy(),
                        _handlers = null,
                        resolve && (
                            resolve(cartesianArrayToWGS84Array(_positions), _poiObj))

                }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

                _poiEntity.billboard = _style
                _poiEntity.position = new Cesium.CallbackProperty(function () {
                    return _position
                }, false)

                _poiObj = _viewer.entities.add(_poiEntity)
            }
            )()


        });

    }
    /**
     * 画线
     * @param {*} params 
     */
    Cesium.drawLineGraphics = function (params) {

        return new Promise((resolve, reject) => {

            const _viewer = params.viewer
            const _style = params.style || {}
            let _lineEntity = new Cesium.Entity(),
                _positions = [],
                _lineObj
            _viewer && (() => {

                _handlers = new Cesium.ScreenSpaceEventHandler(_viewer.scene.canvas);

                // left
                _handlers.setInputAction(function (movement) {

                    let cartesian = _viewer.scene.camera.pickEllipsoid(movement.position, _viewer.scene.globe.ellipsoid)

                    cartesian && cartesian.x && (
                        _positions.length == 0 && _positions.push(cartesian.clone()),
                        _positions.push(cartesian))

                }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

                // move
                _handlers.setInputAction(function (movement) {

                    let cartesian = _viewer.scene.camera.pickEllipsoid(movement.endPosition, _viewer.scene.globe.ellipsoid)

                    _positions.length >= 2 && (
                        cartesian && cartesian.x && (
                            _positions.pop(),
                            _positions.push(cartesian)
                        )
                    )
                }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
                // right
                _handlers.setInputAction(function (movement) {

                    _handlers.destroy(),

                        _handlers = null,

                        resolve && (
                            resolve(cartesianArrayToWGS84Array(_positions), _lineObj)
                        )
                }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

                _lineEntity.polyline = {
                    width: _style.width || 5
                    , material: _style.material || Cesium.Color.BLUE.withAlpha(0.8)
                    , clampToGround: _style.clampToGround || false
                }

                _lineEntity.polyline.positions = new Cesium.CallbackProperty(function () {
                    return _positions
                }, false)

                _lineObj = _viewer.entities.add(_lineEntity)
            })()

        });
    }
    /**
     * 画面 
     * @param {*} params 
     */
    Cesium.drawPolygonGraphics = function (params) {

        return new Promise((resolve, reject) => {

            const _viewer = params.viewer
            const _style = params.style ||
            {
                width: 3
                , material: Cesium.Color.BLUE.withAlpha(0.8)
                , clampToGround: true
            }
            let _positions = [],
                _polygon = new Cesium.PolygonHierarchy(),
                _polygonEntity = new Cesium.Entity(),
                _polyObj,
                _handler

            _viewer && (() => {
                _handler = new Cesium.ScreenSpaceEventHandler(_viewer.scene.canvas);
                // left
                _handler.setInputAction(function (movement) {

                    let cartesian = _viewer.scene.camera.pickEllipsoid(movement.position, _viewer.scene.globe.ellipsoid)

                    cartesian && cartesian.x && (() => {
                        _positions.length == 0 && (
                            _polygon.positions.push(cartesian.clone()),
                            _positions.push(cartesian.clone()))

                        _positions.push(cartesian.clone()),
                            _polygon.positions.push(cartesian.clone())
                    })()
                }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
                // mouse
                _handler.setInputAction(function (movement) {

                    let cartesian = _viewer.scene.camera.pickEllipsoid(movement.endPosition, _viewer.scene.globe.ellipsoid)

                    _positions.length >= 2 && (cartesian && cartesian.x && (
                        _positions.pop(),
                        _positions.push(cartesian),
                        _polygon.positions.pop(),
                        _polygon.positions.push(cartesian)))

                }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

                // right
                _handler.setInputAction(function (movement) {

                    _handler.destroy(),

                        _handler = null,

                        _positions.push(_positions[0]),

                        resolve && (
                            resolve(cartesianArrayToWGS84Array(_positions), _polyObj)
                        )
                }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);


                _polygonEntity.polyline = _style

                _polygonEntity.polyline.positions = new Cesium.CallbackProperty(function () {
                    return _positions
                }, false)

                _polygonEntity.polygon = {

                    hierarchy: new Cesium.CallbackProperty(function () {
                        return _polygon
                    }, false),

                    material: Cesium.Color.WHITE.withAlpha(0.1)
                    , clampToGround: _style.clampToGround || false
                }

                _polyObj = _viewer.entities.add(_polygonEntity)
            })()

        });

    }
    /**
     * 创建缓冲区图形
     * @param {*} params 
     */
    Cesium.createGraphicsBuffer = function (params) {
        const _viewer = params.viewer
        let _turfPositions = params.turfPositions || []
        let _material = params.material || []
        let _animation = params.animation || false
        let _bufferEntity = new Cesium.Entity()
        let _hierarchy = new Cesium.PolygonHierarchy()
        let _radius = params.radius || 0.1
        let radius = 0
        const parse = (arr) => {
            var buffered = [];
            for (var i = 0; i < arr.length; i++) {
                buffered = buffered.concat(arr[i]);
            }
            return buffered
        }
        _bufferEntity.animation = _animation;
        _bufferEntity.polygon = {
            material: Cesium.Color.SKYBLUE.withAlpha(0.5),
            hierarchy: new Cesium.CallbackProperty(function (time, result) {
                if (_bufferEntity.animation === undefined || _bufferEntity.animation) { // 动画
                    if (radius <= _radius) {
                        radius += 0.02
                    } else {
                        radius = 0.02
                    }
                } else {
                    radius = _radius
                }
                let buffered = parse(
                    turf.buffer(_turfPositions, radius, { units: 'kilometers' }).geometry
                        .coordinates[0]
                )
                _hierarchy.positions = Cesium.Cartesian3.fromDegreesArray(buffered, Cesium.Ellipsoid.WGS84, result)
                return _hierarchy;
            }, false),
        }

        return _viewer.entities.add(_bufferEntity)
    }

    let a = 'background: #606060; color: #fff; border-radius: 3px 0 0 3px;'
    let b = 'background: #1475B2; color: #fff; border-radius: 0 3px 3px 0;'
    console.log(`%c web3d/webgis相关工作推荐邮箱 : %c zhangticcc@163.com `, a, b)
    console.log(`更多插件https://github.com/zhangti0708 %c =,=给个广告位`, b)
})();