import { Position } from '../Core';

/**
 * This type represents the camera (i.e. the viewer in the 3D scene). It allows to retrieve some information
 * about its position and angles, to control them and to control which type of events the camera will react with.
 */
export interface Camera {
    /**
     * The current camera's position.
     */
    readonly position: Position;
    /**
     * The current camera's target (i.e. the location where it is pointing on the current floor).
     */
    readonly target: Position;
    /**
     * The current camera's pitch (i.e. the angle between the vertical and the horizon).
     * 0 is at the extreme top of the manipulator's sphere.
     * 90 is at the horizon.
     */
    pitch: number;
    /**
     * The current camera's heading (i.e. the angle relative to the North).
     */
    heading: number;
    /**
     * The minimum altitude at which the camera can go (expressed in meters).
     * @defaultValue 10 m
     */
    minimumAltitude: number;
    /**
     * The maximum altitude at which the camera can go (expressed in meters).
     * @defaultValue 1500 m
     */
    maximumAltitude: number;
    /**
     * The minium radius the camera can move closed to the target position (expressed in meters).
     * @defaultValue 1 m
     */
    minimumRadius: number;
    /**
     * The maximum radius the camera can move away from the target position (expressed in meters).
     * @defaultValue 7000 m
     */
    maximumRadius: number;
    /**
     * The minimum pitch the camera can go to (expressed in degrees).
     * 0 is at the extreme top of the manipulator's sphere.
     * 90 is at the horizon.
     * @default 0 deg
     */
    minimumPitch: number;
    /**
     * The maximum pitch the camera can go to (expressed in degrees).
     * 0 is at the extreme top of the manipulator's sphere.
     * 90 is at the horizon.
     * @default 75 deg
     */
    maximumPitch: number;
    /**
     * Enable or disable to camera panning movement.
     * @defaultValue true
     */
    panEnabled: boolean;
    /**
     * Enable or disable to camera zoom movement.
     * @defaultValue true
     */
    zoomEnabled: boolean;
    /**
     * Enable or disable to camera rotation movement (this will lock the manipulation of heading).
     * @defaultValue true
     */
    rotationEnabled: boolean;
    /**
     * Enable or disable to camera pitch movement.
     * @defaultValue true
     */
    pitchEnabled: boolean;
}
