package org.project.entity.players;

import org.project.entity.Entity;
import org.project.item.armors.Armor;
import org.project.item.weapons.Weapon;

public abstract class Player implements Entity {
    protected String name;
    protected Weapon weapon;
    protected Armor armor;
    private int hp;
    private int maxHP;
    private int mp;
    private int maxMP;

    // فیلدهای الزامی برای سیستم لول‌آپ طبق داک پروژه
    private int level;
    private int xp;
    private int xpToNextLevel;

    public Player(String name, int hp, int mp, Weapon weapon, Armor armor) {
        this.name = name;
        this.hp = hp;
        this.mp = mp;
        this.maxHP = hp;
        this.maxMP = mp;
        this.weapon = weapon;
        this.armor = armor;

        // مقادیر شروع پیش‌فرض بازیکن
        this.level = 1;
        this.xp = 0;
        this.xpToNextLevel = 100; // برای لول‌آپ به ۱۰۰ امتیاز تجربه نیاز است
    }

    // متد افزایش تجربه و بررسی لول‌آپ خودکار
    public void gainXp(int amount) {
        this.xp += amount;
        System.out.println("✨ شما " + amount + " امتیاز تجربه (XP) کسب کردید!");
        if (this.xp >= this.xpToNextLevel) {
            levelUp();
        }
    }

    // لول‌آپ خودکار و ارتقای MaxHP و MaxMP طبق الزامات داک
    private void levelUp() {
        this.xp -= this.xpToNextLevel;
        this.level++;
        this.maxHP += 20; // افزایش سقف خون با هر لول‌آپ
        this.maxMP += 10; // افزایش سقف مانا با هر لول‌آپ
        this.xpToNextLevel = (int) (this.xpToNextLevel * 1.5); // سخت‌تر شدن لول بعدی

        // پر شدن کامل وضعیت بازیکن بعد از لول‌آپ
        this.hp = this.maxHP;
        this.mp = this.maxMP;

        System.out.println("⚔️ تبریک! شما به سطح (Level) " + this.level + " ارتقا یافتید!");
        System.out.println("❤️ سقف خون شما به " + this.maxHP + " و مانا به " + this.maxMP + " افزایش یافت!");
    }

    // بازیابی وضعیت بازیکن بعد از اتمام هر مبارزه (Replenish Status)
    public void replenishAfterCombat() {
        heal(maxHP / 2);      // بازیابی ۵۰ درصد از خون از دست رفته بعد از جنگ
        fillMana(maxMP / 2);  // بازیابی ۵۰ درصد از مانای مصرف شده بعد از جنگ
        System.out.println("🔄 وضعیت شما پس از مبارزه کمی بازیابی شد.");
    }

    @Override
    public void attack(Entity target) {
        // حرکت اول: Light Attack (حمله معمولی بدون مانا کاست)
        if (weapon != null && target != null) {
            target.takeDamage(weapon.getDamage());
        }
    }

    @Override
    public void takeDamage(int damage) {
        int effectiveDamage = damage - (armor != null ? armor.getDefense() : 0);
        if (effectiveDamage < 0) {
            effectiveDamage = 0;
        }
        hp -= effectiveDamage;
        if (hp < 0) {
            hp = 0;
        }
    }

    @Override
    public void heal(int health) {
        hp += health;
        if (hp > maxHP) {
            hp = maxHP;
        }
    }

    @Override
    public void fillMana(int mana) {
        mp += mana;
        if (mp > maxMP) {
            mp = maxMP;
        }
    }

    // بررسی زنده بودن بازیکن
    @Override
    public boolean isAlive() {
        return this.hp > 0;
    }

    // متد کم کردن مانا هنگام استفاده از قابلیت‌ها
    public boolean useMana(int amount) {
        if (this.mp >= amount) {
            this.mp -= amount;
            return true;
        }
        System.out.println("❌ مانای کافی برای این حرکت ندارید!");
        return false;
    }

    // گترها و سترهای ضروری
    public String getName() { return name; }
    public int getHp() { return hp; }
    @Override public int getMaxHP() { return maxHP; }
    public int getMp() { return mp; }
    @Override public int getMaxMP() { return maxMP; }
    public int getLevel() { return level; }
    public Weapon getWeapon() { return weapon; }
    public Armor getArmor() { return armor; }
}