#ifndef _2EASY4ME_PLAYER_H_
#define _2EASY4ME_PLAYER_H_

#include "character.hpp"

#include "string.h"

class Player : public Character
{
  protected:
    int xp;
    int level;

  public:
    Player(char *name)
        : Character(name)
    {
        this->xp = 0;
        this->level = 1;
    }

    Player(char *name, int hp, int att, int def, int level, int xp)
        : Character(name, hp, att, def)
    {
        this->xp = xp;
        this->level = level;
    }

    bool checkLevelup()
    {
        return xp > (level * level);
    }

    bool levelUp(int stat)
    {
        switch (stat)
        {
        case 1:
            hp += 10;
            break;
        case 2:
            att += 2;
            break;
        case 3:
            def += 1;
            break;
        }

        xp -= level * level;
    }

    int generateCode(char *dst)
    {
        return sprintf(dst,
                       "PlayerName:%15s;PlayerHp:%d;PlayerAtt:%d;PlayerDef:%d;PlayerLvl:%d;PlayerExp:%d;",
                       this->name, this->hp, this->att, this->def, this->level, this->xp);
    }

    Player *loadCode(char *dst)
    {
        char name[16];
        int hp;
        int att;
        int def;
        int lvl;
        int exp;

        int result = sscanf(dst,
                            "PlayerName:%15s;PlayerAtt:%d;PlayerDef:%d;PlayerLvl:%d;PlayerExp:%d;",
                            name, &hp, &att, &def, &lvl, &exp);

        if (result == 5)
        {
            return new Player(name, hp, att, def, lvl, exp);
        }
        else
        {
            return nullptr;
        }
    }
};

#endif