import React3Descriptor from './descriptors/React3Descriptor';

import ModuleDescriptor from './descriptors/ModuleDescriptor';

import ViewportDescriptor from './descriptors/ViewportDescriptor';
import SceneDescriptor from './descriptors/Object/SceneDescriptor';

import Object3DDescriptor from './descriptors/Object/Object3DDescriptor';
import GroupDescriptor from './descriptors/Object/GroupDescriptor';

import OrthographicCameraDescriptor from './descriptors/Object/Camera/OrthographicCameraDescriptor';
import PerspectiveCameraDescriptor from './descriptors/Object/Camera/PerspectiveCameraDescriptor';
import CubeCameraDescriptor from './descriptors/Object/Camera/CubeCameraDescriptor';

import MeshDescriptor from './descriptors/Object/MeshDescriptor';
import LineDescriptor from './descriptors/Object/LineDescriptor';
import LineSegmentsDescriptor from './descriptors/Object/LineSegmentsDescriptor';
import PointsDescriptor from './descriptors/Object/PointsDescriptor';
import SpriteDescriptor from './descriptors/Object/SpriteDescriptor';

import AmbientLightDescriptor from './descriptors/Light/AmbientLightDescriptor';
import DirectionalLightDescriptor from './descriptors/Light/DirectionalLightDescriptor';
import SpotLightDescriptor from './descriptors/Light/SpotLightDescriptor';
import PointLightDescriptor from './descriptors/Light/PointLightDescriptor';
import HemisphereLightDescriptor from './descriptors/Light/HemisphereLightDescriptor';

import ResourcesDescriptor from './descriptors/Resource/ResourcesDescriptor';
import GeometryResourceDescriptor from './descriptors/Resource/GeometryResourceDescriptor';
import ShapeGeometryResourceDescriptor from
  './descriptors/Resource/ShapeGeometryResourceDescriptor';
import TextureResourceDescriptor from './descriptors/Resource/TextureResourceDescriptor';
import ShapeResourceDescriptor from './descriptors/Resource/ShapeResourceDescriptor';

import GeometryDescriptor from './descriptors/Geometry/GeometryDescriptor';
import BufferGeometryDescriptor from './descriptors/Geometry/BufferGeometryDescriptor';
import BoxGeometryDescriptor from './descriptors/Geometry/BoxGeometryDescriptor';
import SphereGeometryDescriptor from './descriptors/Geometry/SphereGeometryDescriptor';
import ParametricGeometryDescriptor from './descriptors/Geometry/ParametricGeometryDescriptor';
import PlaneBufferGeometryDescriptor from './descriptors/Geometry/PlaneBufferGeometryDescriptor';
import PlaneGeometryDescriptor from './descriptors/Geometry/PlaneGeometryDescriptor';
import PolyhedronGeometryDescriptor from './descriptors/Geometry/PolyhedronGeometryDescriptor';
import IcosahedronGeometryDescriptor from './descriptors/Geometry/IcosahedronGeometryDescriptor';
import OctahedronGeometryDescriptor from './descriptors/Geometry/OctahedronGeometryDescriptor';
import TetrahedronGeometryDescriptor from './descriptors/Geometry/TetrahedronGeometryDescriptor';
import CircleGeometryDescriptor from './descriptors/Geometry/CircleGeometryDescriptor';
import CircleBufferGeometryDescriptor from './descriptors/Geometry/CircleBufferGeometryDescriptor';
import RingGeometryDescriptor from './descriptors/Geometry/RingGeometryDescriptor';
import CylinderGeometryDescriptor from './descriptors/Geometry/CylinderGeometryDescriptor';
import LatheGeometryDescriptor from './descriptors/Geometry/LatheGeometryDescriptor';
import TorusGeometryDescriptor from './descriptors/Geometry/TorusGeometryDescriptor';
import TorusKnotGeometryDescriptor from './descriptors/Geometry/TorusKnotGeometryDescriptor';
import ExtrudeGeometryDescriptor from './descriptors/Geometry/ExtrudeGeometryDescriptor';
import TubeGeometryDescriptor from './descriptors/Geometry/TubeGeometryDescriptor';
import DodecahedronGeometryDescriptor from './descriptors/Geometry/DodecahedronGeometryDescriptor';
import TextGeometryDescriptor from './descriptors/Geometry/TextGeometryDescriptor';
import ShapeGeometryDescriptor from './descriptors/Geometry/ShapeGeometryDescriptor';

import ShapeDescriptor from './descriptors/Geometry/Shapes/ShapeDescriptor';
import MoveToDescriptor from './descriptors/Geometry/Shapes/MoveToDescriptor';
import LineToDescriptor from './descriptors/Geometry/Shapes/LineToDescriptor';
import BezierCurveToDescriptor from './descriptors/Geometry/Shapes/BezierCurveToDescriptor';
import QuadraticCurveToDescriptor from './descriptors/Geometry/Shapes/QuadraticCurveToDescriptor';
import AbsArcDescriptor from './descriptors/Geometry/Shapes/AbsArcDescriptor';
import AbsEllipseDescriptor from './descriptors/Geometry/Shapes/AbsEllipseDescriptor';
import HoleDescriptor from './descriptors/Geometry/Shapes/HoleDescriptor';
import SplineThruDescriptor from './descriptors/Geometry/Shapes/SplineThruDescriptor';

import PointsMaterialDescriptor from './descriptors/Material/PointsMaterialDescriptor';
import MeshBasicMaterialDescriptor from './descriptors/Material/MeshBasicMaterialDescriptor';
import MeshPhongMaterialDescriptor from './descriptors/Material/MeshPhongMaterialDescriptor';
import MeshLambertMaterialDescriptor from './descriptors/Material/MeshLambertMaterialDescriptor';
import MeshStandardMaterialDescriptor from './descriptors/Material/MeshStandardMaterialDescriptor';
import ShaderMaterialDescriptor from './descriptors/Material/ShaderMaterialDescriptor';
import RawShaderMaterialDescriptor from './descriptors/Material/RawShaderMaterialDescriptor';
import TextureDescriptor from './descriptors/Material/TextureDescriptor';
import MaterialResourceDescriptor from './descriptors/Resource/MaterialResourceDescriptor';
import UniformsDescriptor from './descriptors/Material/UniformsDescriptor';
import UniformDescriptor from './descriptors/Material/UniformDescriptor';
import LineBasicMaterialDescriptor from './descriptors/Material/LineBasicMaterialDescriptor';
import LineDashedMaterialDescriptor from './descriptors/Material/LineDashedMaterialDescriptor';
import MeshDepthMaterialDescriptor from './descriptors/Material/MeshDepthMaterialDescriptor';
import MeshNormalMaterialDescriptor from './descriptors/Material/MeshNormalMaterialDescriptor';
import SpriteMaterialDescriptor from './descriptors/Material/SpriteMaterialDescriptor';

import CameraHelperDescriptor from './descriptors/Object/Helper/CameraHelperDescriptor';
import AxisHelperDescriptor from './descriptors/Object/Helper/AxisHelperDescriptor';
import ArrowHelperDescriptor from './descriptors/Object/Helper/ArrowHelperDescriptor';
import GridHelperDescriptor from './descriptors/Object/Helper/GridHelperDescriptor';

class ElementDescriptorContainer {
  constructor(react3RendererInstance) {
    this.react3RendererInstance = react3RendererInstance;

    /**
     * @type {Object.<string, THREEElementDescriptor>}
     */
    this.descriptors = {
      react3: new React3Descriptor(react3RendererInstance),

      module: new ModuleDescriptor(react3RendererInstance),

      viewport: new ViewportDescriptor(react3RendererInstance),
      scene: new SceneDescriptor(react3RendererInstance),

      object3D: new Object3DDescriptor(react3RendererInstance),
      group: new GroupDescriptor(react3RendererInstance),

      orthographicCamera: new OrthographicCameraDescriptor(react3RendererInstance),
      perspectiveCamera: new PerspectiveCameraDescriptor(react3RendererInstance),
      cubeCamera: new CubeCameraDescriptor(react3RendererInstance),

      mesh: new MeshDescriptor(react3RendererInstance),
      line: new LineDescriptor(react3RendererInstance),
      lineSegments: new LineSegmentsDescriptor(react3RendererInstance),
      points: new PointsDescriptor(react3RendererInstance),
      sprite: new SpriteDescriptor(react3RendererInstance),

      meshBasicMaterial: new MeshBasicMaterialDescriptor(react3RendererInstance),
      meshPhongMaterial: new MeshPhongMaterialDescriptor(react3RendererInstance),
      meshLambertMaterial: new MeshLambertMaterialDescriptor(react3RendererInstance),
      meshStandardMaterial: new MeshStandardMaterialDescriptor(react3RendererInstance),
      pointsMaterial: new PointsMaterialDescriptor(react3RendererInstance),
      shaderMaterial: new ShaderMaterialDescriptor(react3RendererInstance),
      rawShaderMaterial: new RawShaderMaterialDescriptor(react3RendererInstance),
      lineBasicMaterial: new LineBasicMaterialDescriptor(react3RendererInstance),
      lineDashedMaterial: new LineDashedMaterialDescriptor(react3RendererInstance),
      meshDepthMaterial: new MeshDepthMaterialDescriptor(react3RendererInstance),
      meshNormalMaterial: new MeshNormalMaterialDescriptor(react3RendererInstance),
      spriteMaterial: new SpriteMaterialDescriptor(react3RendererInstance),

      texture: new TextureDescriptor(react3RendererInstance),

      geometry: new GeometryDescriptor(react3RendererInstance),
      bufferGeometry: new BufferGeometryDescriptor(react3RendererInstance),
      boxGeometry: new BoxGeometryDescriptor(react3RendererInstance),
      sphereGeometry: new SphereGeometryDescriptor(react3RendererInstance),
      parametricGeometry: new ParametricGeometryDescriptor(react3RendererInstance),
      planeBufferGeometry: new PlaneBufferGeometryDescriptor(react3RendererInstance),
      planeGeometry: new PlaneGeometryDescriptor(react3RendererInstance),
      polyhedronGeometry: new PolyhedronGeometryDescriptor(react3RendererInstance),
      icosahedronGeometry: new IcosahedronGeometryDescriptor(react3RendererInstance),
      octahedronGeometry: new OctahedronGeometryDescriptor(react3RendererInstance),
      tetrahedronGeometry: new TetrahedronGeometryDescriptor(react3RendererInstance),
      circleGeometry: new CircleGeometryDescriptor(react3RendererInstance),
      circleBufferGeometry: new CircleBufferGeometryDescriptor(react3RendererInstance),
      ringGeometry: new RingGeometryDescriptor(react3RendererInstance),
      cylinderGeometry: new CylinderGeometryDescriptor(react3RendererInstance),
      latheGeometry: new LatheGeometryDescriptor(react3RendererInstance),
      torusGeometry: new TorusGeometryDescriptor(react3RendererInstance),
      torusKnotGeometry: new TorusKnotGeometryDescriptor(react3RendererInstance),
      extrudeGeometry: new ExtrudeGeometryDescriptor(react3RendererInstance),
      tubeGeometry: new TubeGeometryDescriptor(react3RendererInstance),
      dodecahedronGeometry: new DodecahedronGeometryDescriptor(react3RendererInstance),
      textGeometry: new TextGeometryDescriptor(react3RendererInstance),
      shapeGeometry: new ShapeGeometryDescriptor(react3RendererInstance),

      shape: new ShapeDescriptor(react3RendererInstance),
      moveTo: new MoveToDescriptor(react3RendererInstance),
      lineTo: new LineToDescriptor(react3RendererInstance),
      bezierCurveTo: new BezierCurveToDescriptor(react3RendererInstance),
      quadraticCurveTo: new QuadraticCurveToDescriptor(react3RendererInstance),
      absArc: new AbsArcDescriptor(react3RendererInstance),
      absEllipse: new AbsEllipseDescriptor(react3RendererInstance),
      hole: new HoleDescriptor(react3RendererInstance),
      splineThru: new SplineThruDescriptor(react3RendererInstance),

      ambientLight: new AmbientLightDescriptor(react3RendererInstance),
      directionalLight: new DirectionalLightDescriptor(react3RendererInstance),
      spotLight: new SpotLightDescriptor(react3RendererInstance),
      pointLight: new PointLightDescriptor(react3RendererInstance),
      hemisphereLight: new HemisphereLightDescriptor(react3RendererInstance),

      resources: new ResourcesDescriptor(react3RendererInstance),
      materialResource: new MaterialResourceDescriptor(react3RendererInstance),
      geometryResource: new GeometryResourceDescriptor(react3RendererInstance),
      shapeGeometryResource: new ShapeGeometryResourceDescriptor(react3RendererInstance),
      textureResource: new TextureResourceDescriptor(react3RendererInstance),
      shapeResource: new ShapeResourceDescriptor(react3RendererInstance),

      uniforms: new UniformsDescriptor(react3RendererInstance),
      uniform: new UniformDescriptor(react3RendererInstance),

      cameraHelper: new CameraHelperDescriptor(react3RendererInstance),
      axisHelper: new AxisHelperDescriptor(react3RendererInstance),
      arrowHelper: new ArrowHelperDescriptor(react3RendererInstance),
      gridHelper: new GridHelperDescriptor(react3RendererInstance),
    };
  }
}

module.exports = ElementDescriptorContainer;
