// Copyright (c) 2015 - 2017 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
/* eslint-disable max-len */

var experimental = {};

//
// CORE LIBRARY
//

export {
// LIB
COORDINATE_SYSTEM, LayerManager, AttributeManager, Layer, CompositeLayer,
// Viewports
Viewport, WebMercatorViewport, PerspectiveViewport, OrthographicViewport,
// Shader modules
project, project64, lighting } from './core';

// EXPERIMENTAL CORE LIB CLASSES (May change in minor version bumps, use at your own risk)
import { experimental as CoreExperimental } from './core';

var View = CoreExperimental.View,
    MapView = CoreExperimental.MapView,
    FirstPersonView = CoreExperimental.FirstPersonView,
    ThirdPersonView = CoreExperimental.ThirdPersonView,
    OrbitView = CoreExperimental.OrbitView,
    PerspectiveView = CoreExperimental.PerspectiveView,
    OrthographicView = CoreExperimental.OrthographicView,
    ViewState = CoreExperimental.ViewState,
    FirstPersonState = CoreExperimental.FirstPersonState,
    OrbitState = CoreExperimental.OrbitState,
    MapState = CoreExperimental.MapState,
    Controller = CoreExperimental.Controller,
    FirstPersonController = CoreExperimental.FirstPersonController,
    ViewportController = CoreExperimental.ViewportController,
    FirstPersonViewport = CoreExperimental.FirstPersonViewport,
    OrbitViewport = CoreExperimental.OrbitViewport,
    ThirdPersonViewport = CoreExperimental.ThirdPersonViewport,
    TRANSITION_EVENTS = CoreExperimental.TRANSITION_EVENTS,
    LinearInterpolator = CoreExperimental.LinearInterpolator,
    ViewportFlyToInterpolator = CoreExperimental.ViewportFlyToInterpolator,
    Deck = CoreExperimental.Deck,
    MapControllerJS = CoreExperimental.MapControllerJS,
    EffectManager = CoreExperimental.EffectManager,
    Effect = CoreExperimental.Effect;


Object.assign(experimental, {
  View: View,
  MapView: MapView,
  FirstPersonView: FirstPersonView,
  ThirdPersonView: ThirdPersonView,
  OrbitView: OrbitView,
  PerspectiveView: PerspectiveView,
  OrthographicView: OrthographicView,

  // Unfinished controller/viewport classes
  ViewState: ViewState,
  FirstPersonState: FirstPersonState,
  OrbitState: OrbitState,
  MapState: MapState,

  Controller: Controller,
  FirstPersonController: FirstPersonController,
  ViewportController: ViewportController,

  FirstPersonViewport: FirstPersonViewport,
  OrbitViewport: OrbitViewport,
  ThirdPersonViewport: ThirdPersonViewport,

  // Transition bindings
  TRANSITION_EVENTS: TRANSITION_EVENTS,
  LinearInterpolator: LinearInterpolator,
  ViewportFlyToInterpolator: ViewportFlyToInterpolator,

  // Pure JS (non-React) API
  Deck: Deck,
  MapControllerJS: MapControllerJS,

  // Effects base classes
  EffectManager: EffectManager,
  Effect: Effect
});

// Experimental Data Accessor Helpers
// INTERNAL - TODO remove from experimental exports
var TransitionManager = CoreExperimental.TransitionManager,
    extractViewState = CoreExperimental.extractViewState,
    BinSorter = CoreExperimental.BinSorter,
    linearScale = CoreExperimental.linearScale,
    getLinearScale = CoreExperimental.getLinearScale,
    quantizeScale = CoreExperimental.quantizeScale,
    getQuantizeScale = CoreExperimental.getQuantizeScale,
    clamp = CoreExperimental.clamp,
    defaultColorRange = CoreExperimental.defaultColorRange,
    log = CoreExperimental.log,
    get = CoreExperimental.get,
    count = CoreExperimental.count,
    flatten = CoreExperimental.flatten,
    countVertices = CoreExperimental.countVertices,
    flattenVertices = CoreExperimental.flattenVertices,
    fillArray = CoreExperimental.fillArray,
    enable64bitSupport = CoreExperimental.enable64bitSupport,
    fp64ify = CoreExperimental.fp64ify,
    fp64LowPart = CoreExperimental.fp64LowPart;


Object.assign(experimental, {
  // For react module
  TransitionManager: TransitionManager,
  extractViewState: extractViewState,

  // For layers
  BinSorter: BinSorter,
  linearScale: linearScale,
  getLinearScale: getLinearScale,
  quantizeScale: quantizeScale,
  getQuantizeScale: getQuantizeScale,
  clamp: clamp,
  defaultColorRange: defaultColorRange,

  log: log,

  get: get,
  count: count,

  flatten: flatten,
  countVertices: countVertices,
  flattenVertices: flattenVertices,
  fillArray: fillArray,

  enable64bitSupport: enable64bitSupport,
  fp64ify: fp64ify,
  fp64LowPart: fp64LowPart
});

//
// EFFECTS PACKAGE
//

import { default as ReflectionEffect } from './core/experimental/reflection-effect/reflection-effect';

Object.assign(experimental, {
  ReflectionEffect: ReflectionEffect
});

//
// CORE LAYERS PACKAGE
//

export { ArcLayer, IconLayer, LineLayer, PointCloudLayer, ScatterplotLayer, ScreenGridLayer, GridLayer, GridCellLayer, HexagonLayer, HexagonCellLayer, PathLayer, PolygonLayer, GeoJsonLayer } from './core-layers';

//
// REACT BINDINGS PACKAGE
//

export { default, DeckGL } from './react';

// TODO - do we need to expose these?
import { MapController, OrbitController, ViewportController as ReactViewportController // TODO - merge with deck.gl?
} from './react';

Object.assign(experimental, {
  MapController: MapController,
  OrbitController: OrbitController,
  ReactViewportController: ReactViewportController
});

//
// EXPERIMENTAL EXPORTS
//

export { experimental };
//# sourceMappingURL=index.js.map