package com.yaohun.demonskills.skills.youling;

import com.yaohun.demonskills.SkillsMain;
import com.yaohun.demonskills.component.DelayComponent;
import com.yaohun.demonskills.component.PotionEffectComponent;
import com.yaohun.demonskills.component.SoundComponent;
import com.yaohun.demonskills.component.damage.DamageComponent;
import com.yaohun.demonskills.component.dragoncore.PlayerAnimationComponent;
import com.yaohun.demonskills.component.dragoncore.StandAnimationComponent;
import com.yaohun.demonskills.component.effects.StunPlayerComponent;
import com.yaohun.demonskills.component.particles.ParticlesComponent;
import com.yaohun.demonskills.component.projectile.ProjectileAdvanceComponent;
import com.yaohun.demonskills.core.Skill;
import com.yaohun.demonskills.data.PlayerData;
import com.yaohun.demonskills.manage.PlayerManager;
import com.yaohun.demonskills.target.ConeEnemiesSelector;
import com.yaohun.demonskills.target.SelfSelector;
import org.bukkit.Particle;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
import org.serverct.ersha.jd.AttributeAPI;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Skill_逐影破空斩 {

    private static final String skillName = "逐影破空斩";
    private static final double cooldownTime = 35;
    private static final double cdReducePerLevel = 1.6;     // 每级减少1.2秒冷却
    private static final double minCooldown = 25.0;         // 最低冷却限制

    private static final Map<Integer, Integer> skillMagicMap = new HashMap<>();
    static {
        skillMagicMap.put(1, 1);
        skillMagicMap.put(2, 1);
        skillMagicMap.put(3, 2);
        skillMagicMap.put(4, 2);
        skillMagicMap.put(5, 3);
        skillMagicMap.put(6, 3);
        skillMagicMap.put(7, 4);
        skillMagicMap.put(8, 4);
    }

    public static Skill getSkillItemStack(int skillLevel){
        double realCooldown = Math.max(cooldownTime - cdReducePerLevel * (skillLevel - 1), minCooldown);
        int realNeedMagic = skillMagicMap.getOrDefault(skillLevel, 1);
        return new Skill(skillName, realNeedMagic, realCooldown, 3.0,new ArrayList<>());
    }

    public static Skill getSkillData(Player player) {
        String playerName = player.getName();
        PlayerManager playerManager = SkillsMain.getPlayerManager();
        PlayerData playerData = playerManager.getPlayerData(playerName);
        int skillLevel = playerData.getSkillLevel(skillName);
        double realCooldown = Math.max(cooldownTime - cdReducePerLevel * (skillLevel - 1), minCooldown);
        int realNeedMagic = skillMagicMap.getOrDefault(skillLevel, 1);
        double damageValue = AttributeAPI.getAttrData(player).getAttributeRandomValue("物理伤害");
        double damage = ((0.2 * skillLevel) * damageValue + 50) + damageValue;
        Skill skill = new Skill( // 技能 ID
                skillName,   // 技能名称
                realNeedMagic,      // 魔力需求
                realCooldown,      // 冷却时间
                3.0,
                Arrays.asList(
                        // 技能组件列表
                        new StunPlayerComponent(new SelfSelector(), 40L), // 定身2.0秒
                        new PlayerAnimationComponent("逐影破空斩",48),
                        new StandAnimationComponent("@游灵剑技5", "youling_skill5", 1, 48,0.1),
                        new SoundComponent("刀剑挥舞1.ogg", 0.4f, 1.0f),
                        new DelayComponent(8L,Arrays.asList(
                                new ParticlesComponent(Particle.ENCHANTMENT_TABLE,8,2,8,new ConeEnemiesSelector(8.0,45)),
                                new DamageComponent(damage * 0.1 ,new ConeEnemiesSelector(12.0,45)),
                                new SoundComponent("刀剑挥舞1.ogg", 0.4f, 1.0f),
                                new DelayComponent(9L,Arrays.asList(
                                        new ParticlesComponent(Particle.ENCHANTMENT_TABLE,8,2,8,new ConeEnemiesSelector(8.0,45)),
                                        new DamageComponent(damage * 0.1 ,new ConeEnemiesSelector(12.0,45)),
                                        new SoundComponent("刀剑挥舞1.ogg", 0.4f, 1.0f),
                                        new DelayComponent(4L,Arrays.asList(
                                                new ParticlesComponent(Particle.ENCHANTMENT_TABLE,8,2,8,new ConeEnemiesSelector(8.0,45)),
                                                new DamageComponent(damage * 0.1,new ConeEnemiesSelector(12.0,45)),
                                                new SoundComponent("刀剑挥舞1.ogg", 0.4f, 1.0f),
                                                new DelayComponent(7L,Arrays.asList(
                                                        new ParticlesComponent(Particle.ENCHANTMENT_TABLE,8,2,8,new ConeEnemiesSelector(8.0,45)),
                                                        new DamageComponent(damage * 0.1,new ConeEnemiesSelector(12.0,45)),
                                                        new SoundComponent("刀剑挥舞1.ogg", 0.4f, 1.0f),
                                                        new DelayComponent(6L,Arrays.asList(
                                                                new DamageComponent(damage * 0.1,new ConeEnemiesSelector(12.0,45)),
                                                                new ParticlesComponent(Particle.ENCHANTMENT_TABLE,8,2,8,new ConeEnemiesSelector(8.0,45)),
                                                                new PotionEffectComponent(PotionEffectType.SLOW,10,5,new ConeEnemiesSelector(10.0,45)),
                                                                new SoundComponent("挥舞剑气1.ogg", 0.6f, 1.0f),
                                                                new DelayComponent(8L,Arrays.asList(
                                                                        new ProjectileAdvanceComponent(-2,0.2,new ConeEnemiesSelector(10.0,45,true)),
                                                                        new DamageComponent(damage * 0.2,new ConeEnemiesSelector(10.0,45))
                                                                ))
                                                        ))
                                                ))
                                        ))
                                )
                        ))
                )));
        playerData.setCooldownData(skillName, realCooldown);
        return skill;
    }

}
