import Clock from "../clock/Clock";

export default LifeTime;

declare namespace LifeTime {
    /**
     * Configuration options for creating a LifeTime.
     */
    interface IConfig {
        /**
         * Lifetime duration in milliseconds.
         */
        lifeTime?: number,
        /**
         * Destroy the game object on completion.
         */
        destroy?: boolean,
        /**
         * Start immediately.
         */
        start?: boolean
    }

    namespace Events {
        /**
         * Complete callback signature.
         *
         * @param gameObject - Target game object.
         * @param lifeTime - LifeTime instance.
         */
        type CompleteCallbackType = (
            gameObject: Phaser.GameObjects.GameObject,
            lifeTime: LifeTime
        ) => void;
    }
}

/**
 * Tracks a game object's lifetime.
 */
declare class LifeTime extends Clock {
    /**
     * Create a LifeTime tracker.
     *
     * @param gameObject - Target game object.
     * @param config - Configuration options.
     */
    constructor(
        gameObject: Phaser.GameObjects.GameObject,
        config?: LifeTime.IConfig
    );
    /**
     * Target game object.
     */
    readonly gameObject: Phaser.GameObjects.GameObject;

    /**
     * Set lifetime duration.
     *
     * @param time - Duration in milliseconds.
     * @returns This LifeTime instance.
     */
    setLifeTime(time: number): this;
    /**
     * Add to lifetime duration.
     *
     * @param time - Duration to add in milliseconds.
     * @returns This LifeTime instance.
     */
    addToLifeTime(time: number): this;
    /**
     * Lifetime duration in milliseconds.
     */
    readonly lifeTime: number;
    /**
     * Remaining time in milliseconds.
     */
    readonly remainder: number;
    /**
     * Whether the object is still alive.
     */
    readonly isAlive: boolean;


}
