#pragma once
#include <string>
#include <vector>
#include <memory>

// 前向声明
class ICharacter;
class ISkill;

/**
 * @brief 技能接口 (抽象基类)
 * 
 * 技术点: 多态 (Polymorphism) - 纯虚函数
 */
class ISkill {
protected:
    std::string m_name;        // 技能名称
    std::string m_description; // 技能描述
    int m_manaCost;           // 消耗魔法值
    int m_cooldown;           // 冷却时间

public:
    virtual ~ISkill() {}

    /**
     * @brief 执行技能
     * @param caster 施法者
     * @param target 目标
     * @return std::string 战斗日志描述
     */
    virtual std::string execute(ICharacter& caster, ICharacter& target) = 0;

    /**
     * @brief 获取技能名称
     */
    virtual std::string getName() const { return m_name; }

    /**
     * @brief 获取技能描述
     */
    virtual std::string getDescription() const { return m_description; }

    /**
     * @brief 获取魔法消耗
     */
    virtual int getManaCost() const { return m_manaCost; }

    /**
     * @brief 获取冷却时间
     */
    virtual int getCooldown() const { return m_cooldown; }
};

/**
 * @brief 角色接口 (抽象基类)
 * 
 * 技术点: 多态 (Polymorphism) - 纯虚函数、虚析构函数
 */
class ICharacter {
protected:
    std::string m_name;                              // 角色名称
    std::string m_className;                         // 职业名称
    int m_level;                                     // 等级
    int m_hp;                                        // 当前生命值
    int m_maxHp;                                     // 最大生命值
    int m_mp;                                        // 当前魔法值
    int m_maxMp;                                     // 最大魔法值
    int m_attack;                                    // 攻击力
    int m_defense;                                   // 防御力
    int m_speed;                                     // 速度 (决定行动顺序)
    std::vector<std::shared_ptr<ISkill>> m_skills;  // 技能列表 (STL)

public:
    /**
     * @brief 虚析构函数 (必须)
     */
    virtual ~ICharacter() {}

    // === Getters ===
    virtual std::string getName() const { return m_name; }
    virtual std::string getClassName() const { return m_className; }
    virtual int getLevel() const { return m_level; }
    virtual int getHp() const { return m_hp; }
    virtual int getMaxHp() const { return m_maxHp; }
    virtual int getMp() const { return m_mp; }
    virtual int getMaxMp() const { return m_maxMp; }
    virtual int getAttack() const { return m_attack; }
    virtual int getDefense() const { return m_defense; }
    virtual int getSpeed() const { return m_speed; }

    /**
     * @brief 检查角色是否存活
     */
    virtual bool isAlive() const { return m_hp > 0; }

    /**
     * @brief 获取指定名称的技能
     * @param skillName 技能名称
     * @return ISkill* 技能指针，如果不存在返回 nullptr
     */
    virtual ISkill* getSkill(const std::string& skillName);

    /**
     * @brief 获取所有技能
     */
    virtual const std::vector<std::shared_ptr<ISkill>>& getSkills() const { 
        return m_skills; 
    }

    /**
     * @brief 受到伤害 (纯虚函数 - 必须在派生类中实现)
     * @param damage 伤害值
     */
    virtual void takeDamage(int damage) = 0;

    /**
     * @brief 治疗 (纯虚函数 - 必须在派生类中实现)
     * @param amount 治疗量
     */
    virtual void heal(int amount) = 0;

    /**
     * @brief 消耗魔法值
     * @param amount 消耗量
     * @return bool 是否成功消耗
     */
    virtual bool consumeMana(int amount);

    /**
     * @brief 恢复魔法值
     * @param amount 恢复量
     */
    virtual void restoreMana(int amount);

    /**
     * @brief 获取角色状态字符串
     */
    virtual std::string getStatus() const;

    /**
     * @brief 添加技能
     */
    virtual void addSkill(std::shared_ptr<ISkill> skill);
};
