import { ForwardRefExoticComponent } from 'react';
import { RefAttributes } from 'react';
import * as THREE from 'three';

export declare enum AppearanceMode {
    Square = 0,
    Circular = 1
}

declare type EaseFunction = "easeLinear" | "easeInPower1" | "easeOutPower1" | "easeInOutPower1" | "easeInPower2" | "easeOutPower2" | "easeInOutPower2" | "easeInPower3" | "easeOutPower3" | "easeInOutPower3" | "easeInPower4" | "easeOutPower4" | "easeInOutPower4" | "easeInQuad" | "easeOutQuad" | "easeInOutQuad" | "easeInCubic" | "easeOutCubic" | "easeInOutCubic" | "easeInQuart" | "easeOutQuart" | "easeInOutQuart" | "easeInQuint" | "easeOutQuint" | "easeInOutQuint" | "easeInSine" | "easeOutSine" | "easeInOutSine" | "easeInExpo" | "easeOutExpo" | "easeInOutExpo" | "easeInCirc" | "easeOutCirc" | "easeInOutCirc" | "easeInElastic" | "easeOutElastic" | "easeInOutElastic" | "easeInBack" | "easeOutBack" | "easeInOutBack" | "easeInBounce" | "easeOutBounce" | "easeInOutBounce";

export declare enum RenderMode {
    StretchBillboard = "stretchBillboard",
    Billboard = "billboard",
    Mesh = "mesh"
}

export declare const VFXEmitter: ForwardRefExoticComponent<VFXEmitterProps & RefAttributes<VFXEmitterRef>>;

declare interface VFXEmitterProps {
    debug?: boolean;
    settings: VFXEmitterSettings;
    emitter: string;
    localDirection?: boolean;
    autoStart?: boolean;
}

declare interface VFXEmitterRef extends THREE.Object3D {
    startEmitting: (reset?: boolean) => void;
    stopEmitting: () => void;
    emitAtPos: (position: THREE.Vector3 | null, reset?: boolean) => void;
}

declare interface VFXEmitterSettings {
    duration?: number;
    nbParticles?: number;
    spawnMode?: "time" | "burst";
    loop?: boolean;
    delay?: number;
    colorStart?: string[];
    colorEnd?: string[];
    particlesLifetime?: [number, number];
    speed?: [number, number];
    size?: [number, number];
    startPositionMin?: [number, number, number];
    startPositionMax?: [number, number, number];
    startRotationMin?: [number, number, number];
    startRotationMax?: [number, number, number];
    rotationSpeedMin?: [number, number, number];
    rotationSpeedMax?: [number, number, number];
    directionMin?: [number, number, number];
    directionMax?: [number, number, number];
}

export declare const VFXParticles: React.FC<VFXParticlesProps>;

declare interface VFXParticlesProps {
    name: string;
    settings?: VFXParticlesSettings;
    alphaMap?: THREE.Texture;
    geometry?: React.ReactElement;
}

declare interface VFXParticlesSettings {
    nbParticles?: number;
    intensity?: number;
    renderMode?: RenderMode;
    stretchScale?: number;
    fadeSize?: [number, number];
    fadeAlpha?: [number, number];
    gravity?: [number, number, number];
    frustumCulled?: boolean;
    appearance?: AppearanceMode;
    easeFunction?: EaseFunction;
}

export { }


declare module "@react-three/fiber" {
    interface ThreeElements {
        particlesMaterial: ThreeElements["shaderMaterial"] & {
            alphaMap?: THREE.Texture;
        };
    }
}
