/**
 * @author mrdoob / http://mrdoob.com/
 */

Sidebar.Geometry = function ( editor ) {

	var signals = editor.signals;

	var container = new UI.CollapsiblePanel();
	container.setCollapsed( editor.config.getKey( 'ui/sidebar/geometry/collapsed' ) );
	container.onCollapsedChange( function ( boolean ) {

		editor.config.setKey( 'ui/sidebar/geometry/collapsed', boolean );

	} );
	container.setDisplay( 'none' );

	var geometryType = new UI.Text().setTextTransform( 'uppercase' );
	container.addStatic( geometryType );

	// Actions

	var objectActions = new UI.Select().setPosition('absolute').setRight( '8px' ).setFontSize( '11px' );
	objectActions.setOptions( {

		'Actions': 'Actions',
		'Center': 'Center',
		'Flatten': 'Flatten'

	} );
	objectActions.onClick( function ( event ) {

		event.stopPropagation(); // Avoid panel collapsing

	} );
	objectActions.onChange( function ( event ) {

		var action = this.getValue();

		var object = editor.selected;
		var geometry = object.geometry;

		if ( confirm( action + ' ' + object.name + '?' ) === false ) return;

		switch ( action ) {

			case 'Center':

				var offset = geometry.center();

				object.position.sub( offset );

				editor.signals.geometryChanged.dispatch( geometry );
				editor.signals.objectChanged.dispatch( object );

				break;

			case 'Flatten':

				geometry.applyMatrix( object.matrix );

				object.position.set( 0, 0, 0 );
				object.rotation.set( 0, 0, 0 );
				object.scale.set( 1, 1, 1 );

				editor.signals.geometryChanged.dispatch( geometry );
				editor.signals.objectChanged.dispatch( object );

				break;

		}

		this.setValue( 'Actions' );

		signals.objectChanged.dispatch( object );

	} );
	container.addStatic( objectActions );

	container.add( new UI.Break() );

	// uuid

	var geometryUUIDRow = new UI.Panel();
	var geometryUUID = new UI.Input().setWidth( '115px' ).setFontSize( '12px' ).setDisabled( true );
	var geometryUUIDRenew = new UI.Button( '⟳' ).setMarginLeft( '7px' ).onClick( function () {

		geometryUUID.setValue( THREE.Math.generateUUID() );

		editor.selected.geometry.uuid = geometryUUID.getValue();

	} );

	geometryUUIDRow.add( new UI.Text( 'UUID' ).setWidth( '90px' ) );
	geometryUUIDRow.add( geometryUUID );
	geometryUUIDRow.add( geometryUUIDRenew );

	container.add( geometryUUIDRow );

	// name

	var geometryNameRow = new UI.Panel();
	var geometryName = new UI.Input().setWidth( '150px' ).setFontSize( '12px' ).onChange( function () {

		editor.setGeometryName( editor.selected.geometry, geometryName.getValue() );

	} );

	geometryNameRow.add( new UI.Text( 'Name' ).setWidth( '90px' ) );
	geometryNameRow.add( geometryName );

	container.add( geometryNameRow );

	// geometry

	container.add( new Sidebar.Geometry.Geometry( signals ) );

	// buffergeometry

	container.add( new Sidebar.Geometry.BufferGeometry( signals ) );

	// parameters

	var parameters = new UI.Panel();
	container.add( parameters );


	//

	function build() {

		var object = editor.selected;

		if ( object && object.geometry ) {

			var geometry = object.geometry;

			container.setDisplay( 'block' );

			geometryType.setValue( geometry.type );

			geometryUUID.setValue( geometry.uuid );
			geometryName.setValue( geometry.name );

			//

			parameters.clear();

			if ( geometry instanceof THREE.BoxGeometry ) {

				parameters.add( new Sidebar.Geometry.BoxGeometry( signals, object ) );

			} else if ( geometry instanceof THREE.CircleGeometry ) {

				parameters.add( new Sidebar.Geometry.CircleGeometry( signals, object ) );

			} else if ( geometry instanceof THREE.CylinderGeometry ) {

				parameters.add( new Sidebar.Geometry.CylinderGeometry( signals, object ) );

			} else if ( geometry instanceof THREE.SphereGeometry ) {

				parameters.add( new Sidebar.Geometry.SphereGeometry( signals, object ) );

			} else if ( geometry instanceof THREE.IcosahedronGeometry ) {

				parameters.add( new Sidebar.Geometry.IcosahedronGeometry( signals, object ) );

			} else if ( geometry instanceof THREE.PlaneGeometry ) {

				parameters.add( new Sidebar.Geometry.PlaneGeometry( signals, object ) );

			} else if ( geometry instanceof THREE.TorusGeometry ) {

				parameters.add( new Sidebar.Geometry.TorusGeometry( signals, object ) );

			} else if ( geometry instanceof THREE.TorusKnotGeometry ) {

				parameters.add( new Sidebar.Geometry.TorusKnotGeometry( signals, object ) );

			}

			parameters.add( new Sidebar.Geometry.Modifiers( signals, object ) );

		} else {

			container.setDisplay( 'none' );

		}

	}

	signals.objectSelected.add( build );
	signals.geometryChanged.add( build );

	return container;

}