package me.jakev.particleemitter.listeners;

import api.listener.Listener;
import api.listener.events.weapon.BeamPostAddEvent;
import api.mod.StarLoader;
import api.mod.StarMod;
import api.utils.particle.ModParticle;
import api.utils.particle.ModParticleFactory;
import api.utils.particle.ModParticleUtil;
import com.bulletphysics.linearmath.Transform;
import me.jakev.SpriteList;
import me.jakev.particleemitter.particles.EnergyParticle;
import me.jakev.particleemitter.particles.FadeParticle;

import javax.vecmath.Vector3f;

/**
 * Created by Jake on 12/8/2020.
 * <insert description here>
 */
public class ExtraEffectBeamListener {
    private static final float CIRCLE_RADIUS = 2F;
    private static final float CIRCLE_LENGTH_OFFSET = 40F;
    public static void init(StarMod mod) {
        StarLoader.registerListener(BeamPostAddEvent.class, new Listener<BeamPostAddEvent>() {
            @Override
            public void onEvent(BeamPostAddEvent event) {

                Vector3f start = new Vector3f(event.getBeamState().from);


                Vector3f normal = new Vector3f();
                if (event.getBeamState().hitPoint == null) {
                    normal.set(event.getBeamState().to);
                } else {
                    normal.set(event.getBeamState().hitPoint);
                    ModParticleUtil.playClient(new Vector3f(event.getBeamState().hitPoint), SpriteList.ENERGY.getSprite(), 3, 700, 0.6F, 0, 0, 0, new ModParticleFactory() {
                        @Override
                        public ModParticle newParticle() {
                            return new EnergyParticle();
                        }
                    });
                }
                normal.sub(event.getBeamState().from);
                float length = normal.length();
                normal.normalize();

                Vector3f normalNormal = new Vector3f(normal);
                normal.scale(CIRCLE_LENGTH_OFFSET);

                for (float i = 0; i < length; i += CIRCLE_LENGTH_OFFSET) {
                    start.add(normal);
//                    if (i > 900) {
                    if (i > 3000) {
                        return;
                    }
                    if (i < 6) {
                        continue;
                    }

                    Transform transform = new Transform();
                    transform.origin.set(start);
                    Vector3f orthA = new Vector3f(10,0,0);
                    orthA.cross(orthA, normalNormal);
                    Vector3f orthB = new Vector3f();
                    orthB.cross(orthA, normalNormal);
                    transform.basis.setColumn(2, normalNormal);
                    transform.basis.setColumn(1, orthA);
                    transform.basis.setColumn(0, orthB);

                    for (float r = 0; r < Math.PI*2; r+=0.3F) {
                        Vector3f n = new Vector3f((float)Math.sin(r)*CIRCLE_RADIUS,(float)Math.cos(r)*CIRCLE_RADIUS,0);
                        transform.transform(n);
                        ModParticleUtil.playClient(n, SpriteList.BALL.getSprite(), 1, 400, new Vector3f(0, 0, 0), new ModParticleFactory() {
                            @Override
                            public ModParticle newParticle() {
                                return new FadeParticle();
                            }
                        });
                    }
                }
            }
        }, mod);
    }
}
