package com.walrusone.skywarsreloaded.managers;

import com.google.common.collect.Maps;
import com.walrusone.skywarsreloaded.SkyWarsReloaded;
import com.walrusone.skywarsreloaded.enums.GameType;
import com.walrusone.skywarsreloaded.game.Crate;
import com.walrusone.skywarsreloaded.game.GameMap;
import com.walrusone.skywarsreloaded.menus.playeroptions.GlassColorOption;
import com.walrusone.skywarsreloaded.menus.playeroptions.KillSoundOption;
import com.walrusone.skywarsreloaded.menus.playeroptions.ParticleEffectOption;
import com.walrusone.skywarsreloaded.menus.playeroptions.ProjectileEffectOption;
import com.walrusone.skywarsreloaded.menus.playeroptions.TauntOption;
import com.walrusone.skywarsreloaded.menus.playeroptions.WinSoundOption;
import com.walrusone.skywarsreloaded.menus.playeroptions.objects.ParticleEffect;
import com.walrusone.skywarsreloaded.utilities.Util;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.scheduler.BukkitRunnable;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

public class PlayerOptionsManager {

	private final Map<Projectile, List<ParticleEffect>> projectileMap = Maps.newConcurrentMap();
	private final Map<UUID, List<ParticleEffect>> playerMap = Maps.newConcurrentMap();
	private final List<ParticleEffect> crateEffects = new ArrayList<>();

    public PlayerOptionsManager() {
    	if (SkyWarsReloaded.getCfg().particlesEnabled()) {
    		crateEffects.add(new ParticleEffect("CRIT", 0, 2, 0, 8, 4));
    		crateEffects.add(new ParticleEffect("CRIT_MAGIC", 0, 2, 0, 8, 4));
            SkyWarsReloaded.get().getServer().getScheduler().scheduleSyncRepeatingTask(SkyWarsReloaded.get(), () -> {
                for (Projectile projectile: projectileMap.keySet()) {
                    if (projectile.isDead()) {
                        projectileMap.remove(projectile);
                    } else {
                        List<ParticleEffect> effects = projectileMap.get(projectile);
                        doEffects(projectile.getLocation(), effects, true);
                    }
                }
                for (UUID p: playerMap.keySet()) {
                    Player player = Bukkit.getPlayer(p);
                    if (player == null) {
                        playerMap.remove(p);
                    } else {
                        List<ParticleEffect> effects = playerMap.get(p);
                        doEffects(player.getLocation(), effects, false);
                    }
                }

                for (GameMap gMap: GameMap.getPlayableArenas(GameType.ALL)) {
                    for (Crate crate: gMap.getCrates()) {
                        doEffects(crate.getEntity().getLocation(), crateEffects, false);
                    }
                }
            }, SkyWarsReloaded.getCfg().getTicksPerUpdate(), SkyWarsReloaded.getCfg().getTicksPerUpdate());
    	}
    	GlassColorOption.loadPlayerOptions();
    	ParticleEffectOption.loadPlayerOptions();
    	ProjectileEffectOption.loadPlayerOptions();
    	WinSoundOption.loadPlayerOptions();
    	KillSoundOption.loadPlayerOptions();
    	TauntOption.loadPlayerOptions();
    }
    
    /*Handles projectile effects*/
  
    public void addProjectile(Projectile p, List<ParticleEffect> e) {
		projectileMap.put(p,  e);
	}
    
    void addPlayer(UUID p, List<ParticleEffect> e) {
		playerMap.put(p,  e);
	}
    
    void removePlayer(UUID p) {
		playerMap.remove(p);
	}
	
	private void doEffects(Location location, List<ParticleEffect> effects, boolean isProjectile) {
		Random random = new Random();
		if (isProjectile) {
			for (ParticleEffect p: effects) {
				Util.get().sendParticles(location.getWorld(), p.getType(), (float) location.getX(), (float) location.getY(), (float) location.getZ(), 0, 0, 0, getData(p), 2);
				new BukkitRunnable() {
					@Override
					public void run() {
						for (int i = 0; i < 3; i++) {
							Util.get().sendParticles(location.getWorld(), p.getType(), (float) location.getX(), (float) location.getY(), (float) location.getZ(), (float)(random.nextFloat() * (0.5 - -0.5) + - 0.5), (float)(random.nextFloat() * (0.5 - -0.5) + - 0.5), (float)(random.nextFloat() * (0.5 - -0.5) + - 0.5), getData(p), 1);
						}
					}
				}.runTaskLater(SkyWarsReloaded.get(), 3);
			}
		} else {
			for (ParticleEffect p: effects) {
				Util.get().sendParticles(location.getWorld(), p.getType(), (float) location.getX(), (float) location.getY(), (float) location.getZ(), random.nextFloat(), random.nextFloat() * (p.getOffsetYU() - p.getOffsetYL()) + p.getOffsetYL() , random.nextFloat(), getData(p), random.nextInt((p.getAmountU() - p.getAmountL()) + p.getAmountL()) + 1);
			}
		}
	}
	
	private float getData(ParticleEffect p) {
		Random random = new Random();
		float data = p.getData();
		if (p.getData() == -1) {
			data = random.nextFloat();
		}
		return data;
	}
    
}